提交 390fb6b4 编写于 作者: K Kevin Wolf 提交者: Anthony Liguori

multiboot: Don't forget last mmap entry

When the BIOS returns ebx = 0, the current entry is still valid and
needs to be included in the Multiboot memory map.

Fixing this meant that using bx as the entry index doesn't work any
more because it's 0 on the last entry (and it was SeaBIOS-specific
anyway), so the whole loop had to change a bit and should be more
generic as a result (ebx can be an arbitrary continuation number now,
and the entry size returned by the BIOS is used instead of hard-coding
20 bytes).
Signed-off-by: NKevin Wolf <mail@kevin-wolf.de>
Reviewed-by: NAnthony Liguori <aliguori@us.ibm.com>
Message-id: 1372018066-21822-2-git-send-email-mail@kevin-wolf.de
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 6bedfe94
...@@ -89,17 +89,14 @@ run_multiboot: ...@@ -89,17 +89,14 @@ run_multiboot:
/* Initialize multiboot mmap structs using int 0x15(e820) */ /* Initialize multiboot mmap structs using int 0x15(e820) */
xor %ebx, %ebx xor %ebx, %ebx
/* mmap start after first size */ /* Start storing mmap data at %es:0 */
movl $4, %edi xor %edi, %edi
mmap_loop: mmap_loop:
/* The multiboot entry size has offset -4, so leave some space */
add $4, %di
/* entry size (mmap struct) & max buffer size (int15) */ /* entry size (mmap struct) & max buffer size (int15) */
movl $20, %ecx movl $20, %ecx
/* store entry size */
/* old as(1) doesn't like this insn so emit the bytes instead:
movl %ecx, %es:-4(%edi)
*/
.dc.b 0x26,0x67,0x66,0x89,0x4f,0xfc
/* e820 */ /* e820 */
movl $0x0000e820, %eax movl $0x0000e820, %eax
/* 'SMAP' magic */ /* 'SMAP' magic */
...@@ -107,21 +104,23 @@ mmap_loop: ...@@ -107,21 +104,23 @@ mmap_loop:
int $0x15 int $0x15
mmap_check_entry: mmap_check_entry:
/* last entry? then we're done */ /* Error or last entry already done? */
jb mmap_done jb mmap_done
and %bx, %bx
jz mmap_done
/* valid entry, so let's loop on */
mmap_store_entry: mmap_store_entry:
/* %ax = entry_number * 24 */ /* store entry size */
mov $24, %ax /* old as(1) doesn't like this insn so emit the bytes instead:
mul %bx movl %ecx, %es:-4(%edi)
mov %ax, %di */
.dc.b 0x26,0x67,0x66,0x89,0x4f,0xfc
/* %edi += entry_size, store as mbs_mmap_length */
add %ecx, %edi
movw %di, %fs:0x2c movw %di, %fs:0x2c
/* %di = 4 + (entry_number * 24) */
add $4, %di /* Continuation value 0 means last entry */
jmp mmap_loop test %ebx, %ebx
jnz mmap_loop
mmap_done: mmap_done:
real_to_prot: real_to_prot:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册