+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(;;)
+ ;
+}
+