133 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| .code16
 | |
| 
 | |
| .section .stage2
 | |
| 
 | |
| # fills memory map data structure
 | |
| # doesn't return on error
 | |
| # NO REGISTERS SAVED
 | |
| .global get_memory_map
 | |
| get_memory_map:
 | |
| 	movl $0, (memory_map_entry_count)
 | |
| 
 | |
| 	movl $0x0000E820, %eax
 | |
| 	movl $0x534D4150, %edx
 | |
| 	xorl %ebx, %ebx
 | |
| 	movl $20, %ecx
 | |
| 	movw $memory_map_entries, %di
 | |
| 
 | |
| 	clc
 | |
| 	int $0x15
 | |
| 	# If first call returs with CF set, the call failed
 | |
| 	jc .get_memory_map_error
 | |
| 
 | |
|  .get_memory_map_rest:
 | |
| 	cmpl $0x534D4150, %eax
 | |
| 	jne .get_memory_map_error
 | |
| 
 | |
| 	# FIXME: don't assume BIOS to always return 20 bytes
 | |
| 	cmpl $20, %ecx
 | |
| 	jne .get_memory_map_error
 | |
| 
 | |
| 	# increment entry count
 | |
| 	incl (memory_map_entry_count)
 | |
| 
 | |
| 	# increment entry pointer
 | |
| 	addw %cx, %di
 | |
| 
 | |
| 	# BIOS can indicate end of list by 0 in ebx
 | |
| 	testl %ebx, %ebx
 | |
| 	jz .get_memory_map_done
 | |
| 
 | |
| 	movl $0x0000E820, %eax
 | |
| 	movl $0x534D4150, %edx
 | |
| 
 | |
| 	clc
 | |
| 	int $0x15
 | |
| 	# BIOS can indicate end of list by setting CF
 | |
| 	jnc .get_memory_map_rest
 | |
| 
 | |
|  .get_memory_map_done:
 | |
| 	ret
 | |
| 
 | |
|  .get_memory_map_error:
 | |
| 	movw $memory_map_error_msg, %si
 | |
| 	jmp print_and_halt
 | |
| 
 | |
| 
 | |
| # print memory map from memory_map_entries
 | |
| # NO REGISTERS SAVED
 | |
| .global print_memory_map
 | |
| print_memory_map:
 | |
| 	movw $memory_map_msg, %si
 | |
| 	call puts
 | |
| 	call print_newline
 | |
| 
 | |
| 	movl (memory_map_entry_count), %edx
 | |
| 	movw $memory_map_entries, %si
 | |
| 
 | |
| 	movw $16, %bx
 | |
| 	movw $4, %cx
 | |
| 
 | |
|  .loop_memory_map:
 | |
| 	movb $' ', %al
 | |
| 	call putc; call putc; call putc; call putc
 | |
| 
 | |
| 	movw 0x06(%si), %ax
 | |
| 	call print_number
 | |
| 	movw 0x04(%si), %ax
 | |
| 	call print_number
 | |
| 	movw 0x02(%si), %ax
 | |
| 	call print_number
 | |
| 	movw 0x00(%si), %ax
 | |
| 	call print_number
 | |
| 
 | |
| 	movb $',', %al
 | |
| 	call putc
 | |
| 	movb $' ', %al
 | |
| 	call putc
 | |
| 
 | |
| 	movw 0x0E(%si), %ax
 | |
| 	call print_number
 | |
| 	movw 0x0C(%si), %ax
 | |
| 	call print_number
 | |
| 	movw 0x0A(%si), %ax
 | |
| 	call print_number
 | |
| 	movw 0x08(%si), %ax
 | |
| 	call print_number
 | |
| 
 | |
| 	movb $',', %al
 | |
| 	call putc
 | |
| 	movb $' ', %al
 | |
| 	call putc
 | |
| 
 | |
| 	movw 0x12(%si), %ax
 | |
| 	call print_number
 | |
| 	movw 0x10(%si), %ax
 | |
| 	call print_number
 | |
| 
 | |
| 	call print_newline
 | |
| 
 | |
| 	addw $20, %si
 | |
| 
 | |
| 	decl %edx
 | |
| 	jnz .loop_memory_map
 | |
| 
 | |
| 	ret
 | |
| 
 | |
| .section .data
 | |
| 
 | |
| memory_map_msg:
 | |
| 	.asciz "memmap:"
 | |
| memory_map_error_msg:
 | |
| 	.asciz "Failed to get memory map"
 | |
| 
 | |
| .section .bss
 | |
| 
 | |
| .global memory_map
 | |
| memory_map:
 | |
| memory_map_entry_count:
 | |
| 	.skip 4
 | |
| # 100 entries should be enough...
 | |
| memory_map_entries:
 | |
| 	.skip 20 * 100
 |