inittss.c

来自「深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心」· C语言 代码 · 共 69 行

C
69
字号
#include <eframe.h>
//#include <ethread.h> 
//#include <equeue.h>

#include <epcore.h>
extern int  __ebp;  
// put it to arch
void InitThreadTSS(
     LPTHREAD lpThread,
     LPTHREAD_START_ROUTINE lpStartAdr,
     LPBYTE lpStack,
     LPVOID lpParameter )
{

#ifdef EML_DOS
//    WORD * p;
  //   p = (WORD*)(lpStack);// + dwSize);
    // *((DWORD*)(p-4)) = (DWORD)ExitThread;
     //*(p-1) = 0;
     //lpThread->tss.ip = (WORD)lpStartAdr;
     //lpThread->tss.cs = (WORD)((DWORD)lpStartAdr>>16);
     //lpThread->tss.sp = (WORD)((DWORD)(p-4));
     //lpThread->tss.ss = (WORD)(((DWORD)(p-4))>>16);
#endif

#ifdef EML_WIN32
     int * p;
     p = (int*)(lpStack);// + dwSize);     
	 *(p) = (DWORD)lpParameter;
	 *(p-1) = *( (int*)__ebp+1 );  // return address
//	 *(p-2) = (DWORD)lpStartAdr;
//	 *(p-3) = *( (int*)__ebp );  // ebp
     lpThread->tss.eip = (DWORD)lpStartAdr;
     lpThread->tss.ebp = lpThread->tss.esp = (DWORD)(p-1);

     {
     
         TSS * p = &lpThread->tss;
         _asm
         {
             mov eax, p
             mov WORD PTR [eax+REG_SS], ss
             mov WORD PTR [eax+REG_CS], cs
         }
     }
#endif

}

DWORD SetThreadIP( LPTHREAD lpThread, DWORD dwIP )
{
    DWORD dwOld = lpThread->tss.eip;
	lpThread->tss.eip = dwIP;
	return dwOld;
}


#define DEBUG_CallUserStartupCode 1
int CallUserStartupCode( LPVOID lpIP, LPVOID uParam )
{
	return ((LPTHREAD_START_ROUTINE)lpIP)( uParam );
}

UINT GetCPUMode( DWORD dwMode )
{
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?