protos: Remove ugly .32.c files and replace them with pure asm files

This commit is contained in:
mintsuki 2022-07-05 18:53:39 +02:00
parent 1dd81d4534
commit 8e54ea461b
7 changed files with 185 additions and 225 deletions

View File

@ -395,14 +395,6 @@ endif
-include $(HEADER_DEPS)
ifeq ($(TARGET), uefi-x86-64)
$(call MKESCAPE,$(BUILDDIR))/%.32.o: %.32.c $(call MKESCAPE,$(BUILDDIR))/limine-efi
mkdir -p "$$(dirname '$(call SHESCAPE,$@)')"
$(CROSS_CC) $(CROSS_CFLAGS) $(INTERNAL_CFLAGS32) -c '$(call SHESCAPE,$<)' -o '$(call SHESCAPE,$@).32'
$(CROSS_OBJCOPY) -I elf32-i386 -O elf64-x86-64 '$(call SHESCAPE,$@).32' '$(call SHESCAPE,$@)'
rm '$(call SHESCAPE,$@).32'
endif
ifeq ($(TARGET), bios)
$(call MKESCAPE,$(BUILDDIR))/%.o: %.asm_ia32
mkdir -p "$$(dirname '$(call SHESCAPE,$@)')"

View File

@ -1,119 +0,0 @@
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <stdnoreturn.h>
#include <mm/vmm.h>
noreturn void limine_spinup_32(
bool level5pg, uint32_t pagemap_top_lv,
uint32_t entry_point_lo, uint32_t entry_point_hi,
uint32_t stack_lo, uint32_t stack_hi,
uint32_t local_gdt) {
uint64_t casted_to_64[] = {
(uint64_t)entry_point_lo | ((uint64_t)entry_point_hi << 32),
(uint64_t)stack_lo | ((uint64_t)stack_hi << 32),
(uint64_t)local_gdt
};
// Enable NX
asm volatile (
"movl $0xc0000080, %%ecx\n\t"
"rdmsr\n\t"
"btsl $11, %%eax\n\t"
"wrmsr\n\t"
::: "eax", "ecx", "edx", "memory"
);
if (level5pg) {
// Enable CR4.LA57
asm volatile (
"movl %%cr4, %%eax\n\t"
"btsl $12, %%eax\n\t"
"movl %%eax, %%cr4\n\t"
::: "eax", "memory"
);
}
// Enable WP
asm volatile (
"movl %%cr0, %%eax\n\t"
"btsl $16, %%eax\n\t"
"movl %%eax, %%cr0\n\t"
::: "eax", "memory"
);
asm volatile (
"cld\n\t"
"movl %%eax, %%cr3\n\t"
"movl %%cr4, %%eax\n\t"
"btsl $5, %%eax\n\t"
"movl %%eax, %%cr4\n\t"
"movl $0xc0000080, %%ecx\n\t"
"rdmsr\n\t"
"btsl $8, %%eax\n\t"
"wrmsr\n\t"
"movl %%cr0, %%eax\n\t"
"btsl $31, %%eax\n\t"
"movl %%eax, %%cr0\n\t"
"call 1f\n\t"
"1: popl %%eax\n\t"
"addl $8, %%eax\n\t"
"pushl $0x28\n\t"
"pushl %%eax\n\t"
"lret\n\t"
".code64\n\t"
"movl $0x30, %%eax\n\t"
"movl %%eax, %%ds\n\t"
"movl %%eax, %%es\n\t"
"movl %%eax, %%fs\n\t"
"movl %%eax, %%gs\n\t"
"movl %%eax, %%ss\n\t"
// Since we don't really know what is now present in the upper
// 32 bits of the 64 bit registers, clear up the upper bits
// of the register that points to the 64-bit casted value array.
"movl %%esi, %%esi\n\t"
// Move in 64-bit values
"movq 0x00(%%rsi), %%rbx\n\t"
"movq 0x10(%%rsi), %%rax\n\t"
"movq 0x08(%%rsi), %%rsi\n\t"
// Load 64 bit GDT
"lgdt (%%rax)\n\t"
// Let's pretend we push a return address
"subq $8, %%rsi\n\t"
"movq $0, (%%rsi)\n\t"
"pushq $0x30\n\t"
"pushq %%rsi\n\t"
"pushfq\n\t"
"pushq $0x28\n\t"
"pushq %%rbx\n\t"
"xorl %%eax, %%eax\n\t"
"xorl %%ebx, %%ebx\n\t"
"xorl %%ecx, %%ecx\n\t"
"xorl %%edx, %%edx\n\t"
"xorl %%esi, %%esi\n\t"
"xorl %%edi, %%edi\n\t"
"xorl %%ebp, %%ebp\n\t"
"xorl %%r8d, %%r8d\n\t"
"xorl %%r9d, %%r9d\n\t"
"xorl %%r10d, %%r10d\n\t"
"xorl %%r11d, %%r11d\n\t"
"xorl %%r12d, %%r12d\n\t"
"xorl %%r13d, %%r13d\n\t"
"xorl %%r14d, %%r14d\n\t"
"xorl %%r15d, %%r15d\n\t"
"iretq\n\t"
".code32\n\t"
:
: "a" (pagemap_top_lv), "S" (casted_to_64)
: "memory"
);
__builtin_unreachable();
}

View File

