Changeset 874621f in mainline for arch


Ignore:
Timestamp:
2006-06-06T07:40:51Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0dbc4e7
Parents:
6f9a9bc
Message:

Added kernel circular buffer klog.
Added automatic killing of tasks raising inappropriate exceptions.
TODO Fix vsnprintf return value(and behaviour according to specs) and remove workaround in klog.

Location:
arch
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/include/interrupt.h

    r6f9a9bc r874621f  
    8787};
    8888
     89/** Return true if exception happened while in userspace */
     90static inline int istate_from_uspace(istate_t *istate)
     91{
     92        return !(istate->rip & 0x8000000000000000);
     93}
     94
    8995static inline void istate_set_retaddr(istate_t *istate, __address retaddr)
    9096{
    9197        istate->rip = retaddr;
     98}
     99static inline __native istate_get_pc(istate_t *istate)
     100{
     101        return istate->rip;
    92102}
    93103
  • arch/amd64/src/interrupt.c

    r6f9a9bc r874621f  
    8080void null_interrupt(int n, istate_t *istate)
    8181{
     82        fault_if_from_uspace(istate, "unserviced interrupt: %d", n);
    8283        print_info_errcode(n, istate);
    8384        panic("unserviced interrupt\n");
     
    105106                        return;
    106107                }
     108                fault_if_from_uspace(istate, "general protection fault");
    107109        }
    108110
     
    113115void ss_fault(int n, istate_t *istate)
    114116{
     117        fault_if_from_uspace(istate, "stack fault");
    115118        print_info_errcode(n, istate);
    116119        panic("stack fault\n");
     
    122125        scheduler_fpu_lazy_request();
    123126#else
     127        fault_if_from_uspace(istate, "fpu fault");
    124128        panic("fpu fault");
    125129#endif
  • arch/amd64/src/mm/page.c

    r6f9a9bc r874621f  
    184184       
    185185        if (as_page_fault(page, access, istate) == AS_PF_FAULT) {
     186                fault_if_from_uspace(istate, "Page fault: %#x", page);
     187
    186188                print_info_errcode(n, istate);
    187189                printf("Page fault address: %llX\n", page);
  • arch/ia32/include/interrupt.h

    r6f9a9bc r874621f  
    8484};
    8585
     86/** Return true if exception happened while in userspace */
     87static inline int istate_from_uspace(istate_t *istate)
     88{
     89        return !(istate->eip & 0x80000000);
     90}
     91
    8692static inline void istate_set_retaddr(istate_t *istate, __address retaddr)
    8793{
    8894        istate->eip = retaddr;
     95}
     96
     97static inline __native istate_get_pc(istate_t *istate)
     98{
     99        return istate->eip;
    89100}
    90101
  • arch/ia32/src/interrupt.c

    r6f9a9bc r874621f  
    8080void null_interrupt(int n, istate_t *istate)
    8181{
     82        fault_if_from_uspace(istate, "unserviced interrupt: %d", n);
     83
    8284        PRINT_INFO_ERRCODE(istate);
    8385        panic("unserviced interrupt: %d\n", n);
     
    105107                        return;
    106108                }
     109                fault_if_from_uspace(istate, "general protection fault");
    107110        }
    108111
     
    113116void ss_fault(int n, istate_t *istate)
    114117{
     118        fault_if_from_uspace(istate, "stack fault");
     119
    115120        PRINT_INFO_ERRCODE(istate);
    116121        panic("stack fault\n");
     
    119124void simd_fp_exception(int n, istate_t *istate)
    120125{
    121 
    122         PRINT_INFO_ERRCODE(istate);
    123126        __u32 mxcsr;
    124127        asm
     
    127130                :"=m"(mxcsr)
    128131        );
     132        fault_if_from_uspace(istate, "SIMD FP exception(19), MXCSR: %#zX",
     133                             (__native)mxcsr);
     134
     135        PRINT_INFO_ERRCODE(istate);
    129136        printf("MXCSR: %#zX\n",(__native)(mxcsr));
    130137        panic("SIMD FP exception(19)\n");
     
    136143        scheduler_fpu_lazy_request();
    137144#else
     145        fault_if_from_uspace(istate, "fpu fault");
    138146        panic("fpu fault");
    139147#endif
  • arch/ia32/src/mm/page.c

    r6f9a9bc r874621f  
    104104
    105105        if (as_page_fault(page, access, istate) == AS_PF_FAULT) {
     106                fault_if_from_uspace(istate, "Page fault: %#x", page);
     107
    106108                PRINT_INFO_ERRCODE(istate);
    107109                printf("page fault address: %#x\n", page);
  • arch/ia64/include/interrupt.h

    r6f9a9bc r874621f  
    114114}
    115115
     116static inline __native istate_get_pc(istate_t *istate)
     117{
     118        return istate->cr_iip;
     119}
     120#include <panic.h>
     121static inline int istate_from_uspace(istate_t *istate)
     122{
     123        panic("TODO: istate_from_uspace not yet implemented");
     124        return 0;
     125}
     126
    116127extern void *ivt;
    117128
  • arch/ia64/src/interrupt.c

    r6f9a9bc r874621f  
    4747#include <ipc/irq.h>
    4848#include <ipc/ipc.h>
     49#include <interrupt.h>
    4950
    5051
     
    151152        char *desc = "";
    152153
    153         dump_interrupted_context(istate);
    154 
    155154        switch (istate->cr_isr.ge_code) {
    156155            case GE_ILLEGALOP:
     
    177176        }
    178177
     178        fault_if_from_uspace(istate, "General Exception (%s)", desc);
     179
     180        dump_interrupted_context(istate);
    179181        panic("General Exception (%s)\n", desc);
    180182}
     
    187189        scheduler_fpu_lazy_request();   
    188190#else
     191        fault_if_from_uspace(istate, "Interruption: %#hx (%s)", (__u16) vector, vector_to_string(vector));
    189192        dump_interrupted_context(istate);
    190193        panic("Interruption: %#hx (%s)\n", (__u16) vector, vector_to_string(vector));
     
    268271        /* TODO */
    269272}
    270 
    271 
    272 
  • arch/mips32/include/arg.h

    r6f9a9bc r874621f  
    4545        (((type *)((ap) = (va_list)( (sizeof(type) <= 4) ? ((__address)((ap) + 2*4 - 1) & (~3)) : ((__address)((ap) + 2*8 -1) & (~7)) )))[-1])
    4646
     47#define va_copy(dst,src) ((dst)=(src))
     48
    4749#define va_end(ap)
    4850
  • arch/mips32/include/exception.h

    r6f9a9bc r874621f  
    3535
    3636#include <typedefs.h>
     37#include <arch/cp0.h>
    3738
    3839#define EXC_Int         0
     
    99100}
    100101
     102/** Return true if exception happened while in userspace */
     103static inline int istate_from_uspace(istate_t *istate)
     104{
     105        return istate->status & cp0_status_um_bit;
     106}
     107static inline __native istate_get_pc(istate_t *istate)
     108{
     109        return istate->epc;
     110}
     111
    101112extern void exception(istate_t *istate);
    102113extern void tlb_refill_entry(void);
  • arch/mips32/src/exception.c

    r6f9a9bc r874621f  
    7979static void unhandled_exception(int n, istate_t *istate)
    8080{
     81        fault_if_from_uspace(istate, "unhandled exception %s", exctable[n]);
     82       
    8183        print_regdump(istate);
    8284        panic("unhandled exception %s\n", exctable[n]);
     
    120122        if (cp0_cause_coperr(cp0_cause_read()) == fpu_cop_id)
    121123                scheduler_fpu_lazy_request();
    122         else
     124        else {
     125                fault_if_from_uspace(istate, "unhandled Coprocessor Unusable Exception");
    123126                panic("unhandled Coprocessor Unusable Exception\n");
     127        }
    124128}
    125129#endif
  • arch/mips32/src/mm/tlb.c

    r6f9a9bc r874621f  
    4040#include <debug.h>
    4141#include <align.h>
     42#include <interrupt.h>
    4243
    4344static void tlb_refill_fail(istate_t *istate);
     
    337338        if (s)
    338339                sym2 = s;
     340
     341        fault_if_from_uspace(istate, "TLB Refill Exception on %P", cp0_badvaddr_read());
    339342        panic("%X: TLB Refill Exception at %X(%s<-%s)\n", cp0_badvaddr_read(), istate->epc, symbol, sym2);
    340343}
     
    348351        if (s)
    349352                symbol = s;
     353        fault_if_from_uspace(istate, "TLB Invalid Exception on %P", cp0_badvaddr_read());
    350354        panic("%X: TLB Invalid Exception at %X(%s)\n", cp0_badvaddr_read(), istate->epc, symbol);
    351355}
     
    358362        if (s)
    359363                symbol = s;
     364        fault_if_from_uspace(istate, "TLB Modified Exception on %P", cp0_badvaddr_read());
    360365        panic("%X: TLB Modified Exception at %X(%s)\n", cp0_badvaddr_read(), istate->epc, symbol);
    361366}
  • arch/ppc32/include/exception.h

    r6f9a9bc r874621f  
    8181        istate->pc = retaddr;
    8282}
     83/** Return true if exception happened while in userspace */
     84#include <panic.h>
     85static inline int istate_from_uspace(istate_t *istate)
     86{
     87        panic("istate_from_uspace not yet implemented");
     88        return 0;
     89}
     90static inline __native istate_get_pc(istate_t *istate)
     91{
     92        return istate->pc;
     93}
    8394
    8495#endif
  • arch/ppc32/src/interrupt.c

    r6f9a9bc r874621f  
    6767}
    6868
    69 #include <print.h>
    7069/** Handler of externul interrupts */
    7170void extint_handler(int n, istate_t *istate)
  • arch/ppc64/include/exception.h

    r6f9a9bc r874621f  
    8181        istate->pc = retaddr;
    8282}
     83/** Return true if exception happened while in userspace */
     84#include <panic.h>
     85static inline int istate_from_uspace(istate_t *istate)
     86{
     87        panic("istate_from_uspace not yet implemented");
     88        return 0;
     89}
     90static inline __native istate_get_pc(istate_t *istate)
     91{
     92        return istate->pc;
     93}
    8394
    8495#endif
  • arch/sparc64/include/interrupt.h

    r6f9a9bc r874621f  
    5252        /* TODO */
    5353}
     54static inline int istate_from_uspace(istate_t *istate)
     55{
     56        /* TODO */
     57}
     58static inline __native istate_get_pc(istate_t *istate)
     59{
     60        /* TODO */
     61}
     62
    5463
    5564extern void interrupt_register(int n, const char *name, iroutine f);
Note: See TracChangeset for help on using the changeset viewer.