Hi, > I was thinking a few instructions to test if calll worked would be > sufficient to catch the x86emu case - something like: > > pushl $0xffffffff > calll 1f > 1:popl %eax > cmpl %eax, $1b > jne running_on_broken_x86emu
Ok, finally picked this up again. Rebased the branch, added a patch for x86emu detection. https://www.kraxel.org/cgit/seabios/log/?h=serial --- a/src/romlayout.S +++ b/src/romlayout.S @@ -531,12 +531,31 @@ entry_10_hooked: pushfw pushl %cs:sercon_int10_hook_resume + // Detect broken x86emu versions + pushl %eax + pushl %ebx + pushl $0xffffffff + calll 1f +1: popl %eax + movl $1b, %ebx + cmpl %eax, %ebx + jne running_on_broken_x86emu + popl %ebx // $0xffffffff + popl %ebx + popl %eax + pushl $sercon_10_splitmode #if CONFIG_ENTRY_EXTRASTACK jmp irqentry_arg_extrastack #else jmp irqentry_arg #endif +running_on_broken_x86emu: + popw %bx + popl %ebx + popl %eax + // skip sercon code, jump straight to vgabios + iretw // int 18/19 are special - they reset stack and call into 32bit mode. DECLFUNC entry_19 How is x86emu broken? I'm assuming it ignores the prefix for call, so it'll push a 16bit return address instead of a 32bit return address to the stack? Patch tested on RHEL-7 and RHEL-5 (known-broken x86emu in xorg) so far. cheers, Gerd _______________________________________________ SeaBIOS mailing list [email protected] https://mail.coreboot.org/mailman/listinfo/seabios