@ -0,0 +1,97 @@
bits 32
section .text
global limine_spinup_32
limine_spinup_32:
; Enable EFER.NXE
mov ecx, 0xc0000080
rdmsr
bts eax, 11
wrmsr
; Enable CR4.LA57
cmp dword [esp+4], 0 ; level5pg
je .no_la57
mov eax, cr4
bts eax, 12
mov cr4, eax
.no_la57:
; Enable CR0.WP
mov eax, cr0
bts eax, 16
mov cr0, eax
cld
mov eax, [esp+8] ; pagemap_top_lv
mov cr3, eax
; Enable CR4.PAE
mov eax, cr4
bts eax, 5
mov cr4, eax
; Enable EFER.LME
mov eax, 0xc0000080
rdmsr
bts eax, 8
wrmsr
; Enable CR0.PG
mov eax, cr0
bts eax, 31
mov cr0, eax
; Go 64
push 0x28
call .p1
.p1:
add dword [esp], .mode64 - .p1
retfd
bits 64
.mode64:
mov eax, 0x30
mov ds, eax
mov es, eax
mov fs, eax
mov gs, eax
mov ss, eax
; Load 64-bit GDT
mov eax, [rsp+28] ; local_gdt
lgdt [rax]
; Push fake return address
mov rsi, [rsp+20] ; stack
sub rsi, 8
mov qword [rsi], 0
; Prepare iretq frame
mov rax, qword [rsp+12] ; entry_point
push 0x30
push rsi
pushfq
push 0x28
push rax
; Zero out all GPRs
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
xor esi, esi
xor edi, edi
xor ebp, ebp
xor r8d, r8d
xor r9d, r9d
xor r10d, r10d
xor r11d, r11d
xor r12d, r12d
xor r13d, r13d
xor r14d, r14d
xor r15d, r15d
iretq

View File

@ -1,62 +0,0 @@
#include <stdint.h>
#include <stdnoreturn.h>
#include <sys/gdt.h>
noreturn void linux_spinup(void *entry, void *boot_params) {
struct gdt_desc linux_gdt_descs[4];
linux_gdt_descs[0] = (struct gdt_desc){0};
linux_gdt_descs[1] = (struct gdt_desc){0};
linux_gdt_descs[2] = (struct gdt_desc){
.limit = 0xffff,
.base_low = 0x0000,
.base_mid = 0x00,
.access = 0b10011010,
.granularity = 0b11001111,
.base_hi = 0x00
};
linux_gdt_descs[3] = (struct gdt_desc){
.limit = 0xffff,
.base_low = 0x0000,
.base_mid = 0x00,
.access = 0b10010010,
.granularity = 0b11001111,
.base_hi = 0x00
};
struct gdtr linux_gdt;
linux_gdt.limit = sizeof(linux_gdt_descs) - 1;
linux_gdt.ptr = (uintptr_t)linux_gdt_descs;
asm volatile (
"lgdt %0\n\t"
"pushl $0x10\n\t"
"call 1f\n\t"
"1:\n\t"
"addl $2f-1b, (%%esp)\n\t"
"lret\n\t"
"2:\n\t"
"movl $0x18, %%eax\n\t"
"movl %%eax, %%ds\n\t"
"movl %%eax, %%es\n\t"
"movl %%eax, %%fs\n\t"
"movl %%eax, %%gs\n\t"
"movl %%eax, %%ss\n\t"
"xorl %%ebp, %%ebp\n\t"
"xorl %%edi, %%edi\n\t"
"xorl %%ebx, %%ebx\n\t"
"cld\n\t"
"jmp *%%ecx\n\t"
:
: "m"(linux_gdt), "c"(entry), "S"(boot_params)
: "memory"
);
__builtin_unreachable();
}

View File

@ -0,0 +1,67 @@
section .data
align 16
linux_gdt:
dq 0
dq 0
dw 0xffff
dw 0x0000
db 0x00
db 10011010b
db 11001111b
db 0x00
dw 0xffff
dw 0x0000
db 0x00
db 10010010b
db 11001111b
db 0x00
.end:
align 16
linux_gdt_ptr:
dw (linux_gdt.end - linux_gdt) - 1
dd 0
bits 32
section .text
global linux_spinup
linux_spinup:
call .p0
.p0:
pop eax
lea ebx, [eax - (linux_spinup.p0 - linux_gdt_ptr)]
lea ecx, [eax - (linux_spinup.p0 - linux_gdt)]
mov [ebx+2], ecx
lgdt [ebx]
push 0x10
call .p1
.p1:
add dword [esp], .fj - .p1
retfd
.fj:
mov eax, 0x18
mov ds, eax
mov es, eax
mov fs, eax
mov gs, eax
mov ss, eax
xor ebp, ebp
xor edi, edi
xor ebx, ebx
mov esi, [esp+8] ; boot_params
cld
jmp [esp+4]

View File

@ -1,36 +0,0 @@
#include <stdint.h>
#include <stdnoreturn.h>
#if bios == 1
# include <sys/idt.h>
#endif
noreturn void multiboot_spinup_32(
uint32_t reloc_stub,
uint32_t magic, uint32_t protocol_info,
uint32_t entry_point,
uint32_t elf_ranges, uint32_t elf_ranges_count) {
#if bios == 1
struct idtr idtr;
idtr.limit = 0x3ff;
idtr.ptr = 0;
asm volatile (
"lidt %0"
:
: "m" (idtr)
: "memory"
);
#endif
asm volatile (
"jmp *%%ebx"
:
: "b"(reloc_stub), "S"(magic),
"a"(elf_ranges), "d"(elf_ranges_count),
"D"(protocol_info), "c"(entry_point)
: "memory"
);
__builtin_unreachable();
}

View File

@ -0,0 +1,21 @@
bits 32
section .text
global multiboot_spinup_32:
multiboot_spinup_32:
sub esp, 6
mov word [esp-2], 0x3ff
mov dword [esp], 0
lidt [esp-2]
add esp, 6
add esp, 4 ; return address
pop ebx ; reloc_stub
pop esi ; magic
pop edi ; protocol_info
pop ecx ; entry_point
pop eax ; elf_ranges
pop edx ; elf_ranges_count
jmp ebx