On Mon, Aug 03, 2015 at 04:41:25PM +0200, Andrew Jones wrote: > Add the hvcall for putchar and use it in puts. That, along with a > couple more lines in start to prepare for C code, and a branch to > main(), gets us "hello world". Run with > > qemu-system-ppc64 -M pseries \ > -bios powerpc/boot_rom.bin \ > -display none -serial stdio \ > -kernel powerpc/selftest.elf > > (We're still not relocating yet, that comes in a later patch. Thus, > testing hello-world at this point requires a hacked QEMU and linking > the unit test at QEMU's kernel load address.) > > Signed-off-by: Andrew Jones <[email protected]> > --- > lib/powerpc/io.c | 15 +++++++++++++-- > powerpc/Makefile.common | 1 + > powerpc/cstart64.S | 27 +++++++++++++++++++++++++++ > 3 files changed, 41 insertions(+), 2 deletions(-) > > diff --git a/lib/powerpc/io.c b/lib/powerpc/io.c > index cf3b6347e1e46..a7eaafeca9205 100644 > --- a/lib/powerpc/io.c > +++ b/lib/powerpc/io.c > @@ -6,15 +6,26 @@ > * This work is licensed under the terms of the GNU LGPL, version 2. > */ > #include <libcflat.h> > +#include <asm/spinlock.h> > + > +extern void halt(int code); > +extern void putchar(int c); > + > +static struct spinlock uart_lock; > > void io_init(void) > { > } > > -void puts(const char *s __unused) > +void puts(const char *s) > { > + spin_lock(&uart_lock); > + while (*s) > + putchar(*s++); > + spin_unlock(&uart_lock); > } > > -void exit(int code __unused) > +void exit(int code) > { > + halt(code); > } > diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common > index 5cd3ea8085038..d6356540918a5 100644 > --- a/powerpc/Makefile.common > +++ b/powerpc/Makefile.common > @@ -26,6 +26,7 @@ CFLAGS += -ffreestanding > CFLAGS += -Wextra > CFLAGS += -O2 > CFLAGS += -I lib -I lib/libfdt > +CFLAGS += -Wa,-mregnames > > asm-offsets = lib/$(ARCH)/asm-offsets.h > include scripts/asm-offsets.mak > diff --git a/powerpc/cstart64.S b/powerpc/cstart64.S > index d9b77f44f9e0e..d7c51cd352ee4 100644 > --- a/powerpc/cstart64.S > +++ b/powerpc/cstart64.S > @@ -6,14 +6,41 @@ > * This work is licensed under the terms of the GNU LGPL, version 2. > */ > > +#define HVSC .long 0x44000022
Unless your assembler is really old, you could probably use "sc 1"
inline, instead of this macro. Not that it really matters.
> +#define H_PUT_TERM_CHAR 0x58
> +
> +#define LOAD_REG_IMMEDIATE(reg,expr) \
> + lis reg,(expr)@highest; \
> + ori reg,reg,(expr)@higher; \
> + rldicr reg,reg,32,31; \
> + oris reg,reg,(expr)@h; \
> + ori reg,reg,(expr)@l;
> +
> +#define LOAD_REG_ADDR(reg,name) \
> + ld reg,name@got(r2)
> +
> .section .init
>
> .globl start
> start:
> + LOAD_REG_IMMEDIATE(r1, stackptr)
> + LOAD_REG_IMMEDIATE(r2, tocptr)
> + bl .main
> + bl .exit
Is this built for ppc64 or ppc64le? IIUC under the new ABI version
usually used on ppc64le, function descriptors are no longer used. And
even under the old ABI, I think the assembler now has the smarts to
avoid explicitly referencing the .-symbols.
> b halt
>
> .text
> +.align 3
>
> .globl halt
> halt:
> 1: b 1b
> +
> +.globl putchar
> +putchar:
> + sldi r6, r3, 56
> + li r3, H_PUT_TERM_CHAR
> + li r4, 0 /* vty-reg 0 means to use the default vty */
> + li r5, 1 /* sending just 1 byte */
> + HVSC
> + blr
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
pgp8F9ROuEkrR.pgp
Description: PGP signature
