hdkさんに「特権レベル0だけで回ってるときはESPが切り替わっていない」と指摘されたので、ESPを書き換えるように変更したつもりだったけど、うまくいっていない。ESPを書き換えるタイミングが違うのかな?
ESPを書き換えるNASMのソース
asmSetESP: _asmSetESP: MOV ESP, [ESP + 4] RET
タイマ割り込みのときに呼び出される関数
void timerHandler(){ int* stack; asm volatile("mov %%ebp, %0 \n" : "=g"(stack)); g_TimerManager->tick(); taskData[currentTask].eax = stack[11]; taskData[currentTask].ecx = stack[10]; taskData[currentTask].edx = stack[9]; taskData[currentTask].ebx = stack[8]; taskData[currentTask].esp2 = stack[7]; taskData[currentTask].ebp = stack[6]; taskData[currentTask].esi = stack[5]; taskData[currentTask].edi = stack[4]; taskData[currentTask].ds = stack[3]; taskData[currentTask].es = stack[2]; taskData[currentTask].cs = stack[13]; taskData[currentTask].eflags = stack[14]; if((taskData[currentTask].cs & 3) > 0) taskData[currentTask].esp = stack[15]; else taskData[currentTask].esp = stack[7]; taskData[currentTask].eip = stack[12]; currentTask = (currentTask + 1) % taskCount; stack[12] = taskData[currentTask].eip; stack[11] = taskData[currentTask].eax; stack[10] = taskData[currentTask].ecx; stack[9] = taskData[currentTask].edx; stack[8] = taskData[currentTask].ebx; stack[7] = taskData[currentTask].esp2; stack[6] = taskData[currentTask].ebp; stack[5] = taskData[currentTask].esi; stack[4] = taskData[currentTask].edi; stack[3] = taskData[currentTask].ds; stack[2] = taskData[currentTask].es; stack[13] = taskData[currentTask].cs; stack[14] = taskData[currentTask].eflags; if((taskData[currentTask].cs & 3) > 0){ stack[15] = taskData[currentTask].esp; stack[16] = taskData[currentTask].ss; }else{ asmSetESP(taskData[currentTask].esp); } IO::writePort8(PIC0_OCW2, 0x60); return; }