トップ «前の日記(2007-05-26) 最新 次の日記(2007-05-28)» 編集

はじめてのにき

ここの位置付け

2004|11|
2005|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|

ToDo:


2007-05-27

_ おもしろいな…

http://d.hatena.ne.jp/odz/20070526/1180193599

(01:49)

_ libcont

実装眺めてておやと思った。

   // 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)

お名前:
E-mail:
コメント:
人生、宇宙、すべての答え
本日のリンク元

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
1.shinh(2014-05-24 01:59) 2.Seasons(2014-05-24 01:59) 3.niha(2014-05-24 01:59)
search / home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h