Requesting the BIOS' memory map
This commit is contained in:
parent
68d47cd451
commit
ae735033f0
2 changed files with 53 additions and 1 deletions
11
Qcommon.c
11
Qcommon.c
|
|
@ -40,12 +40,23 @@ void serial_write(const char *msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void bios_write(const char *msg, unsigned length);
|
extern void bios_write(const char *msg, unsigned length);
|
||||||
|
extern void *bios_getmap(void *buffer);
|
||||||
|
|
||||||
|
unsigned char memmap[24 * 128];
|
||||||
|
|
||||||
void
|
void
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
bios_write("init\r\n", 6);
|
bios_write("init\r\n", 6);
|
||||||
|
void *end = bios_getmap(memmap);
|
||||||
bios_write("karlos\r\n", 8);
|
bios_write("karlos\r\n", 8);
|
||||||
|
for (int i = 0; ; i++) {
|
||||||
|
unsigned char *entry = memmap + 24 * i;
|
||||||
|
if (entry >= end) break;
|
||||||
|
unsigned char type = *(entry + 16);
|
||||||
|
char c = type < 10 ? type + '0' : '?';
|
||||||
|
bios_write(&c, 1);
|
||||||
|
}
|
||||||
for (;;) {
|
for (;;) {
|
||||||
__asm__ ("hlt" :);
|
__asm__ ("hlt" :);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
43
Rnbp.S
43
Rnbp.S
|
|
@ -1,4 +1,4 @@
|
||||||
// vim: et:sw=12:ts=12:sts=12
|
// vim: ft=gas:et:sw=12:ts=12:sts=12
|
||||||
|
|
||||||
.global _start
|
.global _start
|
||||||
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
.code32
|
.code32
|
||||||
mov $SS_DATA16, %ax
|
mov $SS_DATA16, %ax
|
||||||
mov %ax, %ds
|
mov %ax, %ds
|
||||||
|
mov %ax, %es
|
||||||
mov %ax, %ss
|
mov %ax, %ss
|
||||||
ljmp $SS_CODE16, $9f
|
ljmp $SS_CODE16, $9f
|
||||||
9: .code16
|
9: .code16
|
||||||
|
|
@ -22,6 +23,7 @@
|
||||||
.code16
|
.code16
|
||||||
mov $SS_DATA32, %ax
|
mov $SS_DATA32, %ax
|
||||||
mov %ax, %ds
|
mov %ax, %ds
|
||||||
|
mov %ax, %es
|
||||||
mov %ax, %ss
|
mov %ax, %ss
|
||||||
ljmp $SS_CODE32, $9f
|
ljmp $SS_CODE32, $9f
|
||||||
9: .code32
|
9: .code32
|
||||||
|
|
@ -164,6 +166,45 @@ bios_write: push %ebp
|
||||||
pop %ebp
|
pop %ebp
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
.global bios_getmap
|
||||||
|
.code32
|
||||||
|
bios_getmap:push %ebp
|
||||||
|
mov %esp, %ebp
|
||||||
|
push %ebx
|
||||||
|
push %edi
|
||||||
|
|
||||||
|
mov 8+0(%ebp), %edi
|
||||||
|
|
||||||
|
PROT16
|
||||||
|
.code16
|
||||||
|
REAL
|
||||||
|
|
||||||
|
xor %ebx, %ebx
|
||||||
|
_gmnext: movl $0, 20(%di)
|
||||||
|
mov $0x534D4150, %edx // e820 magic number
|
||||||
|
mov $24, %ecx
|
||||||
|
mov $0xE820, %eax
|
||||||
|
int $0x15
|
||||||
|
jc _gmdone
|
||||||
|
test %ebx, %ebx
|
||||||
|
jz _gmdone
|
||||||
|
add $24, %di
|
||||||
|
jmp _gmnext
|
||||||
|
_gmdone: add $24, %di
|
||||||
|
|
||||||
|
|
||||||
|
PROT
|
||||||
|
PROT32
|
||||||
|
.code32
|
||||||
|
|
||||||
|
mov %edi, %eax
|
||||||
|
|
||||||
|
pop %edi
|
||||||
|
pop %ebx
|
||||||
|
mov %ebp, %esp
|
||||||
|
pop %ebp
|
||||||
|
ret
|
||||||
|
|
||||||
.data
|
.data
|
||||||
|
|
||||||
real_ss: .word 0
|
real_ss: .word 0
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue