Set development environment with UART debug output for aarch64
This commit is contained in:
		
							parent
							
								
									8718f035a5
								
							
						
					
					
						commit
						08ffb6ee94
					
				
							
								
								
									
										24
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										24
									
								
								Makefile
								
								
								
								
							|  | @ -6,14 +6,13 @@ AARCH64_TOOLCHAIN ?= aarch64-linux-gnu | |||
| # Shortcuts
 | ||||
| 
 | ||||
| CC=clang --target=aarch64-none-elf -mcpu=cortex-a57 | ||||
| # CC=$(AARCH64_TOOLCHAIN)-gcc
 | ||||
| LD=$(AARCH64_TOOLCHAIN)-ld | ||||
| LD=ld.lld | ||||
| OBJCOPY=$(AARCH64_TOOLCHAIN)-objcopy --target elf64-littleaarch64 | ||||
| 
 | ||||
| CFLAGS += -O0 | ||||
| CFLAGS += -g | ||||
| CFLAGS += -nostdlib | ||||
| CFLAGS += -march=armv8-a | ||||
| #CFLAGS += -nostdlib
 | ||||
| #CFLAGS += -march=armv8-a
 | ||||
| #CFLAGS += -std=c99
 | ||||
| #CFLAGS += -pedantic
 | ||||
| #CFLAGS += -Wall
 | ||||
|  | @ -26,7 +25,7 @@ BUILD_DIR=build | |||
| 
 | ||||
| # Files
 | ||||
| 
 | ||||
| KERNEL_MEMMAP = sys/memmap | ||||
| KERNEL_MEMMAP = aarch64/memmap | ||||
| 
 | ||||
| KERNEL_SOURCES = \
 | ||||
|   aarch64/boot.s \
 | ||||
|  | @ -45,7 +44,7 @@ kernel: $(BUILD_DIR)/kernel.elf # $(BUILD_DIR)/kernel.sym | |||
| 
 | ||||
| $(BUILD_DIR)/kernel.elf: $(KERNEL_OBJS) | ||||
| 	$(info linking target: $@) | ||||
| 	$(LD) -T$(KERNEL_MEMMAP) $^ -o $@ | ||||
| 	$(LD) -T$(KERNEL_MEMMAP) -nostdlib $^ -o $@ | ||||
| 	$(info done: $@) | ||||
| 
 | ||||
| $(BUILD_DIR)/kernel.bin: $(BUILD_DIR)/kernel.elf | ||||
|  | @ -66,14 +65,15 @@ $(BUILD_DIR)/%.o: % | |||
| # helpers
 | ||||
| QEMU_CMD = \
 | ||||
|   qemu-system-aarch64 \
 | ||||
|     -M virt \
 | ||||
|     -cpu cortex-a57 \
 | ||||
|     -machine type=virt \
 | ||||
|     -nographic \
 | ||||
|     -smp 4 \
 | ||||
|     -m 4098 \
 | ||||
|     -m 4096 \
 | ||||
|     -kernel build/kernel.elf \
 | ||||
|     -serial stdio \
 | ||||
|     -monitor none | ||||
|     -monitor none \
 | ||||
| 
 | ||||
| 
 | ||||
