mirror of
https://gitlab.com/bztsrc/bootboot.git
synced 2023-02-13 20:54:32 -05:00
More roboust ACPI memory detection
This commit is contained in:
parent
536ef740d0
commit
ae1a94e3d9
10 changed files with 39 additions and 22 deletions
|
@ -1579,8 +1579,7 @@ gzerr: puts("BOOTBOOT-PANIC: Unable to uncompress\n");
|
||||||
switch(MMapEnt_Type(mmap)) {
|
switch(MMapEnt_Type(mmap)) {
|
||||||
case MMAP_USED: uart_puts("reserved"); break;
|
case MMAP_USED: uart_puts("reserved"); break;
|
||||||
case MMAP_FREE: uart_puts("free"); break;
|
case MMAP_FREE: uart_puts("free"); break;
|
||||||
case MMAP_ACPIFREE: uart_puts("acpifree"); break;
|
case MMAP_ACPI: uart_puts("acpi"); break;
|
||||||
case MMAP_ACPINVS: uart_puts("acpinvs"); break;
|
|
||||||
case MMAP_MMIO: uart_puts("mmio"); break;
|
case MMAP_MMIO: uart_puts("mmio"); break;
|
||||||
default: uart_puts("unknown"); break;
|
default: uart_puts("unknown"); break;
|
||||||
}
|
}
|
||||||
|
|
BIN
bootboot.bin
BIN
bootboot.bin
Binary file not shown.
BIN
bootboot.efi
BIN
bootboot.efi
Binary file not shown.
|
@ -70,13 +70,12 @@ typedef struct {
|
||||||
#define MMapEnt_Ptr(a) (a->ptr)
|
#define MMapEnt_Ptr(a) (a->ptr)
|
||||||
#define MMapEnt_Size(a) (a->size & 0xFFFFFFFFFFFFFFF0)
|
#define MMapEnt_Size(a) (a->size & 0xFFFFFFFFFFFFFFF0)
|
||||||
#define MMapEnt_Type(a) (a->size & 0xF)
|
#define MMapEnt_Type(a) (a->size & 0xF)
|
||||||
#define MMapEnt_IsFree(a) ((a->size&0xF)==1||(a->size&0xF)==2)
|
#define MMapEnt_IsFree(a) ((a->size&0xF)==1)
|
||||||
|
|
||||||
#define MMAP_USED 0 /* don't use. Reserved or unknown regions */
|
#define MMAP_USED 0 /* don't use. Reserved or unknown regions */
|
||||||
#define MMAP_FREE 1 /* usable memory */
|
#define MMAP_FREE 1 /* usable memory */
|
||||||
#define MMAP_ACPIFREE 2 /* free to use after acpi tables are parsed */
|
#define MMAP_ACPI 2 /* acpi memory, volatile and non-volatile as well */
|
||||||
#define MMAP_ACPINVS 3 /* don't use. Acpi non-volatile */
|
#define MMAP_MMIO 3 /* memory mapped IO region */
|
||||||
#define MMAP_MMIO 4 /* memory mapped IO region */
|
|
||||||
|
|
||||||
#define INITRD_MAXSIZE 16 /* Mb */
|
#define INITRD_MAXSIZE 16 /* Mb */
|
||||||
|
|
||||||
|
|
BIN
bootboot.img
BIN
bootboot.img
Binary file not shown.
BIN
bootboot.rom
BIN
bootboot.rom
Binary file not shown.
Binary file not shown.
|
@ -511,13 +511,11 @@ getmemmap:
|
||||||
.notfirst: mov al, byte [di+16]
|
.notfirst: mov al, byte [di+16]
|
||||||
cmp al, 1
|
cmp al, 1
|
||||||
je .noov
|
je .noov
|
||||||
|
cmp al, 4
|
||||||
|
je .isacpi
|
||||||
cmp al, 3
|
cmp al, 3
|
||||||
jne @f
|
jne @f
|
||||||
mov al, MMAP_ACPIFREE
|
.isacpi: mov al, MMAP_ACPI
|
||||||
jmp .noov
|
|
||||||
@@: cmp al, 4
|
|
||||||
jne @f
|
|
||||||
mov al, MMAP_ACPINVS
|
|
||||||
jmp .noov
|
jmp .noov
|
||||||
; everything else reserved
|
; everything else reserved
|
||||||
@@: mov al, MMAP_USED
|
@@: mov al, MMAP_USED
|
||||||
|
@ -525,7 +523,7 @@ getmemmap:
|
||||||
mov byte [di+8], al
|
mov byte [di+8], al
|
||||||
xor ecx, ecx
|
xor ecx, ecx
|
||||||
;is it ACPI area?
|
;is it ACPI area?
|
||||||
cmp al, MMAP_ACPIFREE
|
cmp al, MMAP_ACPI
|
||||||
jne .notacpi
|
jne .notacpi
|
||||||
mov dword [bootboot.acpi_ptr], edi
|
mov dword [bootboot.acpi_ptr], edi
|
||||||
jmp .entryok
|
jmp .entryok
|
||||||
|
@ -643,13 +641,14 @@ getmemmap:
|
||||||
je .acpi1
|
je .acpi1
|
||||||
.acpi2: mov eax, dword [es:24]
|
.acpi2: mov eax, dword [es:24]
|
||||||
mov dword [bootboot.acpi_ptr], eax
|
mov dword [bootboot.acpi_ptr], eax
|
||||||
mov eax, dword [es:28]
|
mov edx, dword [es:28]
|
||||||
mov dword [bootboot.acpi_ptr+4], eax
|
mov dword [bootboot.acpi_ptr+4], edx
|
||||||
jmp .detsmbi
|
jmp .chkacpi
|
||||||
; no, fallback to RSDT
|
; no, fallback to RSDT
|
||||||
.acpi1: mov eax, dword [es:16]
|
.acpi1: mov eax, dword [es:16]
|
||||||
@@: mov dword [bootboot.acpi_ptr], eax
|
@@: mov dword [bootboot.acpi_ptr], eax
|
||||||
jmp .detsmbi
|
xor edx, edx
|
||||||
|
jmp .chkacpi
|
||||||
.acpinotf: xor eax, eax
|
.acpinotf: xor eax, eax
|
||||||
mov ax, es
|
mov ax, es
|
||||||
inc ax
|
inc ax
|
||||||
|
@ -661,6 +660,27 @@ getmemmap:
|
||||||
jnz .acpinext
|
jnz .acpinext
|
||||||
mov si, noacpi
|
mov si, noacpi
|
||||||
jmp real_diefunc
|
jmp real_diefunc
|
||||||
|
.chkacpi: ; check if memory is marked as ACPI in the memory map
|
||||||
|
mov esi, bootboot.mmap
|
||||||
|
mov edi, bootboot.magic
|
||||||
|
add edi, dword [bootboot.size]
|
||||||
|
.nextmm: cmp edx, dword [si+4]
|
||||||
|
jne .skipmm
|
||||||
|
mov ebx, dword [si]
|
||||||
|
cmp eax, ebx
|
||||||
|
jl .skipmm
|
||||||
|
add ebx, dword [si+8]
|
||||||
|
and bl, 0F0h
|
||||||
|
cmp eax, ebx
|
||||||
|
jge .skipmm
|
||||||
|
mov al, byte [si+8]
|
||||||
|
and al, 0F0h
|
||||||
|
or al, MMAP_ACPI
|
||||||
|
mov byte [si+8], al
|
||||||
|
jmp .detsmbi
|
||||||
|
.skipmm: add si, 16
|
||||||
|
cmp si, di
|
||||||
|
jl .nextmm
|
||||||
|
|
||||||
;detect SMBios tables
|
;detect SMBios tables
|
||||||
.detsmbi: xor eax, eax
|
.detsmbi: xor eax, eax
|
||||||
|
|
|
@ -74,9 +74,8 @@ end virtual
|
||||||
|
|
||||||
MMAP_USED equ 0
|
MMAP_USED equ 0
|
||||||
MMAP_FREE equ 1
|
MMAP_FREE equ 1
|
||||||
MMAP_ACPIFREE equ 2
|
MMAP_ACPI equ 2
|
||||||
MMAP_ACPINVS equ 3
|
MMAP_MMIO equ 3
|
||||||
MMAP_MMIO equ 4
|
|
||||||
|
|
||||||
INITRD_MAXSIZE equ 16 ; Mb
|
INITRD_MAXSIZE equ 16 ; Mb
|
||||||
|
|
||||||
|
|
|
@ -1712,10 +1712,10 @@ get_memory_map:
|
||||||
mmapent->ptr=mement->PhysicalStart;
|
mmapent->ptr=mement->PhysicalStart;
|
||||||
mmapent->size=(mement->NumberOfPages*PAGESIZE)+
|
mmapent->size=(mement->NumberOfPages*PAGESIZE)+
|
||||||
((mement->Type>0&&mement->Type<5)||mement->Type==7?MMAP_FREE:
|
((mement->Type>0&&mement->Type<5)||mement->Type==7?MMAP_FREE:
|
||||||
(mement->Type==9?MMAP_ACPIFREE:
|
(mement->Type==9 || mement->Type==10 || (bootboot->arch.x86_64.acpi_ptr >= mmapent->ptr &&
|
||||||
(mement->Type==10?MMAP_ACPINVS:
|
bootboot->arch.x86_64.acpi_ptr < mmapent->ptr+mement->NumberOfPages*PAGESIZE)?MMAP_ACPI:
|
||||||
(mement->Type==11||mement->Type==12?MMAP_MMIO:
|
(mement->Type==11||mement->Type==12?MMAP_MMIO:
|
||||||
MMAP_USED))));
|
MMAP_USED)));
|
||||||
// merge continous areas of the same type
|
// merge continous areas of the same type
|
||||||
if(last!=NULL &&
|
if(last!=NULL &&
|
||||||
MMapEnt_Type(last) == MMapEnt_Type(mmapent) &&
|
MMapEnt_Type(last) == MMapEnt_Type(mmapent) &&
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue