Message ID | 1458560014-28862-3-git-send-email-lvivier@redhat.com |
---|---|
State | Accepted |
Headers | show |
On 21.03.2016 12:33, Laurent Vivier wrote: > Signed-off-by: Laurent Vivier <lvivier@redhat.com> > --- > v2: > check program check type (invalid instruction) > add "-v" parameter to display invalid instruction address > > powerpc/Makefile.common | 5 +++- > powerpc/emulator.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ > powerpc/unittests.cfg | 3 +++ > 3 files changed, 72 insertions(+), 1 deletion(-) > create mode 100644 powerpc/emulator.c > > diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common > index ab2caf6..257e3fb 100644 > --- a/powerpc/Makefile.common > +++ b/powerpc/Makefile.common > @@ -7,7 +7,8 @@ > tests-common = \ > $(TEST_DIR)/selftest.elf \ > $(TEST_DIR)/spapr_hcall.elf \ > - $(TEST_DIR)/rtas.elf > + $(TEST_DIR)/rtas.elf \ > + $(TEST_DIR)/emulator.elf > > all: $(TEST_DIR)/boot_rom.bin test_cases > > @@ -70,3 +71,5 @@ $(TEST_DIR)/selftest.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/selftest.o > $(TEST_DIR)/spapr_hcall.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/spapr_hcall.o > > $(TEST_DIR)/rtas.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/rtas.o > + > +$(TEST_DIR)/emulator.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/emulator.o > diff --git a/powerpc/emulator.c b/powerpc/emulator.c > new file mode 100644 > index 0000000..1d4f164 > --- /dev/null > +++ b/powerpc/emulator.c > @@ -0,0 +1,65 @@ > +/* > + * Test some powerpc instructions > + */ > + > +#include <libcflat.h> > +#include <asm/processor.h> > + > +static int verbose; > +static int volatile is_invalid; > + > +static void program_check_handler(struct pt_regs *regs, void *opaque) > +{ > + int *data = opaque; > + > + if (verbose) { > + printf("Detected invalid instruction 0x%016lx: %08x\n", > + regs->nip, *(uint32_t*)regs->nip); > + } > + > + /* the result is bit 16 to 19 of SRR1 > + * bit 0: SRR0 contains the address of the next instruction > + * bit 1: Trap > + * bit 2: Privileged instruction > + * bit 3: Illegal instruction > + * bit 4: FP enabled exception type > + */ > + > + *data = regs->msr >> 16; > + > + regs->nip += 4; > +} > + > +static void test_illegal(void) > +{ > + report_prefix_push("invalid"); > + > + is_invalid = 0; > + > + asm volatile (".long 0"); > + > + report("exception", is_invalid == 8); /* illegal instruction */ > + > + report_prefix_pop(); > +} > + > +int main(int argc, char **argv) > +{ > + int i; > + > + handle_exception(0x700, program_check_handler, (void *)&is_invalid); > + > + for (i = 0; i < argc; i++) { > + if (strcmp(argv[i], "-v") == 0) { > + verbose = 1; > + } > + } > + > + report_prefix_push("emulator"); > + > + test_illegal(); > + > + report_prefix_pop(); > + > + return report_summary(); > +} > diff --git a/powerpc/unittests.cfg b/powerpc/unittests.cfg > index 02b21c7..ed4fdbe 100644 > --- a/powerpc/unittests.cfg > +++ b/powerpc/unittests.cfg > @@ -47,3 +47,6 @@ file = rtas.elf > extra_params = -append "set-time-of-day" > timeout = 5 > groups = rtas > + > +[emulator] > +file = emulator.elf > Reviewed-by: Thomas Huth <thuth@redhat.com> -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, 21 Mar 2016 12:33:31 +0100 Laurent Vivier <lvivier@redhat.com> wrote: > Signed-off-by: Laurent Vivier <lvivier@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> > --- > v2: > check program check type (invalid instruction) > add "-v" parameter to display invalid instruction address > > powerpc/Makefile.common | 5 +++- > powerpc/emulator.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ > powerpc/unittests.cfg | 3 +++ > 3 files changed, 72 insertions(+), 1 deletion(-) > create mode 100644 powerpc/emulator.c > > diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common > index ab2caf6..257e3fb 100644 > --- a/powerpc/Makefile.common > +++ b/powerpc/Makefile.common > @@ -7,7 +7,8 @@ > tests-common = \ > $(TEST_DIR)/selftest.elf \ > $(TEST_DIR)/spapr_hcall.elf \ > - $(TEST_DIR)/rtas.elf > + $(TEST_DIR)/rtas.elf \ > + $(TEST_DIR)/emulator.elf > > all: $(TEST_DIR)/boot_rom.bin test_cases > > @@ -70,3 +71,5 @@ $(TEST_DIR)/selftest.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/selftest.o > $(TEST_DIR)/spapr_hcall.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/spapr_hcall.o > > $(TEST_DIR)/rtas.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/rtas.o > + > +$(TEST_DIR)/emulator.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/emulator.o > diff --git a/powerpc/emulator.c b/powerpc/emulator.c > new file mode 100644 > index 0000000..1d4f164 > --- /dev/null > +++ b/powerpc/emulator.c > @@ -0,0 +1,65 @@ > +/* > + * Test some powerpc instructions > + */ > + > +#include <libcflat.h> > +#include <asm/processor.h> > + > +static int verbose; > +static int volatile is_invalid; > + > +static void program_check_handler(struct pt_regs *regs, void *opaque) > +{ > + int *data = opaque; > + > + if (verbose) { > + printf("Detected invalid instruction 0x%016lx: %08x\n", > + regs->nip, *(uint32_t*)regs->nip); > + } > + > + /* the result is bit 16 to 19 of SRR1 > + * bit 0: SRR0 contains the address of the next instruction > + * bit 1: Trap > + * bit 2: Privileged instruction > + * bit 3: Illegal instruction > + * bit 4: FP enabled exception type > + */ > + > + *data = regs->msr >> 16; > + > + regs->nip += 4; > +} > + > +static void test_illegal(void) > +{ > + report_prefix_push("invalid"); > + > + is_invalid = 0; > + > + asm volatile (".long 0"); > + > + report("exception", is_invalid == 8); /* illegal instruction */ > + > + report_prefix_pop(); > +} > + > +int main(int argc, char **argv) > +{ > + int i; > + > + handle_exception(0x700, program_check_handler, (void *)&is_invalid); > + > + for (i = 0; i < argc; i++) { > + if (strcmp(argv[i], "-v") == 0) { > + verbose = 1; > + } > + } > + > + report_prefix_push("emulator"); > + > + test_illegal(); > + > + report_prefix_pop(); > + > + return report_summary(); > +} > diff --git a/powerpc/unittests.cfg b/powerpc/unittests.cfg > index 02b21c7..ed4fdbe 100644 > --- a/powerpc/unittests.cfg > +++ b/powerpc/unittests.cfg > @@ -47,3 +47,6 @@ file = rtas.elf > extra_params = -append "set-time-of-day" > timeout = 5 > groups = rtas > + > +[emulator] > +file = emulator.elf > -- > 2.5.0 >
diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common index ab2caf6..257e3fb 100644 --- a/powerpc/Makefile.common +++ b/powerpc/Makefile.common @@ -7,7 +7,8 @@ tests-common = \ $(TEST_DIR)/selftest.elf \ $(TEST_DIR)/spapr_hcall.elf \ - $(TEST_DIR)/rtas.elf + $(TEST_DIR)/rtas.elf \ + $(TEST_DIR)/emulator.elf all: $(TEST_DIR)/boot_rom.bin test_cases @@ -70,3 +71,5 @@ $(TEST_DIR)/selftest.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/selftest.o $(TEST_DIR)/spapr_hcall.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/spapr_hcall.o $(TEST_DIR)/rtas.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/rtas.o + +$(TEST_DIR)/emulator.elf: $(cstart.o) $(reloc.o) $(TEST_DIR)/emulator.o diff --git a/powerpc/emulator.c b/powerpc/emulator.c new file mode 100644 index 0000000..1d4f164 --- /dev/null +++ b/powerpc/emulator.c @@ -0,0 +1,65 @@ +/* + * Test some powerpc instructions + */ + +#include <libcflat.h> +#include <asm/processor.h> + +static int verbose; +static int volatile is_invalid; + +static void program_check_handler(struct pt_regs *regs, void *opaque) +{ + int *data = opaque; + + if (verbose) { + printf("Detected invalid instruction 0x%016lx: %08x\n", + regs->nip, *(uint32_t*)regs->nip); + } + + /* the result is bit 16 to 19 of SRR1 + * bit 0: SRR0 contains the address of the next instruction + * bit 1: Trap + * bit 2: Privileged instruction + * bit 3: Illegal instruction + * bit 4: FP enabled exception type + */ + + *data = regs->msr >> 16; + + regs->nip += 4; +} + +static void test_illegal(void) +{ + report_prefix_push("invalid"); + + is_invalid = 0; + + asm volatile (".long 0"); + + report("exception", is_invalid == 8); /* illegal instruction */ + + report_prefix_pop(); +} + +int main(int argc, char **argv) +{ + int i; + + handle_exception(0x700, program_check_handler, (void *)&is_invalid); + + for (i = 0; i < argc; i++) { + if (strcmp(argv[i], "-v") == 0) { + verbose = 1; + } + } + + report_prefix_push("emulator"); + + test_illegal(); + + report_prefix_pop(); + + return report_summary(); +} diff --git a/powerpc/unittests.cfg b/powerpc/unittests.cfg index 02b21c7..ed4fdbe 100644 --- a/powerpc/unittests.cfg +++ b/powerpc/unittests.cfg @@ -47,3 +47,6 @@ file = rtas.elf extra_params = -append "set-time-of-day" timeout = 5 groups = rtas + +[emulator] +file = emulator.elf
Signed-off-by: Laurent Vivier <lvivier@redhat.com> --- v2: check program check type (invalid instruction) add "-v" parameter to display invalid instruction address powerpc/Makefile.common | 5 +++- powerpc/emulator.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ powerpc/unittests.cfg | 3 +++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 powerpc/emulator.c