Kernel/x86 - Included EAX in user state dump
[tpg/acess2.git] / KernelLand / Kernel / arch / x86 / proc.c
index 8b05488..2c59516 100644 (file)
@@ -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 ;
        }
        

UCC git Repository :: git.ucc.asn.au