call branched_update_notify
jmp (адрес_бранча)
jmp original_jump_after_my_code
int 3 # такое количество раз чтобы оно не работало
// 0-7 works
// 8 does not
// 12 does not
// 15 does not
// 16 does not
// 20 does not
// 100 does not
// 125 does not
// 135 does not
// 136 does work
// 150 does work
// 200 does work
// (244) 8+128+108 does work
// (263) 8+128+127 does work
// (264) 8+128+128 does not
// (363) 8+128+128+100 does not
// (391) 8+128+128+127 does not
// (392) 8+128+128+128 does work
// (492) 8+128+128+128+100 does work
void function_cc x86_emit_translation_exit(p_gba_u8 *p_translation_ptr)
{
gba_u8* translation_ptr = *p_translation_ptr;
int i;
// 904 works
// 903 does not
for(i=0;i<904; i++)
{
x86_emit_byte(0x90);
}
*p_translation_ptr = translation_ptr;
}
gba_u8* translation_ptr = *p_translation_ptr;
int i;
for(i=0;i<1000; i++)
{
// если первая строчка, работает
//x86_emit_byte(0x90);
// а вот если вторая, то не работает
asm("nop");
}
x86_emit_byte(0x90);
x86_emit_byte(0x90);
.....
x86_emit_byte(0x90);
0xb695a018 int3 # мой первый sigtrap для попадания сюда вообще
0xb695a019 jns 0xb695a029 # какая-то оригинальная проверка, прыгает на "после-апдейта"
0xb695a01f mov $0x80000c0,%eax
0xb695a024 call 0x8126eab <update_x86>
0xb695a029 jmp 0xb695a036 # это уже код который я эмитил, прыжок на "после-моего-кода"
0xb695a02e int3 # много много 0хСС для проверки не попадает ли сюда кто-то случайно, а с помощью джампа до этого
0xb695a02f int3 # просто так валидно сюда не попадеш
0xb695a030 int3
0xb695a031 int3
0xb695a032 int3
0xb695a033 int3
0xb695a034 int3
0xb695a035 int3
0xb695a036 jmp 0xb695a043 # снова оригинальный джамп, тот который изначально был "после-апдейта"
0xb695a03b rolb $0x0,(%eax) # обратите внимание на адрес в джампе строчкой выше (0xb695a043)
0xb695a03e or %al,(%eax)
0xb695a040 add %al,(%eax)
0xb695a042 add %bh,0x12(%eax)
0xb695a048 call 0x81b21a7 <execute_mov> # джамп который меня заинтересовал, оригинальный должен прыгнуть сюда
0xb695a04d mov %eax,(%ebx)
Странность, адрес в джампе (помним, он оригинальный) 0xb695a043, а инструкции именно по этому адресу нету. Ну или может быть между джампом и адресом куда прыгаем мусор, который конфузит дизасмер еклипса. Пойду посмотрю в gdb