smp: Do not calculate trampoline size in C file
diff --git a/common/sys/smp.c b/common/sys/smp.c
index 2c29b353..7bced48e 100644
--- a/common/sys/smp.c
+++ b/common/sys/smp.c
@@ -39,8 +39,8 @@ struct madt_x2apic {
uint32_t acpi_processor_uid;
} __attribute__((packed));
-extern symbol _binary_smp_trampoline_bin_start;
-extern symbol _binary_smp_trampoline_bin_end;
+extern symbol smp_trampoline_start;
+extern symbol smp_trampoline_size;
struct trampoline_passed_info {
uint8_t smp_tpl_booted_flag;
@@ -55,20 +55,17 @@ static bool smp_start_ap(uint32_t lapic_id, struct gdtr *gdtr,
struct smp_information *info_struct,
bool longmode, bool lv5, uint32_t pagemap,
bool x2apic, bool nx, uint64_t hhdm, bool wp) {
- size_t trampoline_size = (size_t)_binary_smp_trampoline_bin_end
- - (size_t)_binary_smp_trampoline_bin_start;
-
// Prepare the trampoline
static void *trampoline = NULL;
if (trampoline == NULL) {
- trampoline = conv_mem_alloc(trampoline_size);
+ trampoline = conv_mem_alloc((size_t)smp_trampoline_size);
- memcpy(trampoline, _binary_smp_trampoline_bin_start, trampoline_size);
+ memcpy(trampoline, smp_trampoline_start, (size_t)smp_trampoline_size);
}
static struct trampoline_passed_info *passed_info = NULL;
if (passed_info == NULL) {
- passed_info = (void *)(((uintptr_t)trampoline + trampoline_size)
+ passed_info = (void *)(((uintptr_t)trampoline + (size_t)smp_trampoline_size)
- sizeof(struct trampoline_passed_info));
}
diff --git a/common/sys/smp_trampoline.asm_x86 b/common/sys/smp_trampoline.asm_x86
index 92ed9315..2cd7e3cc 100644
--- a/common/sys/smp_trampoline.asm_x86
+++ b/common/sys/smp_trampoline.asm_x86
@@ -2,23 +2,23 @@ bits 16
section .rodata
-global _binary_smp_trampoline_bin_start
-_binary_smp_trampoline_bin_start:
+global smp_trampoline_start
+smp_trampoline_start:
cli
cld
mov ebx, cs
shl ebx, 4
- o32 lidt [cs:(invalid_idt - _binary_smp_trampoline_bin_start)]
- o32 lgdt [cs:(passed_info.gdtr - _binary_smp_trampoline_bin_start)]
+ o32 lidt [cs:(invalid_idt - smp_trampoline_start)]
+ o32 lgdt [cs:(passed_info.gdtr - smp_trampoline_start)]
- lea eax, [ebx + (.mode32 - _binary_smp_trampoline_bin_start)]
- mov [cs:(.farjmp_off - _binary_smp_trampoline_bin_start)], eax
+ lea eax, [ebx + (.mode32 - smp_trampoline_start)]
+ mov [cs:(.farjmp_off - smp_trampoline_start)], eax
mov eax, 0x00000011
mov cr0, eax
- o32 jmp far [cs:(.farjmp - _binary_smp_trampoline_bin_start)]
+ o32 jmp far [cs:(.farjmp - smp_trampoline_start)]
.farjmp:
.farjmp_off: dd 0
@@ -39,7 +39,7 @@ _binary_smp_trampoline_bin_start:
xor eax, eax
mov cr4, eax
- test dword [ebx + (passed_info.target_mode - _binary_smp_trampoline_bin_start)], (1 << 2)
+ test dword [ebx + (passed_info.target_mode - smp_trampoline_start)], (1 << 2)
jz .nox2apic
mov ecx, 0x1b
@@ -49,9 +49,9 @@ _binary_smp_trampoline_bin_start:
wrmsr
.nox2apic:
- lea esp, [ebx + (temp_stack.top - _binary_smp_trampoline_bin_start)]
+ lea esp, [ebx + (temp_stack.top - smp_trampoline_start)]
- test dword [ebx + (passed_info.target_mode - _binary_smp_trampoline_bin_start)], (1 << 0)
+ test dword [ebx + (passed_info.target_mode - smp_trampoline_start)], (1 << 0)
jz parking32
mov eax, cr4
@@ -63,7 +63,7 @@ _binary_smp_trampoline_bin_start:
xor edx, edx
wrmsr
- test dword [ebx + (passed_info.target_mode - _binary_smp_trampoline_bin_start)], (1 << 1)
+ test dword [ebx + (passed_info.target_mode - smp_trampoline_start)], (1 << 1)
jz .no5lv
mov eax, cr4
@@ -71,14 +71,14 @@ _binary_smp_trampoline_bin_start:
mov cr4, eax
.no5lv:
- mov eax, dword [ebx + (passed_info.pagemap - _binary_smp_trampoline_bin_start)]
+ mov eax, dword [ebx + (passed_info.pagemap - smp_trampoline_start)]
mov cr3, eax
mov eax, cr0
bts eax, 31
mov cr0, eax
- lea eax, [ebx + (.mode64 - _binary_smp_trampoline_bin_start)]
+ lea eax, [ebx + (.mode64 - smp_trampoline_start)]
push 0x28
push eax
retf
@@ -93,7 +93,7 @@ _binary_smp_trampoline_bin_start:
mov ss, ax
mov ebx, ebx
- test dword [rbx + (passed_info.target_mode - _binary_smp_trampoline_bin_start)], (1 << 3)
+ test dword [rbx + (passed_info.target_mode - smp_trampoline_start)], (1 << 3)
jz .nonx
mov ecx, 0xc0000080
@@ -102,7 +102,7 @@ _binary_smp_trampoline_bin_start:
wrmsr
.nonx:
- test dword [rbx + (passed_info.target_mode - _binary_smp_trampoline_bin_start)], (1 << 4)
+ test dword [rbx + (passed_info.target_mode - smp_trampoline_start)], (1 << 4)
jz .nowp
mov rax, cr0
@@ -110,19 +110,19 @@ _binary_smp_trampoline_bin_start:
mov cr0, rax
.nowp:
- mov rax, qword [rbx + (passed_info.hhdm - _binary_smp_trampoline_bin_start)]
- add qword [rbx + (passed_info.gdtr - _binary_smp_trampoline_bin_start) + 2], rax
- lgdt [rbx + (passed_info.gdtr - _binary_smp_trampoline_bin_start)]
+ mov rax, qword [rbx + (passed_info.hhdm - smp_trampoline_start)]
+ add qword [rbx + (passed_info.gdtr - smp_trampoline_start) + 2], rax
+ lgdt [rbx + (passed_info.gdtr - smp_trampoline_start)]
- lea rax, [rax + rbx + (parking64 - _binary_smp_trampoline_bin_start)]
+ lea rax, [rax + rbx + (parking64 - smp_trampoline_start)]
jmp rax
bits 32
parking32:
- mov edi, dword [ebx + (passed_info.smp_info_struct - _binary_smp_trampoline_bin_start)]
+ mov edi, dword [ebx + (passed_info.smp_info_struct - smp_trampoline_start)]
mov eax, 1
- lock xchg dword [ebx + (passed_info.booted_flag - _binary_smp_trampoline_bin_start)], eax
+ lock xchg dword [ebx + (passed_info.booted_flag - smp_trampoline_start)], eax
xor eax, eax
.loop:
@@ -149,10 +149,10 @@ parking32:
bits 64
parking64:
mov ebx, ebx
- mov edi, dword [rbx + (passed_info.smp_info_struct - _binary_smp_trampoline_bin_start)]
- add rdi, qword [rbx + (passed_info.hhdm - _binary_smp_trampoline_bin_start)]
+ mov edi, dword [rbx + (passed_info.smp_info_struct - smp_trampoline_start)]
+ add rdi, qword [rbx + (passed_info.hhdm - smp_trampoline_start)]
mov eax, 1
- lock xchg dword [rbx + (passed_info.booted_flag - _binary_smp_trampoline_bin_start)], eax
+ lock xchg dword [rbx + (passed_info.booted_flag - smp_trampoline_start)], eax
xor eax, eax
.loop:
@@ -202,5 +202,7 @@ passed_info:
.hhdm:
dq 0
-global _binary_smp_trampoline_bin_end
-_binary_smp_trampoline_bin_end:
+smp_trampoline_end:
+
+global smp_trampoline_size
+smp_trampoline_size equ smp_trampoline_end - smp_trampoline_start
