ToDo:
実装眺めてておやと思った。
// don't over write your current stack
uint32_t next_stack = (uint32_t)stack_pointer - (c->stack_size + 1000);
for (i = 0; i < c->stack_size / 4; i++)
{
uint32_t* p = (uint32_t*)c->stack;
if (prev_stack <= p[i] && p[i] <= cont_stack_bottom)
{
p[i] -= (prev_stack - next_stack);
}
}
// eax ebx ecx edx esi edi
for (i = 0; i < 5; i++)
{
if (prev_stack <= c->registers[i] && c->registers[i] <= cont_stack_bottom)
{
c->registers[i] -= (c->registers[i] - next_stack);
}
}
なんか restore の後はスタックの位置変わるってことか。
printf("func1 : %d %p\n", counter, &counter);
int ret = func1(counter + 1);
printf("func1 : %d %p\n", counter, &counter);
とかに変えてみるとたしかに変わってる。
うーんどうせ save してるんだから 元の位置覚えておいてそこに書き戻したらダメなんだろうか。
(02:15)
static myjmp_buf registers;
static int ret;
void cont_restore(Cont* c, int r)
{
uint32_t i;
uint32_t prev_stack = c->registers[7];
register void* stack_pointer asm ("%esp");
// don't over write your current stack
//uint32_t next_stack = (uint32_t)stack_pointer - (c->stack_size + 1000);
uint32_t next_stack = (uint32_t)c->stack_start;
uint32_t diff = c->registers[6] - c->registers[7];
c->registers[7] = next_stack;
c->registers[6] = next_stack + diff;
memcpy(registers, c->registers, sizeof(registers));
stack_expander((c->stack_size + 1000) / 10);
ret = r;
//memcpy((uint8_t*)next_stack, c->stack, c->stack_size);
__asm__(".loop:\n"
"movb (%0), %%eax;\n"
"movb %%eax, (%1);\n"
"inc %0;\n"
"inc %1;\n"
"cmp %1, %2;\n"
"jne .loop;\n"
::"r"(next_stack), "r"(c->stack), "r"(c->stack+c->stack_size)
:"%eax");
mylongjmp(registers, ret);
}
(02:44)
| 前 | 2007年 5月 |
次 | ||||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | 31 | ||
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。