X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Farch%2Fx86%2Fproc.c;h=2c595168738fdb5a5f49deb8adc155aeff2297cd;hb=74ea5e7e82ed3a4f7fa981907177cf55b9b88f07;hp=8b05488b9878a7384899f2eadb3097886696a7ce;hpb=8f870b810f0416ae051e6a3785a5e74bdd3cb513;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/arch/x86/proc.c b/KernelLand/Kernel/arch/x86/proc.c index 8b05488b..2c595168 100644 --- a/KernelLand/Kernel/arch/x86/proc.c +++ b/KernelLand/Kernel/arch/x86/proc.c @@ -50,6 +50,7 @@ extern char scheduler_return[]; // Return address in SchedulerBase extern char IRQCommon[]; // Common IRQ handler code extern char IRQCommon_handled[]; // IRQCommon call return location extern char GetEIP_Sched_ret[]; // GetEIP call return location +extern void Timer_CallTimers(void); // === PROTOTYPES === //void ArchThreads_Init(void); @@ -67,6 +68,7 @@ void Proc_ChangeStack(void); Uint Proc_MakeUserStack(void); //void Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char **EnvP, int DataSize); void Proc_StartProcess(Uint16 SS, Uint Stack, Uint Flags, Uint16 CS, Uint IP) NORETURN; +void Proc_CallUser(Uint32 UserIP, Uint32 UserSP, const void *StackData, size_t StackDataLen); //void Proc_CallFaultHandler(tThread *Thread); //void Proc_DumpThreadCPUState(tThread *Thread); void Proc_Scheduler(int CPU); @@ -633,6 +635,34 @@ void Proc_StartProcess(Uint16 SS, Uint Stack, Uint Flags, Uint16 CS, Uint IP) for(;;); } +void Proc_CallUser(Uint32 UserIP, Uint32 UserSP, const void *StackData, size_t StackDataLen) +{ + if( UserSP < StackDataLen ) + return ; + if( !CheckMem( (void*)(UserSP - StackDataLen), StackDataLen ) ) + return ; + memcpy( (void*)(UserSP - StackDataLen), StackData, StackDataLen ); + + __asm__ __volatile__ ( + "mov $0x23,%%ax;\n\t" + "mov %%ax, %%ds;\n\t" + "mov %%ax, %%es;\n\t" + "mov %%ax, %%fs;\n\t" + "mov %%ax, %%gs;\n\t" + "push $0x23;\n\t" + "push %1;\n\t" + "push $0x202;\n\t" + "push $0x1B;\n\t" + "push %0;\n\t" + "iret;\n\t" + : + : "r" (UserIP), "r" (UserSP - StackDataLen) + : "eax" + ); + for(;;) + ; +} + /** * \brief Calls a signal handler in user mode * \note Used for signals @@ -684,7 +714,7 @@ void Proc_DumpThreadCPUState(tThread *Thread) return ; } - Log(" at %04x:%08x", regs->cs, regs->eip); + Log(" at %04x:%08x [EAX:%x]", regs->cs, regs->eip, regs->eax); return ; }