Changes in / [e3038b4:05e3cb8] in mainline


Ignore:
Location:
kernel
Files:
5 added
1 deleted
37 edited

Legend:

Unmodified
Added
Removed
  • kernel/Makefile

    re3038b4 r05e3cb8  
    201201        generic/src/debug/symtab.c \
    202202        generic/src/debug/stacktrace.c \
    203         generic/src/debug/panic.c \
    204203        generic/src/interrupt/interrupt.c \
    205204        generic/src/main/main.c \
  • kernel/arch/abs32le/src/abs32le.c

    re3038b4 r05e3cb8  
    114114}
    115115
    116 void istate_decode(istate_t *istate)
     116void panic_printf(const char *fmt, ...)
    117117{
    118         (void) istate;
     118        va_list args;
     119       
     120        va_start(args, fmt);
     121        vprintf(fmt, args);
     122        va_end(args);
     123       
     124        halt();
    119125}
    120126
  • kernel/arch/amd64/include/interrupt.h

    re3038b4 r05e3cb8  
    112112extern void (* eoi_function)(void);
    113113
     114extern void decode_istate(int n, istate_t *istate);
    114115extern void interrupt_init(void);
    115116extern void trap_virtual_enable_irqs(uint16_t irqmask);
  • kernel/arch/amd64/include/types.h

    re3038b4 r05e3cb8  
    5050} fncptr_t;
    5151
    52 /* Formats for uintptr_t, size_t */
     52/**< Formats for uintptr_t, size_t */
    5353#define PRIp  "llx"
    5454#define PRIs  "llu"
    5555
    56 /* Formats for (u)int8_t, (u)int16_t, (u)int32_t, (u)int64_t and (u)native_t */
     56/**< Formats for (u)int8_t, (u)int16_t, (u)int32_t, (u)int64_t and (u)native_t */
    5757#define PRId8   "d"
    5858#define PRId16  "d"
  • kernel/arch/amd64/src/asm_utils.S

    re3038b4 r05e3cb8  
    5151.global interrupt_handlers
    5252.global syscall_entry
     53.global panic_printf
     54
     55panic_printf:
     56        movabsq $halt, %rax
     57        movq %rax, (%rsp)
     58        jmp printf
     59
    5360.global cpuid
    5461.global has_cpuid
     
    227234        save_all_gpr
    228235        cld
    229 
    230         #
    231         # Stop stack traces here if we came from userspace.
    232         #
    233         movq %cs, %rax
    234         xorq %rdx, %rdx
    235         cmpq %rax, IREGISTER_SPACE+16(%rsp)
    236         cmovneq %rdx, %rbp
    237 
    238         movq $(\i), %rdi        # %rdi - first parameter
    239         movq %rsp, %rsi         # %rsi - pointer to istate
    240         call exc_dispatch       # exc_dispatch(i, istate)
     236       
     237        # Stop stack traces here
     238        xorq %rbp, %rbp
     239       
     240        movq $(\i), %rdi    # %rdi - first parameter
     241        movq %rsp, %rsi     # %rsi - pointer to istate
     242        call exc_dispatch   # exc_dispatch(i, istate)
    241243       
    242244        restore_all_gpr
     
    288290        pushq %rcx
    289291        pushq %r11
    290         pushq %rbp
    291 
    292         xorq %rbp, %rbp         # stop the stack traces here
    293 
    294         movq %r10, %rcx         # Copy the 4th argument where it is expected
     292       
     293        movq %r10, %rcx   # Copy the 4th argument where it is expected
    295294        pushq %rax
    296295        call syscall_handler
    297296        addq $8, %rsp
    298                
    299         popq %rbp
     297       
    300298        popq %r11
    301299        popq %rcx
  • kernel/arch/amd64/src/interrupt.c

    re3038b4 r05e3cb8  
    6363void (* eoi_function)(void) = NULL;
    6464
    65 void istate_decode(istate_t *istate)
    66 {
    67         printf("error_word=%#llx\n", istate->error_word);
    68         printf("cs =%#0.16llx\trflags=%#0.16llx\n", istate->cs,
    69             istate->rflags);
    70         printf("rax=%#0.16llx\trbx=%#0.16llx\trcx=%#0.16llx\n", istate->rax,
     65void decode_istate(int n, istate_t *istate)
     66{
     67        const char *symbol = symtab_fmt_name_lookup(istate->rip);
     68       
     69        printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n", n, __func__);
     70        printf("%%rip: %#llx (%s)\n", istate->rip, symbol);
     71        printf("ERROR_WORD=%#llx\n", istate->error_word);
     72        printf("%%cs=%#llx, rflags=%#llx, %%cr0=%#llx\n", istate->cs,
     73            istate->rflags, read_cr0());
     74        printf("%%rax=%#llx, %%rcx=%#llx, %%rdx=%#llx\n", istate->rax,
    7175            istate->rcx, istate->rdx);
    72         printf("rsi=%#0.16llx\trdi=%#0.16llx\tr8 =%#0.16llx\n", istate->rsi,
     76        printf("%%rsi=%#llx, %%rdi=%#llx, %%r8=%#llx\n", istate->rsi,
    7377            istate->rdi, istate->r8);
    74         printf("r9 =%#0.16llx\tr10=%#0.16llx\tr11=%#0.16llx\n", istate->r9,
     78        printf("%%r9=%#llx, %%r10=%#llx, %%r11=%#llx\n", istate->r9,
    7579            istate->r10, istate->r11);
     80        printf("%%rsp=%#llx\n", &istate->stack[0]);
     81       
     82        stack_trace_istate(istate);
    7683}
    7784
     
    8895{
    8996        fault_if_from_uspace(istate, "Unserviced interrupt: %u.", n);
    90         panic_badtrap(istate, n, "Unserviced interrupt.");
     97        decode_istate(n, istate);
     98        panic("Unserviced interrupt.");
    9199}
    92100
     
    94102{
    95103        fault_if_from_uspace(istate, "Divide error.");
    96         panic_badtrap(istate, n, "Divide error.");
     104        decode_istate(n, istate);
     105        panic("Divide error.");
    97106}
    98107
     
    120129                fault_if_from_uspace(istate, "General protection fault.");
    121130        }
    122         panic_badtrap(istate, n, "General protection fault.");
     131       
     132        decode_istate(n, istate);
     133        panic("General protection fault.");
    123134}
    124135
     
    126137{
    127138        fault_if_from_uspace(istate, "Stack fault.");
    128         panic_badtrap(istate, n, "Stack fault.");
     139        decode_istate(n, istate);
     140        panic("Stack fault.");
    129141}
    130142
  • kernel/arch/amd64/src/mm/page.c

    re3038b4 r05e3cb8  
    8989       
    9090        if (as_page_fault(page, access, istate) == AS_PF_FAULT) {
    91                 fault_if_from_uspace(istate, "Page fault: %#x.", page);
    92                 panic_memtrap(istate, access, page, "Page fault.");
     91                fault_if_from_uspace(istate, "Page fault: %p.", page);
     92                decode_istate(n, istate);
     93                panic("Page fault: %p", page);
    9394        }
    9495}
  • kernel/arch/arm32/Makefile.inc

    re3038b4 r05e3cb8  
    4646        arch/$(KARCH)/src/context.S \
    4747        arch/$(KARCH)/src/dummy.S \
     48        arch/$(KARCH)/src/panic.S \
    4849        arch/$(KARCH)/src/cpu/cpu.c \
    4950        arch/$(KARCH)/src/ddi/ddi.c \
  • kernel/arch/arm32/include/exception.h

    re3038b4 r05e3cb8  
    2828 */
    2929
    30 /** @addtogroup arm32
     30/** @addtogroup arm32   
    3131 * @{
    3232 */
     
    141141extern void install_exception_handlers(void);
    142142extern void exception_init(void);
     143extern void print_istate(istate_t *istate);
    143144extern void reset_exception_entry(void);
    144145extern void irq_exception_entry(void);
  • kernel/arch/arm32/src/exc_handler.S

    re3038b4 r05e3cb8  
    9898        stmfd r13!, {r13, lr}^
    9999        stmfd r13!, {r2}
    100 
    101         # Stop stack traces here
    102         mov fp, #0
    103        
    104100        b 2f
    105101
     
    127123        stmfd r13!, {r2}
    1281242:
     125        # Stop stack traces here
     126        mov fp, #0
    129127.endm
    130128
  • kernel/arch/arm32/src/exception.c

    re3038b4 r05e3cb8  
    173173 * @param istate Structure to be printed.
    174174 */
    175 void istate_decode(istate_t *istate)
     175void print_istate(istate_t *istate)
    176176{
    177         printf("r0 =%#0.8lx\tr1 =%#0.8lx\tr2 =%#0.8lx\tr3 =%#0.8lx\n",
     177        printf("istate dump:\n");
     178       
     179        printf(" r0: %x    r1: %x    r2: %x    r3: %x\n",
    178180            istate->r0, istate->r1, istate->r2, istate->r3);
    179         printf("r4 =%#0.8lx\tr5 =%#0.8lx\tr6 =%#0.8lx\tr7 =%#0.8lx\n",
     181        printf(" r4: %x    r5: %x    r6: %x    r7: %x\n",
    180182            istate->r4, istate->r5, istate->r6, istate->r7);
    181         printf("r8 =%#0.8lx\tr9 =%#0.8lx\tr10=%#0.8lx\tfp =%#0.8lx\n",
     183        printf(" r8: %x    r8: %x   r10: %x    fp: %x\n",
    182184            istate->r8, istate->r9, istate->r10, istate->fp);
    183         printf("r12=%#0.8lx\tsp =%#0.8lx\tlr =%#0.8lx\tspsr=%#0.8lx\n",
     185        printf(" r12: %x    sp: %x    lr: %x  spsr: %x\n",
    184186            istate->r12, istate->sp, istate->lr, istate->spsr);
     187       
     188        printf(" pc: %x\n", istate->pc);
     189
     190        stack_trace_istate(istate);
    185191}
    186192
  • kernel/arch/arm32/src/mm/page.c

    re3038b4 r05e3cb8  
    2727 */
    2828
    29 /** @addtogroup arm32mm
     29/** @addtogroup arm32mm 
    3030 * @{
    3131 */
  • kernel/arch/arm32/src/mm/page_fault.c

    re3038b4 r05e3cb8  
    183183        if (ret == AS_PF_FAULT) {
    184184                fault_if_from_uspace(istate, "Page fault: %#x.", badvaddr);
    185                 panic_memtrap(istate, access, badvaddr, "Page fault.");
     185                print_istate(istate);
     186                printf("page fault - pc: %x, va: %x, status: %x(%x), "
     187                    "access:%d\n", istate->pc, badvaddr, fsr.status, fsr,
     188                    access);
     189               
     190                panic("Page fault.");
    186191        }
    187192}
     
    198203
    199204        if (ret == AS_PF_FAULT) {
    200                 panic_memtrap(istate, PF_ACCESS_EXEC, istate->pc,
    201                     "Page fault - prefetch_abort.");
     205                printf("prefetch_abort\n");
     206                print_istate(istate);
     207                panic("page fault - prefetch_abort at address: %x.",
     208                    istate->pc);
    202209        }
    203210}
  • kernel/arch/ia32/Makefile.inc

    re3038b4 r05e3cb8  
    7676ARCH_SOURCES = \
    7777        arch/$(KARCH)/src/context.S \
     78        arch/$(KARCH)/src/debug/panic.s \
    7879        arch/$(KARCH)/src/debug/stacktrace.c \
    7980        arch/$(KARCH)/src/debug/stacktrace_asm.S \
  • kernel/arch/ia32/include/interrupt.h

    re3038b4 r05e3cb8  
    113113extern void (* eoi_function)(void);
    114114
     115extern void decode_istate(istate_t *istate);
    115116extern void interrupt_init(void);
    116117extern void trap_virtual_enable_irqs(uint16_t irqmask);
  • kernel/arch/ia32/src/asm.S

    re3038b4 r05e3cb8  
    163163        pushl %edi      # remember return user address
    164164
    165         xorl %ebp, %ebp # stop stack traces here
    166 
    167165        pushl %gs       # remember TLS
    168166
     
    198196# and call exc_dispatch().
    199197#
    200 #define INTERRUPT_ALIGN 128
     198#define INTERRUPT_ALIGN 64
    201199.macro handler i n
    202200       
     
    226224                movw %ax, %ds
    227225                movw %ax, %es
    228        
    229                 xorl %ebp, %ebp
    230 
     226               
    231227                cld
    232228                sti
     
    234230                call syscall_handler
    235231                cli
    236 
    237                 movl 20(%esp), %ebp     # restore EBP
    238                 addl $28, %esp          # clean-up of parameters
     232                addl $28, %esp         # clean-up of parameters
    239233               
    240234                popl %gs
     
    286280                movw %ax, %es
    287281               
    288                 # stop stack traces here if we came from userspace
    289                 cmpl $8, 40(%esp)
    290                 jz 0f
     282                # stop stack traces here
    291283                xorl %ebp, %ebp
    292 
    293 0:             
     284               
    294285                pushl %esp          # *istate
    295286                pushl $(\i)         # intnum
  • kernel/arch/ia32/src/interrupt.c

    re3038b4 r05e3cb8  
    6363void (* eoi_function)(void) = NULL;
    6464
    65 void istate_decode(istate_t *istate)
    66 {
    67         printf("error_word=%#lx\n", istate->error_word);
    68         printf("cs =%#0.8lx\teflags=%#0.8lx\n", istate->cs, istate->eflags);
    69         printf("eax=%#0.8lx\tecx=%#0.8lx\tedx=%#0.8lx\n",
    70             istate->eax, istate->ecx, istate->edx);
     65void decode_istate(istate_t *istate)
     66{
     67        const char *symbol = symtab_fmt_name_lookup(istate->eip);
     68       
     69        if (CPU)
     70                printf("----------------EXCEPTION OCCURED (cpu%u)----------------\n", CPU->id);
     71        else
     72                printf("----------------EXCEPTION OCCURED----------------\n");
     73       
     74        printf("%%eip: %#lx (%s)\n", istate->eip, symbol);
     75        printf("ERROR_WORD=%#lx\n", istate->error_word);
     76        printf("%%cs=%#lx,flags=%#lx\n", istate->cs, istate->eflags);
     77        printf("%%eax=%#lx, %%ecx=%#lx, %%edx=%#lx, %%esp=%p\n", istate->eax, istate->ecx, istate->edx, &istate->stack[0]);
     78        printf("stack: %#lx, %#lx, %#lx, %#lx\n", istate->stack[0], istate->stack[1], istate->stack[2], istate->stack[3]);
     79        printf("       %#lx, %#lx, %#lx, %#lx\n", istate->stack[4], istate->stack[5], istate->stack[6], istate->stack[7]);
     80       
     81        stack_trace_istate(istate);
    7182}
    7283
     
    8394{
    8495        fault_if_from_uspace(istate, "Unserviced interrupt: %u.", n);
    85         panic_badtrap(istate, n, "Unserviced interrupt: %u.", n);
     96       
     97        decode_istate(istate);
     98        panic("Unserviced interrupt: %u.", n);
    8699}
    87100
     
    89102{
    90103        fault_if_from_uspace(istate, "Divide error.");
    91         panic_badtrap(istate, n, "Divide error.");
     104       
     105        decode_istate(istate);
     106        panic("Divide error.");
    92107}
    93108
     
    113128                fault_if_from_uspace(istate, "General protection fault.");
    114129        }
    115         panic_badtrap(istate, n, "General protection fault.");
     130       
     131        decode_istate(istate);
     132        panic("General protection fault.");
    116133}
    117134
     
    119136{
    120137        fault_if_from_uspace(istate, "Stack fault.");
    121         panic_badtrap(istate, n, "Stack fault.");
     138       
     139        decode_istate(istate);
     140        panic("Stack fault.");
    122141}
    123142
     
    130149        );
    131150       
    132         fault_if_from_uspace(istate, "SIMD FP exception(19), MXCSR=%#0.8x.",
     151        fault_if_from_uspace(istate, "SIMD FP exception(19), MXCSR: %#zx.",
    133152            (unative_t) mxcsr);
    134         panic_badtrap(istate, n, "SIMD FP exception, MXCSR=%#0.8x");
     153       
     154        decode_istate(istate);
     155        printf("MXCSR: %#lx\n", mxcsr);
     156        panic("SIMD FP exception(19).");
    135157}
    136158
     
    142164#else
    143165        fault_if_from_uspace(istate, "FPU fault.");
    144         panic_badtrap(istate, n, "FPU fault.");
     166        panic("FPU fault.");
    145167#endif
    146168}
  • kernel/arch/ia32/src/mm/page.c

    re3038b4 r05e3cb8  
    115115        if (as_page_fault(page, access, istate) == AS_PF_FAULT) {
    116116                fault_if_from_uspace(istate, "Page fault: %#x.", page);
    117                 panic_memtrap(istate, access, page, "Page fault.");
     117               
     118                decode_istate(istate);
     119                printf("page fault address: %#lx\n", page);
     120                panic("Page fault.");
    118121        }
    119122}
  • kernel/arch/ia64/src/asm.S

    re3038b4 r05e3cb8  
    137137        br cpu_halt
    138138
     139.global panic_printf
     140panic_printf:
     141        {
     142                br.call.sptk.many b0=printf
     143        }
     144        br halt
     145
    139146/** Switch to userspace - low level code.
    140147 *
  • kernel/arch/ia64/src/interrupt.c

    re3038b4 r05e3cb8  
    133133}
    134134
    135 void istate_decode(istate_t *istate)
    136 {
     135static void dump_interrupted_context(istate_t *istate)
     136{
     137        putchar('\n');
     138        printf("Interrupted context dump:\n");
    137139        printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp,
    138140            istate->ar_bspstore);
     
    181183       
    182184        fault_if_from_uspace(istate, "General Exception (%s).", desc);
    183         panic_badtrap(istate, vector, "General Exception (%s).", desc);
     185       
     186        dump_interrupted_context(istate);
     187        panic("General Exception (%s).", desc);
    184188}
    185189
     
    191195        fault_if_from_uspace(istate, "Interruption: %#hx (%s).",
    192196            (uint16_t) vector, vector_to_string(vector));
    193         panic_badtrap(istate, vector, "Interruption: %#hx (%s).",
    194             (uint16_t) vector, vector_to_string(vector));
     197        dump_interrupted_context(istate);
     198        panic("Interruption: %#hx (%s).", (uint16_t) vector,
     199            vector_to_string(vector));
    195200#endif
    196201}
     
    221226        fault_if_from_uspace(istate, "Interruption: %#hx (%s).",
    222227            (uint16_t) vector, vector_to_string(vector));
    223         panic_badtrap(istate, vector, "Interruption: %#hx (%s).",
    224             (uint16_t) vector, vector_to_string(vector));
     228        dump_interrupted_context(istate);
     229        panic("Interruption: %#hx (%s).", (uint16_t) vector,
     230            vector_to_string(vector));
    225231}
    226232
  • kernel/arch/ia64/src/mm/tlb.c

    re3038b4 r05e3cb8  
    500500                if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) {
    501501                        fault_if_from_uspace(istate, "Page fault at %p.", va);
    502                         panic_memtrap(istate, PF_ACCESS_EXEC, va,
    503                             "Page fault.");
     502                        panic("%s: va=%p, rid=%d, iip=%p.", __func__, va, rid,
     503                            istate->cr_iip);
    504504                }
    505505        }
     
    622622                if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) {
    623623                        fault_if_from_uspace(istate, "Page fault at %p.", va);
    624                         panic_memtrap(istate, PF_ACCESS_READ, va,
    625                             "Page fault.");
     624                        panic("%s: va=%p, rid=%d, iip=%p.", __func__, va, rid,
     625                            istate->cr_iip);
    626626                }
    627627        }
     
    671671                if (as_page_fault(va, PF_ACCESS_WRITE, istate) == AS_PF_FAULT) {
    672672                        fault_if_from_uspace(istate, "Page fault at %p.", va);
    673                         panic_memtrap(istate, PF_ACCESS_WRITE, va,
    674                             "Page fault.");
     673                        panic("%s: va=%p, rid=%d, iip=%p.", __func__, va, rid,
     674                            istate->cr_iip);
    675675                }
    676676        }
     
    708708                if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) {
    709709                        fault_if_from_uspace(istate, "Page fault at %p.", va);
    710                         panic_memtrap(istate, PF_ACCESS_EXEC, va,
    711                             "Page fault.");
     710                        panic("%s: va=%p, rid=%d, iip=%p.", __func__, va, rid,
     711                            istate->cr_iip);
    712712                }
    713713        }
     
    745745                if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) {
    746746                        fault_if_from_uspace(istate, "Page fault at %p.", va);
    747                         panic_memtrap(istate, PF_ACCESS_READ, va,
    748                             "Page fault.");
     747                        panic("%s: va=%p, rid=%d, iip=%p.", __func__, va, rid,
     748                            istate->cr_iip);
    749749                }
    750750        }
     
    778778        if (as_page_fault(va, PF_ACCESS_WRITE, istate) == AS_PF_FAULT) {
    779779                fault_if_from_uspace(istate, "Page fault at %p.", va);
    780                 panic_memtrap(istate, PF_ACCESS_WRITE, va, "Page fault.");
     780                panic("%s: va=%p, rid=%d, iip=%p.", __func__, va, rid,
     781                    istate->cr_iip);
    781782        }
    782783        page_table_unlock(AS, true);
     
    818819                if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) {
    819820                        fault_if_from_uspace(istate, "Page fault at %p.", va);
    820                         panic_memtrap(istate, PF_ACCESS_READ, va,
    821                             "Page fault.");
     821                        panic("%s: va=%p, rid=%d.", __func__, va, rid);
    822822                }
    823823        }
  • kernel/arch/mips32/Makefile.inc

    re3038b4 r05e3cb8  
    5454        arch/$(KARCH)/src/start.S \
    5555        arch/$(KARCH)/src/context.S \
     56        arch/$(KARCH)/src/panic.S \
    5657        arch/$(KARCH)/src/mips32.c \
    5758        arch/$(KARCH)/src/asm.S \
  • kernel/arch/mips32/src/exception.c

    re3038b4 r05e3cb8  
    7272};
    7373
    74 void istate_decode(istate_t *istate)
     74static void print_regdump(istate_t *istate)
    7575{
    76         printf("at=%p\tv0=%p\tv1=%p\n", istate->at, istate->v0, istate->v1);
    77         printf("a0=%p\ta1=%p\ta2=%p\n", istate->a0, istate->a1, istate->a2);
    78         printf("a3=%p\tt0=%p\tt1=%p\n", istate->a3, istate->t0, istate->t1);
    79         printf("t2=%p\tt3=%p\tt4=%p\n", istate->t2, istate->t3, istate->t4);
    80         printf("t5=%p\tt6=%p\tt7=%p\n", istate->t5, istate->t6, istate->t7);
    81         printf("t8=%p\tt9=%p\tgp=%p\n", istate->t8, istate->t9, istate->gp);
    82         printf("sp=%p\tra=%p\t\n", istate->sp, istate->ra);
    83         printf("lo=%p\thi=%p\t\n", istate->lo, istate->hi);
    84         printf("cp0_status=%p\tcp0_epc=%p\tk1=%p\n",
    85             istate->status, istate->epc, istate->k1);
     76        printf("PC: %#x(%s) RA: %#x(%s), SP(%p)\n", istate->epc,
     77            symtab_fmt_name_lookup(istate->epc), istate->ra,
     78            symtab_fmt_name_lookup(istate->ra), istate->sp);
    8679}
    8780
     
    8982{
    9083        fault_if_from_uspace(istate, "Unhandled exception %s.", exctable[n]);
    91         panic_badtrap(istate, n, "Unhandled exception %s.", exctable[n]);
     84       
     85        print_regdump(istate);
     86        panic("Unhandled exception %s.", exctable[n]);
    9287}
    9388
     
    130125                scheduler_fpu_lazy_request();
    131126        else {
    132                 fault_if_from_uspace(istate,
    133                     "Unhandled Coprocessor Unusable Exception.");
    134                 panic_badtrap(istate, n,
    135                     "Unhandled Coprocessor Unusable Exception.");
     127                fault_if_from_uspace(istate, "Unhandled Coprocessor Unusable Exception.");
     128                panic("Unhandled Coprocessor Unusable Exception.");
    136129        }
    137130}
     
    169162static void syscall_exception(unsigned int n, istate_t *istate)
    170163{
    171         fault_if_from_uspace(istate, "Syscall is handled through shortcut.");
     164        panic("Syscall is handled through shortcut.");
    172165}
    173166
  • kernel/arch/mips32/src/mm/tlb.c

    re3038b4 r05e3cb8  
    321321void tlb_refill_fail(istate_t *istate)
    322322{
    323         uintptr_t va = cp0_badvaddr_read();
    324        
    325         fault_if_from_uspace(istate, "TLB Refill Exception on %p.", va);
    326         panic_memtrap(istate, PF_ACCESS_READ, va, "TLB Refill Exception.");
     323        const char *symbol = symtab_fmt_name_lookup(istate->epc);
     324        const char *sym2 = symtab_fmt_name_lookup(istate->ra);
     325       
     326        fault_if_from_uspace(istate, "TLB Refill Exception on %p.",
     327            cp0_badvaddr_read());
     328        panic("%x: TLB Refill Exception at %x (%s<-%s).", cp0_badvaddr_read(),
     329            istate->epc, symbol, sym2);
    327330}
    328331
     
    330333void tlb_invalid_fail(istate_t *istate)
    331334{
    332         uintptr_t va = cp0_badvaddr_read();
    333        
    334         fault_if_from_uspace(istate, "TLB Invalid Exception on %p.", va);
    335         panic_memtrap(istate, PF_ACCESS_READ, va, "TLB Invalid Exception.");
     335        const char *symbol = symtab_fmt_name_lookup(istate->epc);
     336       
     337        fault_if_from_uspace(istate, "TLB Invalid Exception on %p.",
     338            cp0_badvaddr_read());
     339        panic("%x: TLB Invalid Exception at %x (%s).", cp0_badvaddr_read(),
     340            istate->epc, symbol);
    336341}
    337342
    338343void tlb_modified_fail(istate_t *istate)
    339344{
    340         uintptr_t va = cp0_badvaddr_read();
    341        
    342         fault_if_from_uspace(istate, "TLB Modified Exception on %p.", va);
    343         panic_memtrap(istate, PF_ACCESS_WRITE, va, "TLB Modified Exception.");
     345        const char *symbol = symtab_fmt_name_lookup(istate->epc);
     346       
     347        fault_if_from_uspace(istate, "TLB Modified Exception on %p.",
     348            cp0_badvaddr_read());
     349        panic("%x: TLB Modified Exception at %x (%s).", cp0_badvaddr_read(),
     350            istate->epc, symbol);
    344351}
    345352
  • kernel/arch/ppc32/Makefile.inc

    re3038b4 r05e3cb8  
    4040ARCH_SOURCES = \
    4141        arch/$(KARCH)/src/context.S \
     42        arch/$(KARCH)/src/debug/panic.s \
    4243        arch/$(KARCH)/src/debug/stacktrace.c \
    4344        arch/$(KARCH)/src/debug/stacktrace_asm.S \
  • kernel/arch/ppc32/include/types.h

    re3038b4 r05e3cb8  
    5050} fncptr_t;
    5151
    52 /** Formats for uintptr_t, size_t */
     52/**< Formats for uintptr_t, size_t */
    5353#define PRIp  "x"
    5454#define PRIs  "u"
    5555
    56 /** Formats for (u)int8_t, (u)int16_t, (u)int32_t, (u)int64_t and (u)native_t */
     56/**< Formats for (u)int8_t, (u)int16_t, (u)int32_t, (u)int64_t and (u)native_t */
    5757#define PRId8   "d"
    5858#define PRId16  "d"
  • kernel/arch/ppc32/src/interrupt.c

    re3038b4 r05e3cb8  
    5050                :: [dec] "r" (1000)
    5151        );
    52 }
    53 
    54 void istate_decode(istate_t *istate)
    55 {
    56         printf("r0 =%p\tr1 =%p\tr2 =%p\n", istate->r0, istate->sp, istate->r2);
    57         printf("r3 =%p\tr4 =%p\tr5 =%p\n", istate->r3, istate->r4, istate->r5);
    58         printf("r6 =%p\tr7 =%p\tr8 =%p\n", istate->r6, istate->r7, istate->r8);
    59         printf("r9 =%p\tr10=%p\tr11=%p\n",
    60             istate->r9, istate->r10, istate->r11);
    61         printf("r12=%p\tr13=%p\tr14=%p\n",
    62             istate->r12, istate->r13, istate->r14);
    63         printf("r15=%p\tr16=%p\tr17=%p\n",
    64             istate->r15, istate->r16, istate->r17);
    65         printf("r18=%p\tr19=%p\tr20=%p\n",
    66             istate->r18, istate->r19, istate->r20);
    67         printf("r21=%p\tr22=%p\tr23=%p\n",
    68             istate->r21, istate->r22, istate->r23);
    69         printf("r24=%p\tr25=%p\tr26=%p\n",
    70             istate->r24, istate->r25, istate->r26);
    71         printf("r27=%p\tr28=%p\tr29=%p\n",
    72             istate->r27, istate->r28, istate->r29);
    73         printf("r30=%p\tr31=%p\n", istate->r30, istate->r31);
    74         printf("cr =%p\tpc =%p\tlr =%p\n", istate->cr, istate->pc, istate->lr);
    75         printf("ctr=%p\txer=%p\tdar=%p\n",
    76             istate->ctr, istate->xer, istate->dar);
    77         printf("srr1=%p\n", istate->srr1);
    7852}
    7953
  • kernel/arch/ppc32/src/mm/tlb.c

    re3038b4 r05e3cb8  
    111111static void pht_refill_fail(uintptr_t badvaddr, istate_t *istate)
    112112{
    113         fault_if_from_uspace(istate, "PHT Refill Exception on %p.", badvaddr);
    114         panic_memtrap(istate, PF_ACCESS_READ, badvaddr,
    115             "PHT Refill Exception.");
     113        const char *symbol = symtab_fmt_name_lookup(istate->pc);
     114        const char *sym2 = symtab_fmt_name_lookup(istate->lr);
     115       
     116        fault_if_from_uspace(istate,
     117            "PHT Refill Exception on %p.", badvaddr);
     118        panic("%p: PHT Refill Exception at %p (%s<-%s).", badvaddr,
     119            istate->pc, symbol, sym2);
    116120}
    117121
  • kernel/arch/sparc64/Makefile.inc

    re3038b4 r05e3cb8  
    6464        arch/$(KARCH)/src/asm.S \
    6565        arch/$(KARCH)/src/$(USARCH)/asm.S \
     66        arch/$(KARCH)/src/panic.S \
    6667        arch/$(KARCH)/src/console.c \
    6768        arch/$(KARCH)/src/context.S \
  • kernel/arch/sparc64/include/types.h

    re3038b4 r05e3cb8  
    5252typedef uint8_t asi_t;
    5353
    54 /** Formats for uintptr_t, size_t */
     54/**< Formats for uintptr_t, size_t */
    5555#define PRIp  "llx"
    5656#define PRIs  "llu"
    5757
    58 /** Formats for (u)int8_t, (u)int16_t, (u)int32_t, (u)int64_t and (u)native_t */
     58/**< Formats for (u)int8_t, (u)int16_t, (u)int32_t, (u)int64_t and (u)native_t */
    5959#define PRId8   "d"
    6060#define PRId16  "d"
  • kernel/arch/sparc64/src/mm/sun4u/tlb.c

    re3038b4 r05e3cb8  
    2727 */
    2828
    29 /** @addtogroup sparc64mm
     29/** @addtogroup sparc64mm       
    3030 * @{
    3131 */
     
    5858static void dtlb_pte_copy(pte_t *, size_t, bool);
    5959static void itlb_pte_copy(pte_t *, size_t);
    60 static void do_fast_instruction_access_mmu_miss_fault(istate_t *, uintptr_t,
    61     const char *);
     60static void do_fast_instruction_access_mmu_miss_fault(istate_t *, const char *);
    6261static void do_fast_data_access_mmu_miss_fault(istate_t *, tlb_tag_access_reg_t,
    6362    const char *);
     
    223222                 * Forward the page fault to the address space page fault
    224223                 * handler.
    225                  */
     224                 */             
    226225                page_table_unlock(AS, true);
    227226                if (as_page_fault(page_16k, PF_ACCESS_EXEC, istate) ==
    228227                    AS_PF_FAULT) {
    229228                        do_fast_instruction_access_mmu_miss_fault(istate,
    230                             istate->tpc, __func__);
     229                            __func__);
    231230                }
    232231        }
     
    259258                        /* NULL access in kernel */
    260259                        do_fast_data_access_mmu_miss_fault(istate, tag,
    261                             "Dereferencing NULL pointer");
     260                            __func__);
    262261                } else if (page_8k >= end_of_identity) {
    263262                        /*
     
    439438
    440439void do_fast_instruction_access_mmu_miss_fault(istate_t *istate,
    441     uintptr_t va, const char *str)
    442 {
    443         fault_if_from_uspace(istate, "%s, Address=%p.", str, va);
    444         panic_memtrap(istate, PF_ACCESS_EXEC, va, "%s.", str);
     440    const char *str)
     441{
     442        fault_if_from_uspace(istate, "%s.", str);
     443        dump_istate(istate);
     444        panic("%s.", str);
    445445}
    446446
     
    451451
    452452        va = tag.vpn << MMU_PAGE_WIDTH;
    453         fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str, va,
    454             tag.context);
    455         panic_memtrap(istate, PF_ACCESS_READ, va, "%s.", str);
     453        if (tag.context) {
     454                fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str, va,
     455                    tag.context);
     456        }
     457        dump_istate(istate);
     458        printf("Faulting page: %p, ASID=%d.\n", va, tag.context);
     459        panic("%s.", str);
    456460}
    457461
     
    462466
    463467        va = tag.vpn << MMU_PAGE_WIDTH;
    464         fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str, va,
    465             tag.context);
    466         panic_memtrap(istate, PF_ACCESS_WRITE, va, "%s.", str);
     468
     469        if (tag.context) {
     470                fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str, va,
     471                    tag.context);
     472        }
     473        printf("Faulting page: %p, ASID=%d\n", va, tag.context);
     474        dump_istate(istate);
     475        panic("%s.", str);
    467476}
    468477
  • kernel/arch/sparc64/src/mm/sun4v/tlb.c

    re3038b4 r05e3cb8  
    2828 */
    2929
    30 /** @addtogroup sparc64mm
     30/** @addtogroup sparc64mm       
    3131 * @{
    3232 */
     
    6262static void itlb_pte_copy(pte_t *);
    6363static void dtlb_pte_copy(pte_t *, bool);
    64 static void do_fast_instruction_access_mmu_miss_fault(istate_t *, uintptr_t,
    65     const char *);
     64static void do_fast_instruction_access_mmu_miss_fault(istate_t *, const char *);
    6665static void do_fast_data_access_mmu_miss_fault(istate_t *, uint64_t,
    6766    const char *);
     
    236235                 * Forward the page fault to the address space page fault
    237236                 * handler.
    238                  */
     237                 */             
    239238                page_table_unlock(AS, true);
    240239                if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) {
    241240                        do_fast_instruction_access_mmu_miss_fault(istate,
    242                             istate->tpc, __func__);
     241                            __func__);
    243242                }
    244243        }
     
    355354}
    356355
    357 void do_fast_instruction_access_mmu_miss_fault(istate_t *istate, uintptr_t va,
     356void do_fast_instruction_access_mmu_miss_fault(istate_t *istate,
    358357    const char *str)
    359358{
    360         fault_if_from_uspace(istate, "%s, Address=%p.", str, va);
    361         panic_memtrap(istate, PF_ACCESS_EXEC, va, "%s.", str);
     359        fault_if_from_uspace(istate, "%s.", str);
     360        dump_istate(istate);
     361        panic("%s.", str);
    362362}
    363363
     
    365365    uint64_t page_and_ctx, const char *str)
    366366{
    367         fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str,
    368             DMISS_ADDRESS(page_and_ctx), DMISS_CONTEXT(page_and_ctx));
    369         panic_memtrap(istate, PF_ACCESS_READ, DMISS_ADDRESS(page_and_ctx),
    370             "%s.");
     367        if (DMISS_CONTEXT(page_and_ctx)) {
     368                fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d)\n", str, DMISS_ADDRESS(page_and_ctx),
     369                    DMISS_CONTEXT(page_and_ctx));
     370        }
     371        dump_istate(istate);
     372        printf("Faulting page: %p, ASID=%d\n", DMISS_ADDRESS(page_and_ctx), DMISS_CONTEXT(page_and_ctx));
     373        panic("%s\n", str);
    371374}
    372375
     
    374377    uint64_t page_and_ctx, const char *str)
    375378{
    376         fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str,
    377             DMISS_ADDRESS(page_and_ctx), DMISS_CONTEXT(page_and_ctx));
    378         panic_memtrap(istate, PF_ACCESS_WRITE, DMISS_ADDRESS(page_and_ctx),
    379             "%s.");
     379        if (DMISS_CONTEXT(page_and_ctx)) {
     380                fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d)\n", str, DMISS_ADDRESS(page_and_ctx),
     381                    DMISS_CONTEXT(page_and_ctx));
     382        }
     383        printf("Faulting page: %p, ASID=%d\n", DMISS_ADDRESS(page_and_ctx), DMISS_CONTEXT(page_and_ctx));
     384        dump_istate(istate);
     385        panic("%s\n", str);
    380386}
    381387
  • kernel/arch/sparc64/src/trap/exception.c

    re3038b4 r05e3cb8  
    4444#include <symtab.h>
    4545
    46 void istate_decode(istate_t *istate)
     46void dump_istate(istate_t *istate)
    4747{
    4848        const char *tpcs = symtab_fmt_name_lookup(istate->tpc);
     
    5858{
    5959        fault_if_from_uspace(istate, "%s.", __func__);
    60         panic_badtrap(istate, n, "%s.", __func__);
     60        dump_istate(istate);
     61        panic("%s.", __func__);
    6162}
    6263
     
    6566{
    6667        fault_if_from_uspace(istate, "%s.", __func__);
    67         panic_badtrap(istate, n, "%s.", __func__);
     68        dump_istate(istate);
     69        panic("%s.", __func__);
    6870}
    6971
     
    7274{
    7375        fault_if_from_uspace(istate, "%s.", __func__);
    74         panic_badtrap(istate, n, "%s.", __func__);
     76        dump_istate(istate);
     77        panic("%s.", __func__);
    7578}
    7679
     
    7982{
    8083        fault_if_from_uspace(istate, "%s.", __func__);
    81         panic_badtrap(istate, n, "%s.", __func__);
     84        dump_istate(istate);
     85        panic("%s.", __func__);
    8286}
    8387
     
    8690{
    8791        fault_if_from_uspace(istate, "%s.", __func__);
    88         panic_badtrap(istate, n, "%s.", __func__);
     92        dump_istate(istate);
     93        panic("%s.", __func__);
    8994}
    9095
     
    9398{
    9499        fault_if_from_uspace(istate, "%s.", __func__);
    95         panic_badtrap(istate, n, "%s.", __func__);
     100        dump_istate(istate);
     101        panic("%s.", __func__);
    96102}
    97103
     
    112118#else
    113119        fault_if_from_uspace(istate, "%s.", __func__);
    114         panic_badtrap(istate, n, "%s.", __func__);
     120        dump_istate(istate);
     121        panic("%s.", __func__);
    115122#endif
    116123}
     
    120127{
    121128        fault_if_from_uspace(istate, "%s.", __func__);
    122         panic_badtrap(istate, n, "%s.", __func__);
     129        dump_istate(istate);
     130        panic("%s.", __func__);
    123131}
    124132
     
    127135{
    128136        fault_if_from_uspace(istate, "%s.", __func__);
    129         panic_badtrap(istate, n, "%s.", __func__);
     137        dump_istate(istate);
     138        panic("%s.", __func__);
    130139}
    131140
     
    134143{
    135144        fault_if_from_uspace(istate, "%s.", __func__);
    136         panic_badtrap(istate, n, "%s.", __func__);
     145        dump_istate(istate);
     146        panic("%s.", __func__);
    137147}
    138148
     
    141151{
    142152        fault_if_from_uspace(istate, "%s.", __func__);
    143         panic_badtrap(istate, n, "%s.", __func__);
     153        dump_istate(istate);
     154        panic("%s.", __func__);
    144155}
    145156
     
    148159{
    149160        fault_if_from_uspace(istate, "%s.", __func__);
    150         panic_badtrap(istate, n, "%s.", __func__);
     161        dump_istate(istate);
     162        describe_dmmu_fault();
     163        panic("%s.", __func__);
    151164}
    152165
     
    155168{
    156169        fault_if_from_uspace(istate, "%s.", __func__);
    157         panic_badtrap(istate, n, "%s.", __func__);
     170        dump_istate(istate);
     171        panic("%s.", __func__);
    158172}
    159173
     
    162176{
    163177        fault_if_from_uspace(istate, "%s.", __func__);
    164         panic_badtrap(istate, n, "%s.", __func__);
     178        dump_istate(istate);
     179        panic("%s.", __func__);
    165180}
    166181
     
    169184{
    170185        fault_if_from_uspace(istate, "%s.", __func__);
    171         panic_badtrap(istate, n, "%s.", __func__);
     186        dump_istate(istate);
     187        panic("%s.", __func__);
    172188}
    173189
     
    176192{
    177193        fault_if_from_uspace(istate, "%s.", __func__);
    178         panic_badtrap(istate, n, "%s.", __func__);
     194        dump_istate(istate);
     195        panic("%s.", __func__);
    179196}
    180197
     
    183200{
    184201        fault_if_from_uspace(istate, "%s.", __func__);
    185         panic_badtrap(istate, n, "%s.", __func__);
     202        dump_istate(istate);
     203        panic("%s.", __func__);
    186204}
    187205
     
    190208{
    191209        fault_if_from_uspace(istate, "%s.", __func__);
    192         panic_badtrap(istate, n, "%s.", __func__);
     210        dump_istate(istate);
     211        panic("%s.", __func__);
    193212}
    194213
     
    197216{
    198217        fault_if_from_uspace(istate, "%s.", __func__);
    199         panic_badtrap(istate, n, "%s.", __func__);
     218        dump_istate(istate);
     219        panic("%s.", __func__);
    200220}
    201221
  • kernel/generic/include/debug.h

    re3038b4 r05e3cb8  
    5555        do { \
    5656                if (!(expr)) \
    57                         panic_assert("%s", #expr); \
     57                        panic("Assertion failed (%s)", #expr); \
    5858        } while (0)
    5959
     
    7272        do { \
    7373                if (!(expr)) \
    74                         panic_assert("%s, %s", #expr, msg); \
     74                        panic("Assertion failed (%s, %s)", #expr, msg); \
    7575        } while (0)
    7676
  • kernel/generic/include/interrupt.h

    re3038b4 r05e3cb8  
    6464extern void irq_initialize_arch(irq_t *);
    6565
    66 extern void istate_decode(istate_t *);
    67 
    6866#endif
    6967
  • kernel/generic/include/panic.h

    re3038b4 r05e3cb8  
    11/*
    2  * Copyright (c) 2010 Jakub Jermar
     2 * Copyright (c) 2001-2004 Jakub Jermar
    33 * All rights reserved.
    44 *
     
    3737
    3838#include <typedefs.h>
     39#include <stacktrace.h>
     40#include <print.h>
    3941
    40 #define panic(fmt, ...) \
    41         panic_common(PANIC_OTHER, NULL, 0, 0, fmt, ##__VA_ARGS__)
     42#ifdef CONFIG_DEBUG
    4243
    43 #define panic_assert(fmt, ...) \
    44         panic_common(PANIC_ASSERT, NULL, 0, 0, fmt, ##__VA_ARGS__)
     44#define panic(format, ...) \
     45        do { \
     46                silent = false; \
     47                printf("Kernel panic in %s() at %s:%u\n", \
     48                    __func__, __FILE__, __LINE__); \
     49                stack_trace(); \
     50                panic_printf("Panic message: " format "\n", \
     51                    ##__VA_ARGS__);\
     52        } while (0)
    4553
    46 #define panic_badtrap(istate, n, fmt, ...) \
    47         panic_common(PANIC_BADTRAP, istate, 0, n, fmt, ##__VA_ARGS__)
     54#else /* CONFIG_DEBUG */
    4855
    49 #define panic_memtrap(istate, access, addr, fmt, ...) \
    50         panic_common(PANIC_MEMTRAP, istate, access, addr, fmt, ##__VA_ARGS__)
     56#define panic(format, ...) \
     57        do { \
     58                silent = false; \
     59                panic_printf("Kernel panic: " format "\n", ##__VA_ARGS__); \
     60                stack_trace(); \
     61        } while (0)
    5162
    52 typedef enum {
    53         PANIC_OTHER,
    54         PANIC_ASSERT,
    55         PANIC_BADTRAP,
    56         PANIC_MEMTRAP
    57 } panic_category_t;
    58 
    59 struct istate;
     63#endif /* CONFIG_DEBUG */
    6064
    6165extern bool silent;
    6266
    63 extern void panic_common(panic_category_t, struct istate *, int,
    64     uintptr_t, const char *, ...) __attribute__ ((noreturn));
     67extern void panic_printf(const char *fmt, ...) __attribute__((noreturn));
    6568
    6669#endif
  • kernel/generic/src/debug/stacktrace.c

    re3038b4 r05e3cb8  
    3737#include <typedefs.h>
    3838#include <symtab.h>
    39 #include <print.h>
    4039
    4140#define STACK_FRAMES_MAX        20
Note: See TracChangeset for help on using the changeset viewer.