From 64b8b8403dc6e641f1033662365b44ae23479f75 Mon Sep 17 00:00:00 2001 From: Luke Kenneth Casson Leighton Date: Sun, 20 Mar 2022 13:40:58 +0000 Subject: [PATCH] add microwatt hello_world source --- hello_world/Makefile | 34 ++++++++++++ hello_world/head.S | 107 ++++++++++++++++++++++++++++++++++++++ hello_world/hello_world.c | 30 +++++++++++ hello_world/powerpc.lds | 13 +++++ 4 files changed, 184 insertions(+) create mode 100644 hello_world/Makefile create mode 100644 hello_world/head.S create mode 100644 hello_world/hello_world.c create mode 100644 hello_world/powerpc.lds diff --git a/hello_world/Makefile b/hello_world/Makefile new file mode 100644 index 0000000..dd51bd3 --- /dev/null +++ b/hello_world/Makefile @@ -0,0 +1,34 @@ +ARCH = $(shell uname -m) +ifneq ("$(ARCH)", "ppc64") +ifneq ("$(ARCH)", "ppc64le") + CROSS_COMPILE ?= powerpc64le-linux-gnu- +endif +endif + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)ld +OBJCOPY = $(CROSS_COMPILE)objcopy + +CFLAGS = -Os -g -Wall -std=c99 -msoft-float -mno-string -mno-multiple -mno-vsx -mno-altivec -mlittle-endian -fno-stack-protector -mstrict-align -ffreestanding -fdata-sections -ffunction-sections -I../include +ASFLAGS = $(CFLAGS) +LDFLAGS = -T powerpc.lds + +all: hello_world.hex + +console.o: ../lib/console.c + $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ + +hello_world.elf: hello_world.o head.o console.o + $(LD) $(LDFLAGS) -o $@ $^ + +hello_world.bin: hello_world.elf + $(OBJCOPY) -O binary $^ $@ + +hello_world.hex: hello_world.bin + ../scripts/bin2hex.py $^ > $@ + +clean: + @rm -f *.o hello_world.elf hello_world.bin hello_world.hex +distclean: clean + rm -f *~ + diff --git a/hello_world/head.S b/hello_world/head.S new file mode 100644 index 0000000..6357606 --- /dev/null +++ b/hello_world/head.S @@ -0,0 +1,107 @@ +/* Copyright 2013-2014 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define STACK_TOP 0x2000 + +#define FIXUP_ENDIAN \ + tdi 0,0,0x48; /* Reverse endian of b . + 8 */ \ + b 191f; /* Skip trampoline if endian is good */ \ + .long 0xa600607d; /* mfmsr r11 */ \ + .long 0x01006b69; /* xori r11,r11,1 */ \ + .long 0x05009f42; /* bcl 20,31,$+4 */ \ + .long 0xa602487d; /* mflr r10 */ \ + .long 0x14004a39; /* addi r10,r10,20 */ \ + .long 0xa64b5a7d; /* mthsrr0 r10 */ \ + .long 0xa64b7b7d; /* mthsrr1 r11 */ \ + .long 0x2402004c; /* hrfid */ \ +191: + + +/* Load an immediate 64-bit value into a register */ +#define LOAD_IMM64(r, e) \ + lis r,(e)@highest; \ + ori r,r,(e)@higher; \ + rldicr r,r, 32, 31; \ + oris r,r, (e)@h; \ + ori r,r, (e)@l; + + .section ".head","ax" + + /* + * Microwatt currently enters in LE mode at 0x0, so we don't need to + * do any endian fix ups> + */ + . = 0 +.global _start +_start: + b boot_entry + + /* QEMU enters at 0x10 */ + . = 0x10 + FIXUP_ENDIAN + b boot_entry + + . = 0x100 + FIXUP_ENDIAN + b boot_entry + +.global boot_entry +boot_entry: + /* setup stack */ + LOAD_IMM64(%r1, STACK_TOP - 0x100) + LOAD_IMM64(%r12, main) + mtctr %r12, + bctrl + b . + +#define EXCEPTION(nr) \ + .= nr ;\ + b . + + /* More exception stubs */ + EXCEPTION(0x300) + EXCEPTION(0x380) + EXCEPTION(0x400) + EXCEPTION(0x480) + EXCEPTION(0x500) + EXCEPTION(0x600) + EXCEPTION(0x700) + EXCEPTION(0x800) + EXCEPTION(0x900) + EXCEPTION(0x980) + EXCEPTION(0xa00) + EXCEPTION(0xb00) + EXCEPTION(0xc00) + EXCEPTION(0xd00) + EXCEPTION(0xe00) + EXCEPTION(0xe20) + EXCEPTION(0xe40) + EXCEPTION(0xe60) + EXCEPTION(0xe80) + EXCEPTION(0xf00) + EXCEPTION(0xf20) + EXCEPTION(0xf40) + EXCEPTION(0xf60) + EXCEPTION(0xf80) +#if 0 + EXCEPTION(0x1000) + EXCEPTION(0x1100) + EXCEPTION(0x1200) + EXCEPTION(0x1300) + EXCEPTION(0x1400) + EXCEPTION(0x1500) + EXCEPTION(0x1600) +#endif diff --git a/hello_world/hello_world.c b/hello_world/hello_world.c new file mode 100644 index 0000000..0f08631 --- /dev/null +++ b/hello_world/hello_world.c @@ -0,0 +1,30 @@ +#include +#include + +#include "console.h" + +static char mw_logo[] = + +"\n" +" .oOOo. \n" +" .\" \". \n" +" ; .mw. ; Microwatt, it works.\n" +" . ' ' . \n" +" \\ || / \n" +" ;..; \n" +" ;..; \n" +" `ww' \n"; + +int main(void) +{ + console_init(); + + puts(mw_logo); + + while (1) { + unsigned char c = getchar(); + putchar(c); + if (c == 13) // if CR send LF + putchar(10); + } +} diff --git a/hello_world/powerpc.lds b/hello_world/powerpc.lds new file mode 100644 index 0000000..96bc6b9 --- /dev/null +++ b/hello_world/powerpc.lds @@ -0,0 +1,13 @@ +SECTIONS +{ + _start = .; + . = 0; + .head : { + KEEP(*(.head)) + } + . = 0x1000; + .text : { *(.text) } + . = 0x1800; + .data : { *(.data) } + .bss : { *(.bss) } +} -- 2.30.2