|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 8/9] x86/irqs: Move interrupt-stub generation out of C
>>> On 15.05.14 at 11:48, <andrew.cooper3@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/traps.c
> +++ b/xen/arch/x86/traps.c
> @@ -383,7 +383,7 @@ static const char *trapstr(unsigned int trapnr)
> "coprocessor segment", "invalid tss", "segment not found",
> "stack error", "general protection fault", "page fault",
> "spurious interrupt", "coprocessor error", "alignment check",
> - "machine check", "simd error"
> + "machine check", "simd error", "virtualisation error"
"virtualisation exception" please.
> @@ -534,6 +534,15 @@ int set_guest_nmi_trapbounce(void)
> return !null_trap_bounce(v, tb);
> }
>
> +void do_reserved_exception(struct cpu_user_regs *regs)
> +{
> + unsigned int trapnr = regs->entry_vector;
> +
> + DEBUGGER_trap_fatal(trapnr, regs);
> + show_execution_state(regs);
> + panic("FATAL RESERVED TRAP: vector = %d (%s)", trapnr, trapstr(trapnr));
I think I would much prefer vectors always getting printed in hex. If
you want to keep this decimal, please make it e.g.
"FATAL RESERVED TRAP #%d: %s"
> @@ -3550,6 +3556,23 @@ void __init trap_init(void)
> /* Fast trap for int80 (faster than taking the #GP-fixup path). */
> _set_gate(idt_table+0x80, DESC_TYPE_trap_gate, 3, &int80_direct_trap);
>
> + for ( vector = 0; vector < NR_VECTORS; vector++ )
> + {
> + if ( autogen_entrypoints[vector] )
> + {
> + /* Found autogenerated entry point - confirm we won't clobber an
> + * existing trap. */
> + ASSERT(idt_table[vector].b == 0);
> + set_intr_gate(vector, autogen_entrypoints[vector]);
> + }
> + else
> + {
> + /* No autogenerated entry point - confirm we have an existing
> + * trap in place. */
> + ASSERT(idt_table[vector].b != 0);
> + }
> + }
Interesting approach. The only downside is that adding proper support
for a vector will then also need to touch the auto-generation logic. But
since that ought to be rare, I suppose that's fine.
> --- a/xen/arch/x86/x86_64/entry.S
> +++ b/xen/arch/x86/x86_64/entry.S
> @@ -475,6 +475,12 @@ ENTRY(common_interrupt)
> callq do_IRQ
> jmp ret_from_intr
>
> +ENTRY(reserved_exception)
> + SAVE_ALL CLAC
> + movq %rsp,%rdi
> + callq do_reserved_exception
> + jmp ret_from_intr
> +
Shouldn't you account for an error code having got pushed by
hardware?
> @@ -716,14 +712,14 @@ ENTRY(exception_table)
> .quad do_bounds
> .quad do_invalid_op
> .quad do_device_not_available
> - .quad 0 # double_fault
> - .quad do_coprocessor_segment_overrun
> + .quad BAD_VIRT_ADDR # double_fault
> + .quad BAD_VIRT_ADDR # coproc_seg_overrun, reserved
> .quad do_invalid_TSS
> .quad do_segment_not_present
> .quad do_stack_segment
> .quad do_general_protection
> .quad do_page_fault
> - .quad do_spurious_interrupt_bug
> + .quad BAD_VIRT_ADDR # IRQ7 spurious, reserved
IRQ 7 alone is rather confusing, as we don't put IRQ 7 here. Either
say "PIC default", or name it vector 15.
> --- /dev/null
> +++ b/xen/arch/x86/x86_64/irqgen.S
> @@ -0,0 +1,72 @@
> +/* Automatically generated interrupt entry points */
> +
> +#include <xen/config.h>
> +#include <asm/asm_defns.h>
> +#include <irq_vectors.h>
> +
> +.altmacro
> +
> +/* Make a symbol by evaluating num for a real number */
> +.macro mksym name, num
> + __mksym \name, %num
> +.endm
> +.macro __mksym, name, num
> + \name\num:
> +.endm
> +
> +/* Equate a symbol with 0 by evaluating num for a real number */
> +.macro nullsym name, num
> + __nullsym \name, %num
> +.endm
> +.macro __nullsym, name, num
> + .equ \name\num\(), 0
> +.endm
> +
> +/* Create a .quad of a symbol evaluating num for a real number */
> +.macro mkquad name, num
> + __mkquad \name, %num
> +.endm
> +.macro __mkquad name, num
> + .quad \name\num
> +.endm
> +
> +/* Automatically generate stub entry points */
> +vec = 0
> +.rept NR_VECTORS
> + ALIGN
> +
> + /* Common interrupts, heading towards do_IRQ() */
> + .if vec >= FIRST_DYNAMIC_VECTOR && vec != HYPERCALL_VECTOR && vec !=
> LEGACY_SYSCALL_VECTOR
> + mksym autogen_vec_, vec
> + pushq $0
> + movb $(vec),4(%rsp)
> + jmp common_interrupt
> +
> + /* Reserved exceptions, heading towards do_reserved_exception() */
> + .elseif vec == TRAP_copro_seg || vec == TRAP_spurious_int || (vec >
> TRAP_simd_error && vec <= TRAP_last_reserved)
Double blank.
> + mksym autogen_vec_, vec
> + pushq $0
> + movb $(vec),4(%rsp)
> + jmp reserved_exception
> +
> + /* Hand generated in entry.S */
> + .else
> + nullsym autogen_vec_, vec
> + .endif
> +
> +vec = vec + 1
> +.endr
> +
> +
> +.section ".init.rodata", "a", @progbits
> +
> +/* Entry points of automatically generated subs from above */
> +GLOBAL(autogen_entrypoints)
> + vec = 0
> +
> + .rept NR_VECTORS
> + mkquad autogen_vec_, vec
> + vec = vec + 1
> + .endr
> +
> + .size autogen_entrypoints, . - autogen_entrypoints
Please settle on consistent indentation of directives.
And no, I can't see ways around the % and extra macro level.
> --- a/xen/include/asm-x86/processor.h
> +++ b/xen/include/asm-x86/processor.h
> @@ -113,6 +113,7 @@
> #define TRAP_alignment_check 17
> #define TRAP_machine_check 18
> #define TRAP_simd_error 19
> +#define TRAP_virt_error 20
And this could perhaps be TRAP_virtualisation.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |