On Thu, 20 May 2021 09:47:29 +0000 Janosch Frank <frankja@xxxxxxxxxxxxx> wrote: > Snippets can be used to easily write and run guest (SIE) tests. > The snippet is linked into the test binaries and can therefore be > accessed via a ptr. > > Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> > --- > .gitignore | 2 ++ > s390x/Makefile | 28 ++++++++++++++++++--- > s390x/snippets/c/cstart.S | 13 ++++++++++ > s390x/snippets/c/flat.lds | 51 > +++++++++++++++++++++++++++++++++++++++ 4 files changed, 91 > insertions(+), 3 deletions(-) create mode 100644 > s390x/snippets/c/cstart.S create mode 100644 s390x/snippets/c/flat.lds > > diff --git a/.gitignore b/.gitignore > index 784cb2dd..29d3635b 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -22,3 +22,5 @@ cscope.* > /api/dirty-log > /api/dirty-log-perf > /s390x/*.bin > +/s390x/snippets/*/*.bin > +/s390x/snippets/*/*.gbin > diff --git a/s390x/Makefile b/s390x/Makefile > index 8de926ab..fe267011 100644 > --- a/s390x/Makefile > +++ b/s390x/Makefile > @@ -75,11 +75,33 @@ OBJDIRS += lib/s390x > asmlib = $(TEST_DIR)/cstart64.o $(TEST_DIR)/cpu.o > > FLATLIBS = $(libcflat) > -%.elf: %.o $(FLATLIBS) $(SRCDIR)/s390x/flat.lds $(asmlib) > + > +SNIPPET_DIR = $(TEST_DIR)/snippets > + > +# C snippets that need to be linked > +snippets-c = > + > +# ASM snippets that are directly compiled and converted to a *.gbin > +snippets-a = > + > +snippets = $(snippets-a)$(snippets-c) ↑↑ I'm not a Makefile expert, but, don't you need a space between the two variable expansions? > +snippets-o += $(patsubst %.gbin,%.o,$(snippets)) > + > +$(snippets-a): $(snippets-o) $(FLATLIBS) > + $(OBJCOPY) -O binary $(patsubst %.gbin,%.o,$@) $@ > + $(OBJCOPY) -I binary -O elf64-s390 -B "s390:64-bit" $@ $@ > + > +$(snippets-c): $(snippets-o) $(SNIPPET_DIR)/c/cstart.o $(FLATLIBS) > + $(CC) $(LDFLAGS) -o $@ -T $(SNIPPET_DIR)/c/flat.lds \ > + $(filter %.o, $^) $(FLATLIBS) > + $(OBJCOPY) -O binary $@ $@ > + $(OBJCOPY) -I binary -O elf64-s390 -B "s390:64-bit" $@ $@ > + > +%.elf: $(snippets) %.o $(FLATLIBS) $(SRCDIR)/s390x/flat.lds $(asmlib) I would keep the %.o as the first in the list > $(CC) $(CFLAGS) -c -o $(@:.elf=.aux.o) \ > $(SRCDIR)/lib/auxinfo.c -DPROGNAME=\"$@\" > $(CC) $(LDFLAGS) -o $@ -T $(SRCDIR)/s390x/flat.lds \ > - $(filter %.o, $^) $(FLATLIBS) $(@:.elf=.aux.o) > + $(filter %.o, $^) $(FLATLIBS) $(snippets) so all the snippets are always baked in every test? > $(@:.elf=.aux.o) $(RM) $(@:.elf=.aux.o) > @chmod a-x $@ > > @@ -93,7 +115,7 @@ FLATLIBS = $(libcflat) > $(GENPROTIMG) --host-key-document $(HOST_KEY_DOCUMENT) > --no-verify --image $< -o $@ > arch_clean: asm_offsets_clean > - $(RM) $(TEST_DIR)/*.{o,elf,bin} $(TEST_DIR)/.*.d > lib/s390x/.*.d > + $(RM) $(TEST_DIR)/*.{o,elf,bin} > $(SNIPPET_DIR)/c/*.{o,elf,bin,gbin} $(SNIPPET_DIR)/.*.d > $(TEST_DIR)/.*.d lib/s390x/.*.d generated-files = $(asm-offsets) > $(tests:.elf=.o) $(asmlib) $(cflatobjs): $(generated-files) > diff --git a/s390x/snippets/c/cstart.S b/s390x/snippets/c/cstart.S > new file mode 100644 > index 00000000..02a3338b > --- /dev/null > +++ b/s390x/snippets/c/cstart.S > @@ -0,0 +1,13 @@ > +#include <asm/sigp.h> > + > +.section .init > + .globl start > +start: > + /* XOR all registers with themselves to clear them fully. */ > + .irp i, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 > + xgr \i,\i > + .endr > + /* 0x3000 is the stack page for now */ > + lghi %r15, 0x4000 > + brasl %r14, main > + sigp %r1, %r0, SIGP_STOP > diff --git a/s390x/snippets/c/flat.lds b/s390x/snippets/c/flat.lds > new file mode 100644 > index 00000000..5e707325 > --- /dev/null > +++ b/s390x/snippets/c/flat.lds > @@ -0,0 +1,51 @@ > +SECTIONS > +{ > + .lowcore : { > + /* > + * Initial short psw for disk boot, with 31 bit > addressing for > + * non z/Arch environment compatibility and the > instruction > + * address 0x10000 (cstart64.S .init). > + */ > + . = 0; > + LONG(0x00080000) > + LONG(0x80004000) > + /* Restart new PSW for booting via PSW restart. */ > + . = 0x1a0; > + QUAD(0x0000000180000000) > + QUAD(0x0000000000004000) > + } > + . = 0x4000; > + .text : { > + *(.init) > + *(.text) > + *(.text.*) > + } > + . = ALIGN(64K); > + etext = .; > + .opd : { *(.opd) } > + . = ALIGN(16); > + .dynamic : { > + dynamic_start = .; > + *(.dynamic) > + } > + .dynsym : { > + dynsym_start = .; > + *(.dynsym) > + } > + .rela.dyn : { *(.rela*) } > + . = ALIGN(16); > + .data : { > + *(.data) > + *(.data.rel*) > + } > + . = ALIGN(16); > + .rodata : { *(.rodata) *(.rodata.*) } > + . = ALIGN(16); > + __bss_start = .; > + .bss : { *(.bss) } > + __bss_end = .; > + . = ALIGN(64K); > + edata = .; > + . += 64K; > + . = ALIGN(64K); > +}