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/x86_64 - More bugfixes, I suspect the PMM code is borken
[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
e3d7e90
..
3594552
100644
(file)
--- a/
Kernel/arch/x86_64/proc.c
+++ b/
Kernel/arch/x86_64/proc.c
@@
-39,9
+39,11
@@
extern Uint GetRIP(void); // start.asm
extern Uint SaveState(Uint *RSP, Uint *Regs);
extern Uint Proc_CloneInt(Uint *RSP, Uint *CR3);
extern void NewTaskHeader(void); // Actually takes cdecl args
extern Uint SaveState(Uint *RSP, Uint *Regs);
extern Uint Proc_CloneInt(Uint *RSP, Uint *CR3);
extern void NewTaskHeader(void); // Actually takes cdecl args
+extern void Proc_InitialiseSSE(void);
+extern void Proc_SaveSSE(Uint DestPtr);
+extern void Proc_DisableSSE(void);
extern Uint64 gInitialPML4[512]; // start.asm
extern Uint64 gInitialPML4[512]; // start.asm
-extern tShortSpinlock glThreadListLock;
extern int giNumCPUs;
extern int giNextTID;
extern int giTotalTickets;
extern int giNumCPUs;
extern int giNextTID;
extern int giTotalTickets;
@@
-61,7
+63,7
@@
void MP_SendIPI(Uint8 APICID, int Vector, int DeliveryMode);
void Proc_IdleTask(void *unused);
//void Proc_Start(void);
//tThread *Proc_GetCurThread(void);
void Proc_IdleTask(void *unused);
//void Proc_Start(void);
//tThread *Proc_GetCurThread(void);
-
int
Proc_NewKThread(void (*Fcn)(void*), void *Data);
+
// int
Proc_NewKThread(void (*Fcn)(void*), void *Data);
// int Proc_Clone(Uint *Err, Uint Flags);
// int Proc_SpawnWorker(void);
Uint Proc_MakeUserStack(void);
// int Proc_Clone(Uint *Err, Uint Flags);
// int Proc_SpawnWorker(void);
Uint Proc_MakeUserStack(void);
@@
-323,6
+325,8
@@
void ArchThreads_Init(void)
Warning("Oh, hell, Unable to allocate PPD for Thread#0");
}
Warning("Oh, hell, Unable to allocate PPD for Thread#0");
}
+ Proc_InitialiseSSE();
+
Log_Log("Proc", "Multithreading initialised");
}
Log_Log("Proc", "Multithreading initialised");
}
@@
-429,6
+433,14
@@
tThread *Proc_GetCurThread(void)
#endif
}
#endif
}
+/*
+ *
+ */
+void Proc_ClearThread(tThread *Thread)
+{
+ Log_Warning("Proc", "TODO: Nuke address space etc");
+}
+
/**
* \brief Create a new kernel thread
*/
/**
* \brief Create a new kernel thread
*/
@@
-460,6
+472,7
@@
int Proc_NewKThread(void (*Fcn)(void*), void *Data)
newThread->SavedState.RSP = rsp;
newThread->SavedState.RIP = (Uint)&NewTaskHeader;
newThread->SavedState.RSP = rsp;
newThread->SavedState.RIP = (Uint)&NewTaskHeader;
+ newThread->SavedState.SSE = NULL;
// Log("New (KThread) %p, rsp = %p\n", newThread->SavedState.RIP, newThread->SavedState.RSP);
// MAGIC_BREAK();
// Log("New (KThread) %p, rsp = %p\n", newThread->SavedState.RIP, newThread->SavedState.RSP);
// MAGIC_BREAK();
@@
-492,6
+505,7
@@
int Proc_Clone(Uint Flags)
if(rip == 0) return 0; // Child
newThread->KernelStack = cur->KernelStack;
newThread->SavedState.RIP = rip;
if(rip == 0) return 0; // Child
newThread->KernelStack = cur->KernelStack;
newThread->SavedState.RIP = rip;
+ newThread->SavedState.SSE = NULL;
// DEBUG
#if 0
// DEBUG
#if 0
@@
-543,6
+557,7
@@
int Proc_SpawnWorker(void (*Fcn)(void*), void *Data)
new->SavedState.RSP = new->KernelStack - sizeof(stack_contents);
new->SavedState.RIP = (Uint)&NewTaskHeader;
new->SavedState.RSP = new->KernelStack - sizeof(stack_contents);
new->SavedState.RIP = (Uint)&NewTaskHeader;
+ new->SavedState.SSE = NULL;
// Log("New (Worker) %p, rsp = %p\n", new->SavedState.RIP, new->SavedState.RSP);
// Log("New (Worker) %p, rsp = %p\n", new->SavedState.RIP, new->SavedState.RSP);
@@
-591,13
+606,11
@@
Uint Proc_MakeUserStack(void)
return base + USER_STACK_SZ;
}
return base + USER_STACK_SZ;
}
-
void Proc_StartUser(Uint Entrypoint, Uint Base, int ArgC, char **ArgV, int DataSize)
{
Uint *stack;
void Proc_StartUser(Uint Entrypoint, Uint Base, int ArgC, char **ArgV, int DataSize)
{
Uint *stack;
- char **envp;
int i;
int i;
-
Uint delta
;
+
char **envp = NULL
;
Uint16 ss, cs;
Uint16 ss, cs;
@@
-608,17
+621,18
@@
void Proc_StartUser(Uint Entrypoint, Uint Base, int ArgC, char **ArgV, int DataS
Threads_Exit(0, -1);
}
stack -= (DataSize+7)/8;
Threads_Exit(0, -1);
}
stack -= (DataSize+7)/8;
- LOG("stack = 0x%x", stack);
- Log("stack = %p, DataSize = %i", stack, DataSize);
memcpy( stack, ArgV, DataSize );
free(ArgV);
// Adjust Arguments and environment
memcpy( stack, ArgV, DataSize );
free(ArgV);
// Adjust Arguments and environment
- delta = (Uint)stack - (Uint)ArgV;
- ArgV = (char**)stack;
- for( i = 0; ArgV[i]; i++ ) ArgV[i] += delta;
- envp = &ArgV[i+1];
- for( i = 0; envp[i]; i++ ) envp[i] += delta;
+ if(DataSize)
+ {
+ Uint delta = (Uint)stack - (Uint)ArgV;
+ ArgV = (char**)stack;
+ for( i = 0; ArgV[i]; i++ ) ArgV[i] += delta;
+ envp = &ArgV[i+1];
+ for( i = 0; envp[i]; i++ ) envp[i] += delta;
+ }
// User Mode Segments
// 0x2B = 64-bit
// User Mode Segments
// 0x2B = 64-bit
@@
-743,6
+757,14
@@
void Proc_Reschedule(void)
gTSSs[cpu].RSP0 = nextthread->KernelStack-4;
__asm__ __volatile__ ("mov %0, %%db0" : : "r" (nextthread));
gTSSs[cpu].RSP0 = nextthread->KernelStack-4;
__asm__ __volatile__ ("mov %0, %%db0" : : "r" (nextthread));
+ // Save FPU/MMX/XMM/SSE state
+ if( curthread->SavedState.SSE )
+ {
+ Proc_SaveSSE( ((Uint)curthread->SavedState.SSE + 0xF) & ~0xF );
+ curthread->SavedState.bSSEModified = 0;
+ Proc_DisableSSE();
+ }
+
SwitchTasks(
nextthread->SavedState.RSP, &curthread->SavedState.RSP,
nextthread->SavedState.RIP, &curthread->SavedState.RIP,
SwitchTasks(
nextthread->SavedState.RSP, &curthread->SavedState.RSP,
nextthread->SavedState.RIP, &curthread->SavedState.RIP,
UCC
git Repository :: git.ucc.asn.au