On Thu, May 15, 2014 at 06:36:08PM +0200, Paolo Bonzini wrote:
A simple way to reconcile the C code with the changes I'm making could be to make the relocation code associated to one particular value of APMC.
It's not hard to pass in the %cs segment to the C code - this works (with some other minor changes):
-// ljmpw $SEG_BIOS, $(entry_smi - BUILD_BIOS_ADDR) -#define SMI_INSN (0xea | ((u64)SEG_BIOS<<24) \ - | (((u32)entry_smi - BUILD_BIOS_ADDR) << 8)) +// movw %cs, %ax; ljmpw $SEG_BIOS, $(entry_smi - BUILD_BIOS_ADDR) +#define SMI_INSN (0xeac88c | ((u64)SEG_BIOS<<40) \ + | ((u64)((u32)entry_smi - BUILD_BIOS_ADDR) << 24))
[...]
smm_handler(void *smbase) { switch (inb(0xb2)) { case 0xAA: if (smbase != (void *)0xA0000L) { ... } outb(PORT_SMI_STATUS, 0); } outl(smm_eos_port, inl(smm_eos_port)|smm_eos_value); outl(smm_status_port, smm_status_value); }
I think this is more easily visible on top of these patches more than the other way round, but I'm biased of course...
I was referring to your patch 5, which adds a bunch of assembler variables - I think it would be clearer to add them in C to start.
-Kevin