Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 317 → Rev 316

/SPARTAN/trunk/arch/mips/src/start.S
31,7 → 31,7
#include <arch/asm/regname.h>
#include <arch/mm/page.h>
#include <arch/asm/boot.h>
#include <arch/context_offset.h>
#include <arch/context.h>
.text
 
55,7 → 55,7
sw $a1,EOFFSET_A1(\r)
sw $a2,EOFFSET_A2(\r)
sw $a3,EOFFSET_A3(\r)
sw $t0,EOFFSET_T0(\r)
sw $t0,EOFFSET_A4(\r)
sw $t1,EOFFSET_T1(\r)
sw $t2,EOFFSET_T2(\r)
sw $t3,EOFFSET_T3(\r)
86,8 → 86,6
 
mfc0 $at, $status
sw $at,EOFFSET_STATUS(\r)
mfc0 $at, $epc
sw $at,EOFFSET_EPC(\r)
.endm
 
.macro REGISTERS_LOAD r
97,7 → 95,7
lw $a1,EOFFSET_A1(\r)
lw $a2,EOFFSET_A2(\r)
lw $a3,EOFFSET_A3(\r)
lw $t0,EOFFSET_T0(\r)
lw $t0,EOFFSET_A4(\r)
lw $t1,EOFFSET_T1(\r)
lw $t2,EOFFSET_T2(\r)
lw $t3,EOFFSET_T3(\r)
126,8 → 124,6
 
lw $at,EOFFSET_STATUS(\r)
mtc0 $at, $status
lw $at,EOFFSET_EPC(\r)
mtc0 $at, $epc
lw $at,EOFFSET_AT(\r)
lw $sp,EOFFSET_SP(\r)
195,8 → 191,7
REGISTERS_STORE $k0
add $sp, $k0, 0
 
add $a0, $sp, 0
jal exception /* exception(register_space) */
jal exception
nop
 
REGISTERS_LOAD $sp
210,8 → 205,7
REGISTERS_STORE $k0
add $sp, $k0, 0
 
add $a0, $sp, 0
jal tlb_refill /* tlb_refill(register_space) */
jal tlb_refill
nop
 
REGISTERS_LOAD $sp
/SPARTAN/trunk/arch/mips/src/exception.c
34,9 → 34,10
#include <arch.h>
#include <debug.h>
 
void exception(struct exception_regdump *pstate)
void exception(void)
{
int excno;
__u32 epc;
__u32 epc_shift = 0;
 
ASSERT(CPU != NULL);
44,14 → 45,18
/*
* NOTE ON OPERATION ORDERING
*
* On entry, cpu_priority_high() must be called before
* exception bit is cleared.
* On entry, cpu_priority_high() must be called before exception bit is cleared.
* On exit, exception bit must be set before cpu_priority_restore() is called.
*/
 
cpu_priority_high();
epc = cp0_epc_read();
cp0_status_write(cp0_status_read() & ~ (cp0_status_exl_exception_bit |
cp0_status_um_bit));
 
if (THREAD) {
THREAD->saved_epc = epc;
}
/* decode exception number and process the exception */
switch (excno = (cp0_cause_read() >> 2) & 0x1f) {
case EXC_Int:
59,7 → 64,7
break;
case EXC_TLBL:
case EXC_TLBS:
tlb_invalid(pstate);
tlb_invalid();
break;
case EXC_Mod:
panic("unhandled TLB Modification Exception\n");
109,5 → 114,12
panic("unhandled exception %d\n", excno);
}
pstate->epc += epc_shift;
if (THREAD)
epc = THREAD->saved_epc;
/* Raise EXL bit before epc_write, so that we support
* properly nested exceptions
*/
cp0_status_write(cp0_status_read() | cp0_status_exl_exception_bit);
cp0_epc_write(epc + epc_shift);
}
/SPARTAN/trunk/arch/mips/src/context.S
28,7 → 28,7
 
#define __ASM__
#include <arch/asm/regname.h>
#include <arch/context_offset.h>
#include "context_offset.h"
.text
 
/SPARTAN/trunk/arch/mips/src/mm/tlb.c
35,22 → 35,22
 
#include <symtab.h>
 
void tlb_refill(struct exception_regdump *pstate)
void tlb_refill(void)
{
panic("tlb_refill exception\n");
}
 
void tlb_invalid(struct exception_regdump *pstate)
void tlb_invalid(void)
{
char *symbol = "";
 
if (THREAD) {
char *s = get_symtab_entry(pstate->epc);
char *s = get_symtab_entry(THREAD->saved_epc);
if (s)
symbol = s;
}
panic("%X: TLB exception at %X(%s)\n", cp0_badvaddr_read(),
pstate->epc, symbol);
THREAD ? THREAD->saved_epc : 0, symbol);
}
 
