Browse Source

boot: port boot.s to GNU as

K. Lange 2 years ago
parent
commit
8f5de441fc
3 changed files with 130 additions and 140 deletions
  1. 2 2
      Makefile
  2. 128 0
      boot/boot.S
  3. 0 138
      boot/boot.s

+ 2 - 2
Makefile

@@ -277,8 +277,8 @@ cdrom/boot.sys: boot/boot.o boot/cstuff.o boot/link.ld | dirs
 boot/cstuff.o: boot/cstuff.c boot/*.h
 	${CC} -c -Os -o $@ $<
 
-boot/boot.o: boot/boot.s
-	yasm -f elf -o $@ $<
+boot/boot.o: boot/boot.S
+	${AS} -o $@ $<
 
 .PHONY: clean
 clean:

+ 128 - 0
boot/boot.S

@@ -0,0 +1,128 @@
+.code16
+main:
+	ljmp $0x0,$0x7c05
+main2:
+	mov $0x0, %ax
+	mov %ax, %ds
+	mov %ax, %ss
+	mov $0x7b00, %ax
+	mov %ax, %sp
+	mov $0x500, %ax
+	mov %ax, %es
+
+	clc
+	int $0x12
+	mov %ax, (lower_mem)
+
+	mov $0x0, %di
+	call do_e820
+	jc hang
+
+	cli
+
+	in $0x92, %al
+	or $2, %al
+	out %al, $0x92
+
+	xor %eax, %eax
+	mov %ds, %ax
+	shl $4, %eax
+	add $gdt_base, %eax
+	mov %eax, gdtr+2
+	mov $gdt_end, %eax
+	sub $gdt_base, %eax
+	mov %ax, gdtr
+	lgdtw gdtr
+
+	mov %cr0, %eax
+	or $1, %eax
+	mov %eax, %cr0
+
+	mov $0x10, %ax
+	mov %ax, %ds
+	mov %ax, %es
+	mov %ax, %fs
+	mov %ax, %gs
+	mov %ax, %ss
+
+.global kmain
+	ljmp $0x08,$kmain
+
+hang:
+	jmp hang
+
+do_e820:
+	xor %ebx, %ebx
+	xor %bp, %bp
+	mov $0x534D4150, %edx
+	mov $0xe820, %eax
+	movl $0x1,%es:20(%di)
+	mov $24, %ecx
+	int $0x15
+	jb  do_e820.failed
+	mov $0x534D4150, %edx
+	cmp %edx, %eax
+	jne do_e820.failed
+	test %ebx, %ebx
+	je  do_e820.failed
+	jmp do_e820.jmpin
+do_e820.e820lp:
+	mov $0xe820, %eax
+	movl $0x1,%es:20(%di)
+	mov $24, %ecx
+	int $0x15
+	jb do_e820.e820f
+	mov $0x534D4150, %edx
+do_e820.jmpin:
+	jcxz do_e820.skipent
+	cmp $20, %cl
+	jbe do_e820.notext
+	testb $0x1, %es:20(%di)
+	je do_e820.skipent
+do_e820.notext:
+	mov %es:8(%di), %ecx
+	or %es:12(%di), %ecx
+	jz do_e820.skipent
+	inc %bp
+	add $24, %di
+do_e820.skipent:
+	test %ebx, %ebx
+	jne do_e820.e820lp
+do_e820.e820f:
+	mov %bp, mmap_ent
+	clc
+	ret
+do_e820.failed:
+	stc
+	ret
+
+.align 8
+gdtr:
+	.word 0
+	.long 0
+
+gdt_base:
+	.quad 0
+	.word 0xFFFF
+	.word 0
+	.byte 0
+	.byte 0x9a
+	.byte 0xcf
+	.byte 0
+	.word 0xffff
+	.word 0
+	.byte 0
+	.byte 0x92
+	.byte 0xcf
+	.byte 0
+gdt_end:
+
+.global mmap_ent
+mmap_ent:
+	.byte 0
+	.byte 0
+
+.global lower_mem
+lower_mem:
+	.byte 0
+	.byte 0

+ 0 - 138
boot/boot.s

@@ -1,138 +0,0 @@
-[bits 16]
-main:
-	jmp far 0x000:0x7c05
-main2:
-	mov ax, 0x0000
-	mov ds, ax
-	mov ss, ax
-	mov ax, 0x7b00
-	mov sp, ax
-	mov ax, 0x0500
-	mov es, ax
-
-	clc
-	int 0x12
-	mov [lower_mem], ax
-
-	; memory scan
-	mov di, 0x0
-	call do_e820
-	jc hang
-
-	cli
-
-	; a20
-	in al, 0x92
-	or al, 2
-	out 0x92, al
-
-	; basic flat GDT
-	xor eax, eax
-	mov ax, ds
-	shl eax, 4
-	add eax, gdt_base
-	mov [gdtr+2], eax
-	mov eax, gdt_end
-	sub eax, gdt_base
-	mov [gdtr], ax
-	lgdt [gdtr]
-
-	; protected mode enable flag
-	mov eax, cr0
-	or eax, 1
-	mov cr0, eax
-
-	; set segments
-	mov ax, 0x10
-	mov ds, ax
-	mov es, ax
-	mov fs, ax
-	mov gs, ax
-	mov ss, ax
-
-	; jump to protected mode entry
-	extern kmain
-	jmp far 0x08:(kmain)
-
-hang:
-	jmp hang
-
-do_e820:
-	xor ebx, ebx		; ebx must be 0 to start
-	xor bp, bp		; keep an entry count in bp
-	mov edx, 0x0534D4150	; Place "SMAP" into edx
-	mov eax, 0xe820
-	mov [es:di + 20], dword 1	; force a valid ACPI 3.X entry
-	mov ecx, 24		; ask for 24 bytes
-	int 0x15
-	jc short .failed	; carry set on first call means "unsupported function"
-	mov edx, 0x0534D4150	; Some BIOSes apparently trash this register?
-	cmp eax, edx		; on success, eax must have been reset to "SMAP"
-	jne short .failed
-	test ebx, ebx		; ebx = 0 implies list is only 1 entry long (worthless)
-	je short .failed
-	jmp short .jmpin
-.e820lp:
-	mov eax, 0xe820		; eax, ecx get trashed on every int 0x15 call
-	mov [es:di + 20], dword 1	; force a valid ACPI 3.X entry
-	mov ecx, 24		; ask for 24 bytes again
-	int 0x15
-	jc short .e820f		; carry set means "end of list already reached"
-	mov edx, 0x0534D4150	; repair potentially trashed register
-.jmpin:
-	jcxz .skipent		; skip any 0 length entries
-	cmp cl, 20		; got a 24 byte ACPI 3.X response?
-	jbe short .notext
-	test byte [es:di + 20], 1	; if so: is the "ignore this data" bit clear?
-	je short .skipent
-.notext:
-	mov ecx, [es:di + 8]	; get lower uint32_t of memory region length
-	or ecx, [es:di + 12]	; "or" it with upper uint32_t to test for zero
-	jz .skipent		; if length uint64_t is 0, skip entry
-	inc bp			; got a good entry: ++count, move to next storage spot
-	add di, 24
-.skipent:
-	test ebx, ebx		; if ebx resets to 0, list is complete
-	jne short .e820lp
-.e820f:
-	mov [mmap_ent], bp	; store the entry count
-	clc			; there is "jc" on end of list to this point, so the carry must be cleared
-	ret
-.failed:
-	stc			; "function unsupported" error exit
-	ret
-
-align 8
-
-; GDT pointer
-gdtr
-	dw 0
-	dd 0
-
-; GDT (null, code, data)
-gdt_base
-	; null
-	dq 0
-	; code
-	dw 0xFFFF
-	dw 0
-	db 0
-	db 0x9a
-	db 0xcf
-	db 0
-	; data
-	dw 0xffff
-	dw 0
-	db 0
-	db 0x92
-	db 0xcf
-	db 0
-gdt_end
-
-; memory map entry count
-global mmap_ent
-mmap_ent db 0, 0
-
-global lower_mem
-lower_mem db 0, 0
-