- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
void __attribute__ ((naked)) c8_handler_i() {
asm volatile (
"push %%ebp \n\
mov %%esp, %%ebp \n\
sub $20, %%esp \n\
mov %%eax, -4(%%ebp) \n\
mov %%ebx, -8(%%ebp) \n\
mov %%edx, -12(%%ebp) \n\
mov %[tasks], %%ebx \n\
mov %[cur_task], %%eax \n\
mov %[t_sz], %%edx \n\
mov (%%eax), %%eax \n\
mul %%edx \n\
add %%eax, %%ebx \n\
mov -4(%%ebp), %%eax \n\
mov %%eax, (%%ebx) \n\
mov -8(%%ebp), %%eax \n\
mov %%eax, 4(%%ebx) \n\
mov %%ecx, 8(%%ebx) \n\
mov -12(%%ebp), %%eax \n\
mov %%eax, 12(%%ebx) \n\
mov %%esi, 16(%%ebx) \n\
mov %%edi, 20(%%ebx) \n\
mov %%ebp, 24(%%ebx) \n\
addl $4, 24(%%ebx) \n\
mov (%%ebp), %%eax \n\
mov %%eax, 28(%%ebx) \n\
mov -4(%%ebp), %%eax \n\
mov -8(%%ebp), %%ebx \n\
mov -12(%%ebp), %%edx \n\
add $20, %%esp \n\
pop %%ebp \n\
iret"
:: [tasks] "i" (tasks), [cur_task] "i" (&cur_task),
[t_sz] "i" (sizeof(task)), [t_eip] "i" (offsetof(task, eip)),
[t_ebx] "i" (offsetof(reg_values, ebx))
);
}