void tlb_invalidate(int asid)
/SPARTAN/trunk/arch/mips/include/thread.h
29,6 → 29,6
#ifndef __mips_THREAD_H__
#define __mips_THREAD_H__
 
#define ARCH_THREAD_DATA
#define ARCH_THREAD_DATA __u32 saved_epc;
 
#endif
/SPARTAN/trunk/arch/mips/include/mm/tlb.h
29,8 → 29,6
#ifndef __mips_TLB_H__
#define __mips_TLB_H__
 
#include <arch/exception.h>
 
#define PAGE_UNCACHED 2
#define PAGE_CACHEABLE_EXC_WRITE 5
 
65,7 → 63,7
 
typedef struct entry_lo pte_t;
 
extern void tlb_invalid(struct exception_regdump *pstate);
extern void tlb_refill(struct exception_regdump *pstate);
extern void tlb_refill(void);
extern void tlb_invalid(void);
 
#endif
/SPARTAN/trunk/arch/mips/include/context.h
31,6 → 31,45
 
#define STACK_ITEM_SIZE 4
 
/* These are offsets into the register dump saved
* on exception entry
*/
#define EOFFSET_AT 0
#define EOFFSET_V0 4
#define EOFFSET_V1 8
#define EOFFSET_A0 12
#define EOFFSET_A1 16
#define EOFFSET_A2 20
#define EOFFSET_A3 24
#define EOFFSET_A4 28
#define EOFFSET_T1 32
#define EOFFSET_T2 36
#define EOFFSET_T3 40
#define EOFFSET_T4 44
#define EOFFSET_T5 48
#define EOFFSET_T6 52
#define EOFFSET_T7 56
#define EOFFSET_T8 60
#define EOFFSET_T9 64
#define EOFFSET_S0 68
#define EOFFSET_S1 72
#define EOFFSET_S2 76
#define EOFFSET_S3 80
#define EOFFSET_S4 84
#define EOFFSET_S5 88
#define EOFFSET_S6 92
#define EOFFSET_S7 96
#define EOFFSET_S8 100
#define EOFFSET_GP 104
#define EOFFSET_RA 108
#define EOFFSET_SP 112
 
#define EOFFSET_LO 116
#define EOFFSET_HI 120
#define EOFFSET_STATUS 124
 
#define REGISTER_SPACE 128
 
/*
* Put one item onto the stack to support get_stack_base().
*/
/SPARTAN/trunk/arch/mips/include/exception.h
29,10 → 29,6
#ifndef __EXCEPTION_H__
#define __EXCEPTION_H__
 
#ifndef __mips_TYPES_H_
# include <arch/types.h>
#endif
 
#define EXC_Int 0
#define EXC_Mod 1
#define EXC_TLBL 2
52,44 → 48,6
#define EXC_WATCH 23
#define EXC_VCED 31
 
struct exception_regdump {
__u32 at;
__u32 v0;
__u32 v1;
__u32 a0;
__u32 a1;
__u32 a2;
__u32 a3;
__u32 t0;
__u32 t1;
__u32 t2;
__u32 t3;
__u32 t4;
__u32 t5;
__u32 t6;
__u32 t7;
__u32 s0;
__u32 s1;
__u32 s2;
__u32 s3;
__u32 s4;
__u32 s5;
__u32 s6;
__u32 s7;
__u32 t8;
__u32 t9;
__u32 gp;
__u32 sp;
__u32 s8;
__u32 ra;
__u32 lo;
__u32 hi;
extern void exception(void);
 
__u32 status; /* cp0_status */
__u32 epc; /* cp0_epc */
};
 
extern void exception(struct exception_regdump *pstate);
 
#endif
/SPARTAN/trunk/src/clean.mips
3,4 → 3,4
make dist-clean ARCH=mips
 
rm ../tools/mips/gencontext
rm ../arch/mips/include/context_offset.h
rm ../arch/mips/src/context_offset.h
/SPARTAN/trunk/tools/mips/gencontext.c
6,16 → 6,14
 
#define __mips_TYPES_H_
#include "../../arch/mips/include/context.h"
#include "../../arch/mips/include/exception.h"
 
#define FILENAME "../../arch/mips/include/context_offset.h"
#define FILENAME "../../arch/mips/src/context_offset.h"
 