| clean: | ||||
| 	rm -Rf ./$(BUILD_DIR)/* | ||||
|  | @ -83,4 +83,8 @@ run: kernel | |||
| 
 | ||||
| 
 | ||||
| debug: kernel | ||||
| 	$(QEMU_CMD) -gdb tcp::1234 -S | ||||
| 	$(QEMU_CMD) -S -gdb tcp::1234 & \
 | ||||
|   gdb-multiarch -q \
 | ||||
|   -ex 'file build/kernel.elf' \
 | ||||
|   -ex 'target remote localhost:1234' | ||||
| 	kill %1 | ||||
|  |  | |||
|  | @ -1,22 +0,0 @@ | |||
| 	.global _boot
 | ||||
| 	.extern k_main
 | ||||
| 
 | ||||
| 
 | ||||
| _boot: | ||||
| 	mrs x0, mpidr_el1       // Check CPU ID | ||||
| 	mov x1, 0xC1000000 | ||||
| 	bic x0, x0, x1 | ||||
| 	cbz x0, set_stack | ||||
| 	b idle | ||||
| 
 | ||||
| set_stack: | ||||
| 	ldr     x30, =0x40001000 | ||||
| 	mov     sp,  x30 | ||||
| 	bl      start | ||||
| 
 | ||||
| start: | ||||
| 	mov x0, x30 | ||||
| 	bl k_main | ||||
| 
 | ||||
| idle: b idle | ||||
| 
 | ||||
|  | @ -1,10 +1,7 @@ | |||
| 	.text | ||||
| 
 | ||||
| 	.globl _start
 | ||||
| 	.extern k_main
 | ||||
| 	.extern stack_ptr  | ||||
| 
 | ||||
| _start: | ||||
| 
 | ||||
| 	mrs x0, mpidr_el1       // Check CPU ID | ||||
| 	mov x1, 0xC1000000 | ||||
| 	bic x0, x0, x1 | ||||
|  | @ -12,12 +9,8 @@ _start: | |||
| 	b   idle | ||||
| 
 | ||||
| set_stack: | ||||
| 	ldr x30, stack_ptr  // defined in sys/memmap | ||||
| 	ldr x30, =stack_ptr  // defined in sys/memmap | ||||
| 	mov sp,  x30 | ||||
| 	bl  start | ||||
| 
 | ||||
| start: | ||||
| 	mov x0, x30 | ||||
| 	bl  k_main | ||||
| 
 | ||||
| idle: | ||||
|  |  | |||
|  | @ -0,0 +1,16 @@ | |||
| ENTRY(_start) | ||||
| 
 | ||||
| SECTIONS | ||||
| { | ||||
| 	/* For some reason qemu UART doesn't work with smaller address */ | ||||
| 	. = 0x40000000;  | ||||
| 
 | ||||
| 	.boot . : { boot.o(.text) } | ||||
| 	.text : { *(.text) } | ||||
| 	.data : { *(.data) } | ||||
| 	.bss : { *(.bss COMMON) } | ||||
| 
 | ||||
| 	. = ALIGN(8); | ||||
| 	. = . + 0x1000; | ||||
| 	stack_ptr = . ; | ||||
| } | ||||
|  | @ -25,13 +25,10 @@ k_main(void) | |||
| { | ||||
| 	uart_init(); | ||||
| 
 | ||||
| 	uart_putc('L'); | ||||
| 	uart_putc('o'); | ||||
| 	uart_putc('w'); | ||||
| 	uart_putc('e'); | ||||
| 	uart_putc('\n'); | ||||
| 	uart_puts((unsigned char *) "Lowe OS\n"); | ||||
| 
 | ||||
| 	for (;;) { | ||||
| 		__asm__("WFE"); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										12
									
								
								sys/memmap
								
								
								
								
							
							
						
						
									
										12
									
								
								sys/memmap
								
								
								
								
							|  | @ -1,12 +0,0 @@ | |||
|     ENTRY(_start) | ||||
| 
 | ||||
|     SECTIONS | ||||
|     { | ||||
|       . = 0x40000000; | ||||
|       .text : { *(.text) } | ||||
|       .data : { *(.data) } | ||||
|       .bss : { *(.bss COMMON) } | ||||
|       . = ALIGN(8); | ||||
|       . = . + 0x1000; | ||||
|       stack_ptr = . ; | ||||
|     } | ||||
							
								
								
									
										16
									
								
								sys/uart.c
								
								
								
								
							
							
						
						
									
										16
									
								
								sys/uart.c
								
								
								
								
							|  | @ -15,7 +15,7 @@ | |||
| 
 | ||||
| #include "uart.h" | ||||
| 
 | ||||
| unsigned int *uart_base = (unsigned int *)UART_BASE; | ||||
| volatile unsigned int *UART0 = (unsigned int *)UART_BASE; | ||||
| 
 | ||||
| 
 | ||||
| void | ||||
|  | @ -24,10 +24,18 @@ uart_init(void) | |||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void | ||||
| uart_putc(unsigned char c) | ||||
| { | ||||
| 	*uart_base = c; | ||||
| 	if(c == '\n') | ||||
| 		*uart_base = '\r'; | ||||
| 	*UART0 = (unsigned int) c; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void | ||||
| uart_puts(const unsigned char *s) | ||||
| { | ||||
| 	while(*s) { | ||||
| 		*UART0 = (unsigned int) *(s++); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -22,9 +22,12 @@ | |||
| void | ||||
| uart_init(void); | ||||
| 
 | ||||
| 
 | ||||
| void | ||||
| uart_putc(unsigned char c); | ||||
| 
 | ||||
| 
 | ||||
| void | ||||
| uart_puts(const unsigned char *s); | ||||
| 
 | ||||
| #endif /* !UART_H */ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue