The gdt address calculation in linuxboot.bin is broken in two ways: first
it loads %cs into %eax, but that instruction leaves the high bits of %eax
undefined and we did not clear them. Secondly, we completely ignore the
incorrect %eax, and use the undefined %ebx instead.
With these issues fixed, linuxboot works again.
Signed-off-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
/* Now create the GDT descriptor */
movw $((3 * 8) - 1), -16(%bp)
mov %cs, %eax
+ movzwl %ax, %eax
shl $4, %eax
- addl $gdt, %ebx
- movl %ebx, -14(%bp)
+ addl $gdt, %eax
+ movl %eax, -14(%bp)
/* And load the GDT */
data32 lgdt -16(%bp)