section .data align 16 linux_gdt: dq 0 dq 0 dw 0xffff dw 0x0000 db 0x00 db 10011011b db 11001111b db 0x00 dw 0xffff dw 0x0000 db 0x00 db 10010011b 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] section .note.GNU-stack noalloc noexec nowrite progbits