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扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。