Changeset 909c6e3 in mainline


Ignore:
Timestamp:
2005-09-07T09:44:30Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d246e7e
Parents:
24bd23a
Message:

MIPS exception now saves all necesssary information only on stack.

Files:
10 edited

Legend:

Unmodified
Added
Removed
  • arch/mips/include/context.h

    r24bd23a r909c6e3  
    3131
    3232#define STACK_ITEM_SIZE 4
    33 
    34 /* These are offsets into the register dump saved
    35  * on exception entry
    36  */
    37 #define EOFFSET_AT 0
    38 #define EOFFSET_V0 4
    39 #define EOFFSET_V1 8
    40 #define EOFFSET_A0 12
    41 #define EOFFSET_A1 16
    42 #define EOFFSET_A2 20
    43 #define EOFFSET_A3 24
    44 #define EOFFSET_A4 28
    45 #define EOFFSET_T1 32
    46 #define EOFFSET_T2 36
    47 #define EOFFSET_T3 40
    48 #define EOFFSET_T4 44
    49 #define EOFFSET_T5 48
    50 #define EOFFSET_T6 52
    51 #define EOFFSET_T7 56
    52 #define EOFFSET_T8 60
    53 #define EOFFSET_T9 64
    54 #define EOFFSET_S0 68
    55 #define EOFFSET_S1 72
    56 #define EOFFSET_S2 76
    57 #define EOFFSET_S3 80
    58 #define EOFFSET_S4 84
    59 #define EOFFSET_S5 88
    60 #define EOFFSET_S6 92
    61 #define EOFFSET_S7 96
    62 #define EOFFSET_S8 100
    63 #define EOFFSET_GP 104
    64 #define EOFFSET_RA 108
    65 #define EOFFSET_SP 112
    66 
    67 #define EOFFSET_LO 116
    68 #define EOFFSET_HI 120
    69 #define EOFFSET_STATUS 124
    70 
    71 #define REGISTER_SPACE 128
    7233
    7334/*
  • arch/mips/include/exception.h

    r24bd23a r909c6e3  
    3030#define __EXCEPTION_H__
    3131
     32#ifndef __mips_TYPES_H_
     33#  include <arch/types.h>
     34#endif
     35
    3236#define EXC_Int         0
    3337#define EXC_Mod         1
     
    4953#define EXC_VCED        31
    5054
    51 extern void exception(void);
     55struct exception_regdump {
     56        __u32 at;
     57        __u32 v0;
     58        __u32 v1;
     59        __u32 a0;
     60        __u32 a1;
     61        __u32 a2;
     62        __u32 a3;
     63        __u32 t0;
     64        __u32 t1;
     65        __u32 t2;
     66        __u32 t3;
     67        __u32 t4;
     68        __u32 t5;
     69        __u32 t6;
     70        __u32 t7;
     71        __u32 s0;
     72        __u32 s1;
     73        __u32 s2;
     74        __u32 s3;
     75        __u32 s4;
     76        __u32 s5;
     77        __u32 s6;
     78        __u32 s7;
     79        __u32 t8;
     80        __u32 t9;
     81        __u32 gp;
     82        __u32 sp;
     83        __u32 s8;
     84        __u32 ra;
     85       
     86        __u32 lo;
     87        __u32 hi;
     88
     89        __u32 status; /* cp0_status */
     90        __u32 epc; /* cp0_epc */
     91};
     92
     93extern void exception(struct exception_regdump *pstate);
    5294
    5395#endif
  • arch/mips/include/mm/tlb.h

    r24bd23a r909c6e3  
    2929#ifndef __mips_TLB_H__
    3030#define __mips_TLB_H__
     31
     32#include <arch/exception.h>
    3133
    3234#define PAGE_UNCACHED                   2
     
    6466typedef struct entry_lo pte_t;
    6567
    66 extern void tlb_refill(void);
    67 extern void tlb_invalid(void);
     68extern void tlb_invalid(struct exception_regdump *pstate);
     69extern void tlb_refill(struct exception_regdump *pstate);
    6870
    6971#endif
  • arch/mips/include/thread.h

    r24bd23a r909c6e3  
    3030#define __mips_THREAD_H__
    3131
    32 #define ARCH_THREAD_DATA  __u32 saved_epc;
     32#define ARCH_THREAD_DATA
    3333
    3434#endif
  • arch/mips/src/context.S

    r24bd23a r909c6e3  
    2929#define __ASM__
    3030#include <arch/asm/regname.h>
    31 #include "context_offset.h"
     31#include <arch/context_offset.h>
    3232       
    3333.text   
  • arch/mips/src/exception.c

    r24bd23a r909c6e3  
    3535#include <debug.h>
    3636
    37 void exception(void)
     37void exception(struct exception_regdump *pstate)
    3838{
    3939        int excno;
    40         __u32 epc;
    4140        __u32 epc_shift = 0;
    4241
     
    4645         * NOTE ON OPERATION ORDERING
    4746         *
    48          * On entry, cpu_priority_high() must be called before exception bit is cleared.
    49          * On exit, exception bit must be set before cpu_priority_restore() is called.
     47         * On entry, cpu_priority_high() must be called before
     48         * exception bit is cleared.
    5049         */
    5150
    5251        cpu_priority_high();
    53         epc = cp0_epc_read();
    5452        cp0_status_write(cp0_status_read() & ~ (cp0_status_exl_exception_bit |
    5553                                                cp0_status_um_bit));
    5654
    57         if (THREAD) {
    58                 THREAD->saved_epc = epc;
    59         }
    6055        /* decode exception number and process the exception */
    6156        switch (excno = (cp0_cause_read() >> 2) & 0x1f) {
     
    6560                case EXC_TLBL:
    6661                case EXC_TLBS:
    67                         tlb_invalid();
     62                        tlb_invalid(pstate);
    6863                        break;
    6964                case EXC_Mod:
     
    115110        }
    116111       
    117         if (THREAD)
    118                 epc = THREAD->saved_epc;
    119        
    120         /* Raise EXL bit before epc_write, so that we support
    121          * properly nested exceptions
    122          */
    123         cp0_status_write(cp0_status_read() | cp0_status_exl_exception_bit);
    124         cp0_epc_write(epc + epc_shift);
     112        pstate->epc += epc_shift;
    125113}
  • arch/mips/src/mm/tlb.c

    r24bd23a r909c6e3  
    3636#include <symtab.h>
    3737
    38 void tlb_refill(void)
     38void tlb_refill(struct exception_regdump *pstate)
    3939{
    4040        panic("tlb_refill exception\n");
    4141}
    4242
    43 void tlb_invalid(void)
     43void tlb_invalid(struct exception_regdump *pstate)
    4444{
    4545        char *symbol = "";
    4646
    4747        if (THREAD) {
    48                 char *s = get_symtab_entry(THREAD->saved_epc);
     48                char *s = get_symtab_entry(pstate->epc);
    4949                if (s)
    5050                        symbol = s;
    5151        }
    5252        panic("%X: TLB exception at %X(%s)\n", cp0_badvaddr_read(),
    53               THREAD ? THREAD->saved_epc : 0, symbol);
     53              pstate->epc, symbol);
    5454}
    5555
  • arch/mips/src/start.S

    r24bd23a r909c6e3  
    3232#include <arch/mm/page.h>
    3333#include <arch/asm/boot.h>
    34 #include <arch/context.h>
     34#include <arch/context_offset.h>
    3535       
    3636.text
     
    5656        sw $a2,EOFFSET_A2(\r)
    5757        sw $a3,EOFFSET_A3(\r)
    58         sw $t0,EOFFSET_A4(\r)
     58        sw $t0,EOFFSET_T0(\r)
    5959        sw $t1,EOFFSET_T1(\r)
    6060        sw $t2,EOFFSET_T2(\r)
     
    8787        mfc0 $at, $status
    8888        sw $at,EOFFSET_STATUS(\r)
     89        mfc0 $at, $epc
     90        sw $at,EOFFSET_EPC(\r)
    8991.endm
    9092
     
    9698        lw $a2,EOFFSET_A2(\r)
    9799        lw $a3,EOFFSET_A3(\r)
    98         lw $t0,EOFFSET_A4(\r)
     100        lw $t0,EOFFSET_T0(\r)
    99101        lw $t1,EOFFSET_T1(\r)
    100102        lw $t2,EOFFSET_T2(\r)
     
    125127        lw $at,EOFFSET_STATUS(\r)
    126128        mtc0 $at, $status
     129        lw $at,EOFFSET_EPC(\r)
     130        mtc0 $at, $epc
    127131       
    128132        lw $at,EOFFSET_AT(\r)
     
    192196        add $sp, $k0, 0
    193197
    194         jal exception
     198        add $a0, $sp, 0
     199        jal exception /* exception(register_space) */
    195200        nop
    196201
     
    206211        add $sp, $k0, 0
    207212
    208         jal tlb_refill
     213        add $a0, $sp, 0
     214        jal tlb_refill /* tlb_refill(register_space) */
    209215        nop
    210216
  • src/clean.mips

    r24bd23a r909c6e3  
    44
    55rm ../tools/mips/gencontext
    6 rm ../arch/mips/src/context_offset.h
     6rm ../arch/mips/include/context_offset.h
  • tools/mips/gencontext.c

    r24bd23a r909c6e3  
    77#define __mips_TYPES_H_
    88#include "../../arch/mips/include/context.h"
     9#include "../../arch/mips/include/exception.h"
    910
    10 #define FILENAME "../../arch/mips/src/context_offset.h"
     11#define FILENAME "../../arch/mips/include/context_offset.h"
    1112
    1213int main(void)
    1314{
    1415        FILE *f;
    15         struct context ctx;
    16         struct context *pctx = &ctx;
     16        struct context *pctx = NULL;
     17        struct exception_regdump *edmp = NULL;
     18       
    1719
    1820        f = fopen(FILENAME,"w");
     
    2325
    2426        fprintf(f, "/* This file is automatically generated by %s. */\n", __FILE__);   
     27
     28        fprintf(f,"/* struct context */\n");
    2529
    2630        fprintf(f,"#define OFFSET_SP  0x%x\n",((int)&pctx->sp) - (int )pctx);
     
    3741        fprintf(f,"#define OFFSET_GP  0x%x\n",((int)&pctx->gp) - (int )pctx);
    3842
     43        fprintf(f,"\n\n/* struct register_dump */\n");
     44        fprintf(f,"#define EOFFSET_AT  0x%x\n",((int)&edmp->at) - (int )edmp);
     45        fprintf(f,"#define EOFFSET_V0  0x%x\n",((int)&edmp->v0) - (int )edmp);
     46        fprintf(f,"#define EOFFSET_V1  0x%x\n",((int)&edmp->v1) - (int )edmp);
     47        fprintf(f,"#define EOFFSET_A0  0x%x\n",((int)&edmp->a0) - (int )edmp);
     48        fprintf(f,"#define EOFFSET_A1  0x%x\n",((int)&edmp->a1) - (int )edmp);
     49        fprintf(f,"#define EOFFSET_A2  0x%x\n",((int)&edmp->a2) - (int )edmp);
     50        fprintf(f,"#define EOFFSET_A3  0x%x\n",((int)&edmp->a3) - (int )edmp);
     51        fprintf(f,"#define EOFFSET_T0  0x%x\n",((int)&edmp->t0) - (int )edmp);
     52        fprintf(f,"#define EOFFSET_T1  0x%x\n",((int)&edmp->t1) - (int )edmp);
     53        fprintf(f,"#define EOFFSET_T2  0x%x\n",((int)&edmp->t2) - (int )edmp);
     54        fprintf(f,"#define EOFFSET_T3  0x%x\n",((int)&edmp->t3) - (int )edmp);
     55        fprintf(f,"#define EOFFSET_T4  0x%x\n",((int)&edmp->t4) - (int )edmp);
     56        fprintf(f,"#define EOFFSET_T5  0x%x\n",((int)&edmp->t5) - (int )edmp);
     57        fprintf(f,"#define EOFFSET_T6  0x%x\n",((int)&edmp->t6) - (int )edmp);
     58        fprintf(f,"#define EOFFSET_T7  0x%x\n",((int)&edmp->t7) - (int )edmp);
     59        fprintf(f,"#define EOFFSET_S0  0x%x\n",((int)&edmp->s0) - (int )edmp);
     60        fprintf(f,"#define EOFFSET_S1  0x%x\n",((int)&edmp->s1) - (int )edmp);
     61        fprintf(f,"#define EOFFSET_S2  0x%x\n",((int)&edmp->s2) - (int )edmp);
     62        fprintf(f,"#define EOFFSET_S3  0x%x\n",((int)&edmp->s3) - (int )edmp);
     63        fprintf(f,"#define EOFFSET_S4  0x%x\n",((int)&edmp->s4) - (int )edmp);
     64        fprintf(f,"#define EOFFSET_S5  0x%x\n",((int)&edmp->s5) - (int )edmp);
     65        fprintf(f,"#define EOFFSET_S6  0x%x\n",((int)&edmp->s6) - (int )edmp);
     66        fprintf(f,"#define EOFFSET_S7  0x%x\n",((int)&edmp->s7) - (int )edmp);
     67        fprintf(f,"#define EOFFSET_T8  0x%x\n",((int)&edmp->t8) - (int )edmp);
     68        fprintf(f,"#define EOFFSET_T9  0x%x\n",((int)&edmp->t9) - (int )edmp);
     69        fprintf(f,"#define EOFFSET_GP  0x%x\n",((int)&edmp->gp) - (int )edmp);
     70        fprintf(f,"#define EOFFSET_SP  0x%x\n",((int)&edmp->sp) - (int )edmp);
     71        fprintf(f,"#define EOFFSET_S8  0x%x\n",((int)&edmp->s8) - (int )edmp);
     72        fprintf(f,"#define EOFFSET_RA  0x%x\n",((int)&edmp->ra) - (int )edmp);
     73        fprintf(f,"#define EOFFSET_LO  0x%x\n",((int)&edmp->lo) - (int )edmp);
     74        fprintf(f,"#define EOFFSET_HI  0x%x\n",((int)&edmp->hi) - (int )edmp);
     75        fprintf(f,"#define EOFFSET_STATUS  0x%x\n",((int)&edmp->status) - (int )edmp);
     76        fprintf(f,"#define EOFFSET_EPC  0x%x\n",((int)&edmp->epc) - (int )edmp);
     77
     78        fprintf(f,"#define REGISTER_SPACE  %d\n",sizeof(*edmp));
    3979
    4080        fclose(f);
Note: See TracChangeset for help on using the changeset viewer.