int main(void)
{
FILE *f;
struct context *pctx = NULL;
struct exception_regdump *edmp = NULL;
struct context ctx;
struct context *pctx = &ctx;
 
f = fopen(FILENAME,"w");
if (!f) {
25,8 → 23,6
 
fprintf(f, "/* This file is automatically generated by %s. */\n", __FILE__);
 
fprintf(f,"/* struct context */\n");
 
fprintf(f,"#define OFFSET_SP 0x%x\n",((int)&pctx->sp) - (int )pctx);
fprintf(f,"#define OFFSET_PC 0x%x\n",((int)&pctx->pc) - (int )pctx);
fprintf(f,"#define OFFSET_S0 0x%x\n",((int)&pctx->s0) - (int )pctx);
40,43 → 36,7
fprintf(f,"#define OFFSET_S8 0x%x\n",((int)&pctx->s8) - (int )pctx);
fprintf(f,"#define OFFSET_GP 0x%x\n",((int)&pctx->gp) - (int )pctx);
 
fprintf(f,"\n\n/* struct register_dump */\n");
fprintf(f,"#define EOFFSET_AT 0x%x\n",((int)&edmp->at) - (int )edmp);
fprintf(f,"#define EOFFSET_V0 0x%x\n",((int)&edmp->v0) - (int )edmp);
fprintf(f,"#define EOFFSET_V1 0x%x\n",((int)&edmp->v1) - (int )edmp);
fprintf(f,"#define EOFFSET_A0 0x%x\n",((int)&edmp->a0) - (int )edmp);
fprintf(f,"#define EOFFSET_A1 0x%x\n",((int)&edmp->a1) - (int )edmp);
fprintf(f,"#define EOFFSET_A2 0x%x\n",((int)&edmp->a2) - (int )edmp);
fprintf(f,"#define EOFFSET_A3 0x%x\n",((int)&edmp->a3) - (int )edmp);
fprintf(f,"#define EOFFSET_T0 0x%x\n",((int)&edmp->t0) - (int )edmp);
fprintf(f,"#define EOFFSET_T1 0x%x\n",((int)&edmp->t1) - (int )edmp);
fprintf(f,"#define EOFFSET_T2 0x%x\n",((int)&edmp->t2) - (int )edmp);
fprintf(f,"#define EOFFSET_T3 0x%x\n",((int)&edmp->t3) - (int )edmp);
fprintf(f,"#define EOFFSET_T4 0x%x\n",((int)&edmp->t4) - (int )edmp);
fprintf(f,"#define EOFFSET_T5 0x%x\n",((int)&edmp->t5) - (int )edmp);
fprintf(f,"#define EOFFSET_T6 0x%x\n",((int)&edmp->t6) - (int )edmp);
fprintf(f,"#define EOFFSET_T7 0x%x\n",((int)&edmp->t7) - (int )edmp);
fprintf(f,"#define EOFFSET_S0 0x%x\n",((int)&edmp->s0) - (int )edmp);
fprintf(f,"#define EOFFSET_S1 0x%x\n",((int)&edmp->s1) - (int )edmp);
fprintf(f,"#define EOFFSET_S2 0x%x\n",((int)&edmp->s2) - (int )edmp);
fprintf(f,"#define EOFFSET_S3 0x%x\n",((int)&edmp->s3) - (int )edmp);
fprintf(f,"#define EOFFSET_S4 0x%x\n",((int)&edmp->s4) - (int )edmp);
fprintf(f,"#define EOFFSET_S5 0x%x\n",((int)&edmp->s5) - (int )edmp);
fprintf(f,"#define EOFFSET_S6 0x%x\n",((int)&edmp->s6) - (int )edmp);
fprintf(f,"#define EOFFSET_S7 0x%x\n",((int)&edmp->s7) - (int )edmp);
fprintf(f,"#define EOFFSET_T8 0x%x\n",((int)&edmp->t8) - (int )edmp);
fprintf(f,"#define EOFFSET_T9 0x%x\n",((int)&edmp->t9) - (int )edmp);
fprintf(f,"#define EOFFSET_GP 0x%x\n",((int)&edmp->gp) - (int )edmp);
fprintf(f,"#define EOFFSET_SP 0x%x\n",((int)&edmp->sp) - (int )edmp);
fprintf(f,"#define EOFFSET_S8 0x%x\n",((int)&edmp->s8) - (int )edmp);
fprintf(f,"#define EOFFSET_RA 0x%x\n",((int)&edmp->ra) - (int )edmp);
fprintf(f,"#define EOFFSET_LO 0x%x\n",((int)&edmp->lo) - (int )edmp);
fprintf(f,"#define EOFFSET_HI 0x%x\n",((int)&edmp->hi) - (int )edmp);
fprintf(f,"#define EOFFSET_STATUS 0x%x\n",((int)&edmp->status) - (int )edmp);
fprintf(f,"#define EOFFSET_EPC 0x%x\n",((int)&edmp->epc) - (int )edmp);
 
fprintf(f,"#define REGISTER_SPACE %d\n",sizeof(*edmp));
 
fclose(f);
 
return 0;