> Date: Mon, 23 Nov 2020 22:59:19 -0500
> From: George Koehler <[email protected]>
>
> With this diff, lld can link macppc's kernel.
>
> The first part of the diff adds R_PPC_ADDR24 to lld. I didn't find
> code in upstream lld's git for R_PPC_ADDR24. We need R_PPC_ADDR24 for
> "ba" and "bla" in locore.S.
I suppose llvm doesn't generate these relocations.
> The second part edits the kernel's Makefile.macppc. I add gapdummy
> (like in Makefile.powerpc64) to avoid an lld error. I also adapt a
> part of Makefile.i386, so my powerpc64 can build and link the macppc
> kernel. (I didn't boot that kernel.) My macppc can now build, link,
> and boot the GENERIC kernel with either ld.bfd or ld.lld.
>
> ok to commit?
ok kettenis@
> Index: gnu/llvm/lld/ELF/Arch/PPC.cpp
> ===================================================================
> RCS file: /cvs/src/gnu/llvm/lld/ELF/Arch/PPC.cpp,v
> retrieving revision 1.1.1.1
> diff -u -p -r1.1.1.1 PPC.cpp
> --- gnu/llvm/lld/ELF/Arch/PPC.cpp 3 Aug 2020 14:32:29 -0000 1.1.1.1
> +++ gnu/llvm/lld/ELF/Arch/PPC.cpp 23 Nov 2020 19:49:47 -0000
> @@ -220,6 +220,7 @@ RelExpr PPC::getRelExpr(RelType type, co
> case R_PPC_ADDR16_HA:
> case R_PPC_ADDR16_HI:
> case R_PPC_ADDR16_LO:
> + case R_PPC_ADDR24:
> case R_PPC_ADDR32:
> return R_ABS;
> case R_PPC_DTPREL16:
> @@ -344,6 +345,7 @@ void PPC::relocateOne(uint8_t *loc, RelT
> break;
> }
> case R_PPC_REL24:
> + case R_PPC_ADDR24:
> case R_PPC_LOCAL24PC:
> case R_PPC_PLTREL24: {
> uint32_t mask = 0x03FFFFFC;
> Index: sys/arch/macppc/conf/Makefile.macppc
> ===================================================================
> RCS file: /cvs/src/sys/arch/macppc/conf/Makefile.macppc,v
> retrieving revision 1.99
> diff -u -p -r1.99 Makefile.macppc
> --- sys/arch/macppc/conf/Makefile.macppc 7 Nov 2019 20:42:28 -0000
> 1.99
> +++ sys/arch/macppc/conf/Makefile.macppc 23 Nov 2020 19:49:49 -0000
> @@ -53,6 +53,13 @@ CFLAGS= ${DEBUG} ${CWARNFLAGS} ${CMACHF
> AFLAGS= -D_LOCORE ${CMACHFLAGS}
> LINKFLAGS= -N -Ttext 100114 -e start --warn-common -nopie
>
> +.if ${MACHINE} == "powerpc64"
> +CFLAGS+= -m32
> +AFLAGS+= -m32
> +LDFLAGS= -melf32ppc
> +LINKFLAGS+= ${LDFLAGS}
> +.endif
> +
> HOSTCC?= ${CC}
> HOSTED_CPPFLAGS=${CPPFLAGS:S/^-nostdinc$//}
> HOSTED_CFLAGS= ${CFLAGS}
> @@ -123,12 +130,16 @@ ioconf.o: ioconf.c
> ld.script: ${_machdir}/conf/ld.script
> cp ${_machdir}/conf/ld.script $@
>
> +gapdummy.o:
> + echo '__asm(".section .rodata,\"a\"");' > gapdummy.c
> + ${CC} -c ${CFLAGS} ${CPPFLAGS} gapdummy.c -o $@
> +
> makegap.sh:
> cp $S/conf/makegap.sh $@
>
> -MAKE_GAP = LD="${LD}" sh makegap.sh 0x00000000 # guaranteed illegal
> +MAKE_GAP = LD="${LD}" sh makegap.sh 0x00000000 gapdummy.o
>
> -gap.o: Makefile makegap.sh vers.o
> +gap.o: Makefile makegap.sh gapdummy.o vers.o
> ${MAKE_GAP}
>
> vers.o: ${SYSTEM_DEP:Ngap.o}
> @@ -137,7 +148,7 @@ vers.o: ${SYSTEM_DEP:Ngap.o}
>
> clean:
> rm -f *bsd *bsd.gdb *.[dio] [a-z]*.s assym.* \
> - gap.link ld.script lorder makegap.sh param.c
> + gap.link gapdummy.c ld.script lorder makegap.sh param.c
>
> cleandir: clean
> rm -f Makefile *.h ioconf.c options machine ${_mach} vers.c
>
>