git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Kernel - Changed Threads_CloneTCB (removed Err ptr)
[tpg/acess2.git]
/
Kernel
/
arch
/
x86_64
/
proc.c
diff --git
a/Kernel/arch/x86_64/proc.c
b/Kernel/arch/x86_64/proc.c
index
de25c45
..
ce6ebbd
100644
(file)
--- a/
Kernel/arch/x86_64/proc.c
+++ b/
Kernel/arch/x86_64/proc.c
@@
-48,7
+48,7
@@
extern int giTotalTickets;
extern int giNumActiveThreads;
extern tThread gThreadZero;
extern void Threads_Dump(void);
extern int giNumActiveThreads;
extern tThread gThreadZero;
extern void Threads_Dump(void);
-extern void Proc_ReturnToUser(
void
);
+extern void Proc_ReturnToUser(
tVAddr Handler, tVAddr KStackTop, int Argument
);
extern void Time_UpdateTimestamp(void);
extern void SwitchTasks(Uint NewSP, Uint *OldSP, Uint NewIP, Uint *OldIO, Uint CR3);
extern void Time_UpdateTimestamp(void);
extern void SwitchTasks(Uint NewSP, Uint *OldSP, Uint NewIP, Uint *OldIO, Uint CR3);
@@
-413,7
+413,7
@@
void Proc_Start(void)
__asm__ __volatile__("sti");
#endif
MM_FinishVirtualInit();
__asm__ __volatile__("sti");
#endif
MM_FinishVirtualInit();
- Log
(
"Multithreading started");
+ Log
_Log("Proc",
"Multithreading started");
}
/**
}
/**
@@
-429,13
+429,16
@@
tThread *Proc_GetCurThread(void)
#endif
}
#endif
}
+/**
+ * \brief Create a new kernel thread
+ */
int Proc_NewKThread(void (*Fcn)(void*), void *Data)
{
Uint rsp;
tThread *newThread, *cur;
cur = Proc_GetCurThread();
int Proc_NewKThread(void (*Fcn)(void*), void *Data)
{
Uint rsp;
tThread *newThread, *cur;
cur = Proc_GetCurThread();
- newThread = Threads_CloneTCB(
NULL,
0);
+ newThread = Threads_CloneTCB(0);
if(!newThread) return -1;
// Set CR3
if(!newThread) return -1;
// Set CR3
@@
-481,26
+484,24
@@
int Proc_Clone(Uint Flags)
}
// Create new TCB
}
// Create new TCB
- newThread = Threads_CloneTCB(
NULL,
Flags);
+ newThread = Threads_CloneTCB(Flags);
if(!newThread) return -1;
// Save core machine state
rip = Proc_CloneInt(&newThread->SavedState.RSP, &newThread->MemState.CR3);
if(!newThread) return -1;
// Save core machine state
rip = Proc_CloneInt(&newThread->SavedState.RSP, &newThread->MemState.CR3);
- if(rip == 0) {
- outb(0x20, 0x20); // ACK Timer and return as child
- __asm__ __volatile__ ("sti");
- return 0;
- }
+ if(rip == 0) return 0; // Child
newThread->KernelStack = cur->KernelStack;
newThread->SavedState.RIP = rip;
newThread->KernelStack = cur->KernelStack;
newThread->SavedState.RIP = rip;
- // DEBUG
-// Log("New (Clone) %p, rsp = %p, cr3 = %p", rip, newThread->SavedState.RSP, newThread->MemState.CR3);
+ // DEBUG
+ #if 0
+ Log("New (Clone) %p, rsp = %p, cr3 = %p", rip, newThread->SavedState.RSP, newThread->MemState.CR3);
{
Uint cr3;
__asm__ __volatile__ ("mov %%cr3, %0" : "=r" (cr3));
Log("Current CR3 = 0x%x, PADDR(RSP) = 0x%x", cr3, MM_GetPhysAddr(newThread->SavedState.RSP));
}
{
Uint cr3;
__asm__ __volatile__ ("mov %%cr3, %0" : "=r" (cr3));
Log("Current CR3 = 0x%x, PADDR(RSP) = 0x%x", cr3, MM_GetPhysAddr(newThread->SavedState.RSP));
}
+ #endif
// /DEBUG
// Lock list and add to active
// /DEBUG
// Lock list and add to active
@@
-553,7
+554,6
@@
int Proc_SpawnWorker(void (*Fcn)(void*), void *Data)
}
/**
}
/**
- * \fn Uint Proc_MakeUserStack(void)
* \brief Creates a new user stack
*/
Uint Proc_MakeUserStack(void)
* \brief Creates a new user stack
*/
Uint Proc_MakeUserStack(void)
@@
-563,15
+563,22
@@
Uint Proc_MakeUserStack(void)
// Check Prospective Space
for( i = USER_STACK_SZ >> 12; i--; )
// Check Prospective Space
for( i = USER_STACK_SZ >> 12; i--; )
+ {
if( MM_GetPhysAddr( base + (i<<12) ) != 0 )
break;
if( MM_GetPhysAddr( base + (i<<12) ) != 0 )
break;
+ }
if(i != -1) return 0;
// Allocate Stack - Allocate incrementally to clean up MM_Dump output
if(i != -1) return 0;
// Allocate Stack - Allocate incrementally to clean up MM_Dump output
- for( i = 0; i < USER_STACK_SZ/0x1000; i++ )
+ for( i = 0; i < (USER_STACK_SZ-USER_STACK_PREALLOC)/0x1000; i++ )
+ {
+ MM_AllocateZero( base + (i<<12) );
+ }
+ for( ; i < USER_STACK_SZ/0x1000; i++ )
{
{
- if( !MM_Allocate( base + (i<<12) ) )
+ tPAddr alloc = MM_Allocate( base + (i<<12) );
+ if( !alloc )
{
// Error
Log_Error("Proc", "Unable to allocate user stack (%i pages requested)", USER_STACK_SZ/0x1000);
{
// Error
Log_Error("Proc", "Unable to allocate user stack (%i pages requested)", USER_STACK_SZ/0x1000);
@@
-631,8
+638,8
@@
void Proc_StartProcess(Uint16 SS, Uint Stack, Uint Flags, Uint16 CS, Uint IP)
CS, SS);
Threads_Exit(0, -1);
}
CS, SS);
Threads_Exit(0, -1);
}
- Log("Proc_StartProcess: (SS=%x, Stack=%p, Flags=%x, CS=%x, IP=%p)",
-
SS, Stack, Flags, CS, IP
);
+// Log("Proc_StartProcess: (SS=%x, Stack=%p, Flags=%x, CS=%x, IP=%p)", SS, Stack, Flags, CS, IP);
+
// MM_DumpTables(0, USER_MAX
);
if(CS == 0x1B)
{
// 32-bit return
if(CS == 0x1B)
{
// 32-bit return
@@
-691,9
+698,8
@@
int Proc_Demote(Uint *Err, int Dest, tRegs *Regs)
*/
void Proc_CallFaultHandler(tThread *Thread)
{
*/
void Proc_CallFaultHandler(tThread *Thread)
{
- // Rewinds the stack and calls the user function
// Never returns
// Never returns
-
__asm__ __volatile__ ("mov %0, %%rbp;\n\tcall Proc_ReturnToUser" :: "r"(Thread->FaultHandler)
);
+
Proc_ReturnToUser(Thread->FaultHandler, Thread->KernelStack, Thread->CurFaultNum
);
for(;;);
}
for(;;);
}
@@
-721,12
+727,12
@@
void Proc_Reschedule(void)
return ;
#if DEBUG_TRACE_SWITCH
return ;
#if DEBUG_TRACE_SWITCH
- LogF("\nSwitching to task %i, CR3 = 0x%x, RIP = %p, RSP = %p, KStack = %p\n",
- nextthread->TID,
+ LogF("\nSwitching to task CR3 = 0x%x, RIP = %p, RSP = %p - %i (%s)\n",
nextthread->MemState.CR3,
nextthread->SavedState.RIP,
nextthread->SavedState.RSP,
nextthread->MemState.CR3,
nextthread->SavedState.RIP,
nextthread->SavedState.RSP,
- nextthread->KernelStack
+ nextthread->TID,
+ nextthread->ThreadName
);
#endif
);
#endif
UCC
git Repository :: git.ucc.asn.au