summaryrefslogtreecommitdiff
path: root/src/bootloader/cpu_check.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootloader/cpu_check.asm')
-rw-r--r--src/bootloader/cpu_check.asm51
1 files changed, 32 insertions, 19 deletions
diff --git a/src/bootloader/cpu_check.asm b/src/bootloader/cpu_check.asm
index ffdd908..0fa6ddf 100644
--- a/src/bootloader/cpu_check.asm
+++ b/src/bootloader/cpu_check.asm
@@ -1,38 +1,41 @@
-; TODO move this file to something like "system_check", now that we do ram checks here
[extern _meminfo_loc]
detect_arch:
-; todo: figure out how to just handle invalid opcode exceptions, it would be faster and (maybe?) easier
-; todo: digest this part a little better when it's _not_ 1am.
-pushfd ; pushes eflags to stack
-pushfd ; pushes eflags to stack a second time
-xor dword [esp], 0x00200000 ; inverses the ID bit to see if cpuid is a thing
-pop eax ;gets our modified cpuid back
-xor eax, [esp] ; checks with the first time we pushed it; the OG eflag
-popfd ; pops the flags back I guess?
-and eax, 0x00200000 ; checks to see if the bit was inverted
+
+; detect CPUID
+
+pushfd
+pushfd
+xor dword [esp], 0x00200000
+pop eax
+xor eax, [esp]
+popfd
+and eax, 0x00200000
jz .print_cpuid_error
-;now we detect if we support long slong (aka 64 bit)
-;https://www.amd.com/system/files/TechDocs/25481.pdf page 21
-;So apperently some dumbass engineers thought it would be funny to sell CPUs that have the long mode bit set without it being supported, dispite including it in their own documentation.
-;there's a work around by checking other bits, and it's a low priority TODO. However, I really think us coming accross this will be extremely rare.
+; detect long mode
+
mov eax, 0x80000001
-cpuid ;cpuid returns into edx
-and edx, 0x0020000000 ; the 21st bit is cpuid.
+cpuid
+and edx, 0x0020000000
jz .print_long_error
+; APIC
mov eax, 0x00000001
cpuid
-and edx, 0x00000200
+test edx, 0x00000200
jz .print_apic_error
+; SSE (you might be able to remove this, I think it's a standard requirement)
+test edx, 0x2000000
+jz .print_sse_error
+
mov bx, .no_error
mov cx, 0
call bios_print
-;mapping memory
+; get memory mappings
mov ax, 0
mov es, ax
mov ax, _meminfo_loc
@@ -71,7 +74,7 @@ call bios_print
jmp $
.print_long_error:
-mov bx, .arch_error ; lets just test for now
+mov bx, .arch_error
mov cx, 0
call bios_print
jmp $
@@ -80,11 +83,19 @@ jmp $
mov bx, .apic_error
mov cx, 0
call bios_print
+jmp $
.print_mem_error:
mov bx, .mem_error
mov cx, 0
call bios_print
+jmp $
+
+.print_sse_error:
+mov bx, .sse_error
+mov cx, 0
+call bios_print
+jmp $
.cpuid_error:
@@ -95,6 +106,8 @@ call bios_print
db "No apic support", 0x0
.mem_error:
db "Could not get information on memory!", 0x0
+.sse_error:
+ db "This OS requires SSE", 0x0
.no_error:
db "CPU info gathered!", 0x0