On 5/15/19 12:02 PM, Jan Kiszka wrote: > From: Jan Kiszka <[email protected]> > > Add basic reporting of exceptions that are triggered by an inmate so > that we stop translating all of them into hypervisor-caught triple > faults. Reporting is optional and need to be enabled explicitly by an > inmate via excp_reporting_init(). > > Signed-off-by: Jan Kiszka <[email protected]> > --- > inmates/lib/x86/Makefile | 2 +- > inmates/lib/x86/excp.c | 165 > +++++++++++++++++++++++++++++++++++++++ > inmates/lib/x86/include/inmate.h | 2 + > 3 files changed, 168 insertions(+), 1 deletion(-) > create mode 100644 inmates/lib/x86/excp.c > > diff --git a/inmates/lib/x86/Makefile b/inmates/lib/x86/Makefile > index dc017b90..258eed18 100644 > --- a/inmates/lib/x86/Makefile > +++ b/inmates/lib/x86/Makefile > @@ -40,7 +40,7 @@ include $(INMATES_LIB)/Makefile.lib > > always := lib.a lib32.a > > -TARGETS := header.o ioapic.o printk.o setup.o smp.o uart.o int.o > +TARGETS := header.o ioapic.o printk.o setup.o smp.o uart.o int.o excp.o > TARGETS += ../alloc.o ../pci.o ../string.o ../cmdline.o ../setup.o > TARGETS += ../uart-8250.o ../printk.o > TARGETS_64_ONLY := mem.o pci.o timing.o > diff --git a/inmates/lib/x86/excp.c b/inmates/lib/x86/excp.c > new file mode 100644 > index 00000000..d26300a4 > --- /dev/null > +++ b/inmates/lib/x86/excp.c > @@ -0,0 +1,165 @@ > +/* > + * Jailhouse, a Linux-based partitioning hypervisor > + * > + * Copyright (c) Siemens AG, 2019 > + * > + * Authors: > + * Jan Kiszka <[email protected]> > + * > + * This work is licensed under the terms of the GNU GPL, version 2. See > + * the COPYING file in the top-level directory. > + * > + * Alternatively, you can use or redistribute this file under the following > + * BSD license: > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" > + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE > + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF > + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS > + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN > + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) > + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF > + * THE POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#include <inmate.h> > + > +struct stack_frame { > + unsigned long bp, si, dx, bx, ax; > +#ifdef __x86_64__ > + unsigned long r8, r9, r10, r11, r12, r13, r14, r15; > + unsigned long cx, di; > +#else > + unsigned long di, cx; > +#endif > + unsigned long error_code, ip, cs, flags; > +#ifdef __x86_64__ > + unsigned long sp, ss; > +#endif > +}; > + > +extern u8 excp_entry[]; > + > +void excp_reporting_init(void) > +{ > + unsigned int vector; > + u64 entry; > + > + for (vector = 0; vector < 21; vector++) { > + entry = (unsigned long)excp_entry + vector * 16; > + > + idt[vector * 2] = (entry & 0xffff) | (INMATE_CS64 << 16) | > + ((0x8e00 | (entry & 0xffff0000)) << 32); > + idt[vector * 2 + 1] = entry >> 32; > + } > +} > + > +static void __attribute__((used)) > +exception_handler(unsigned int vector, struct stack_frame *frame) > +{ > + printk("--- EXCEPTION %d ---\n", vector); > + if (vector >= 10 && vector <= 14) > + printk(" Error code: 0x%08lx\n", frame->error_code); > + printk(" CS: 0x%04lx IP: %p flags: 0x%08lx\n", > + frame->cs, (void *)frame->ip, frame->flags); > + printk(" SP: %p BP: %p\n", frame + 1, (void *)frame->bp); > + printk(" AX: %p BX: %p CX: %p\n", > + (void *)frame->ax, (void *)frame->bx, (void *)frame->bx); > + printk(" DX: %p SI: %p DI: %p\n", > + (void *)frame->dx, (void *)frame->si, (void *)frame->di); > +#ifdef __x86_64__ > + printk(" R8: %p R9: %p R10: %p\n", > + (void *)frame->r8, (void *)frame->r9, (void *)frame->r10); > + printk(" R11: %p R12: %p R13: %p\n", > + (void *)frame->r11, (void *)frame->r12, (void *)frame->r13); > + printk(" R14: %p R15: %p\n", > + (void *)frame->r14, (void *)frame->r15); > +#endif > + > + comm_region->cell_state = JAILHOUSE_CELL_FAILED;
Maybe we should set the failed state at the beginning of this routine. We won't be able to enter fail state if any other errors occur during printk. Ralf > + stop(); > +} > + > +asm( > +".macro excp_prologue vector\n\t" > + "push $0\n\t" > + "excp_error_prologue vector\n\t" > +".endm\n" > + > +".macro excp_error_prologue vector\n\t" > +#ifdef __x86_64__ > + "push %rdi\n\t" > + "mov $vector,%rdi\n\t" > +#else > + "push %ecx\n\t" > + "mov $vector,%ecx\n\t" > +#endif > + "jmp excp_common\n" > + ".balign 16\n\t" > +".endm\n\t" > + > + ".global excp_entry\n\t" > + ".balign 16\n" > +"excp_entry:\n" > +"vector=0\n" > +".rept 8\n" > + "excp_prologue vector\n\t" > + "vector=vector+1\n\t" > +".endr\n" > + "excp_error_prologue 8 \n\t" > + "excp_prologue 9\n\t" > +"vector=10\n" > +".rept 5\n" > + "excp_error_prologue vector\n\t" > + "vector=vector+1\n\t" > +".endr\n" > + "excp_prologue 15\n\t" > + "excp_prologue 16\n\t" > + "excp_error_prologue 17\n\t" > + "excp_prologue 18\n\t" > + "excp_prologue 19\n\t" > + "excp_prologue 20\n\t" > + > +"excp_common:\n\t" > +#ifdef __x86_64__ > + "push %rcx\n\t" > + "push %r15\n\t" > + "push %r14\n\t" > + "push %r13\n\t" > + "push %r12\n\t" > + "push %r11\n\t" > + "push %r10\n\t" > + "push %r9\n\t" > + "push %r8\n\t" > + "push %rax\n\t" > + "push %rbx\n\t" > + "push %rdx\n\t" > + "push %rsi\n\t" > + "push %rbp\n\t" > + "mov %rsp,%rsi\n\t" > +#else > + "push %edi\n\t" > + "push %eax\n\t" > + "push %ebx\n\t" > + "push %edx\n\t" > + "push %esi\n\t" > + "push %ebp\n\t" > + "mov %esp,%edx\n\t" > +#endif > + > + "jmp exception_handler\n\t" > +); > diff --git a/inmates/lib/x86/include/inmate.h > b/inmates/lib/x86/include/inmate.h > index 07a6275b..7664570d 100644 > --- a/inmates/lib/x86/include/inmate.h > +++ b/inmates/lib/x86/include/inmate.h > @@ -222,6 +222,8 @@ static inline unsigned int cpu_id(void) > > extern unsigned long idt[]; > > +void excp_reporting_init(void); > + > typedef void(*int_handler_t)(void); > > void int_init(void); > -- > 2.16.4 > -- You received this message because you are subscribed to the Google Groups "Jailhouse" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/jailhouse-dev/2c0d76b2-4085-e87b-624e-485000ed0224%40oth-regensburg.de. For more options, visit https://groups.google.com/d/optout.
