* get rid of ppc stuff

* possible types of exception frames


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23833 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
François Revol
2008-02-03 11:39:28 +00:00
parent 5905a0ae34
commit 82610ec8eb
3 changed files with 197 additions and 95 deletions
+192 -56
View File
@@ -12,65 +12,201 @@
#define PAGE_SIZE 4096
#warning M68K: check for missing regs/movem
struct iframe {
/* XXX: order depends on movem */
uint32 d0;
uint32 d1;
uint32 d2;
uint32 d3;
uint32 d4;
uint32 d5;
uint32 d6;
uint32 d7;
uint32 a0;
uint32 a1;
uint32 a2;
uint32 a3;
uint32 a4;
uint32 a5;
uint32 a6;
uint32 a7;
/* 030 ex frame: */
uint16 sr; /* contains ccr */
uint32 pc;
uint16 vector; /* [12:15] frame type */
/* other stuff depending on frame type... do we really need that ? */
/* 68k has many different possible stack frames, differentiated by a 4 bit number,
* but they also depend on the cpu type.
* cf. mint/sys/arch/check_exc.h
*/
/* definitions for special status word */
// 020 as well
struct mc68030_ssw {
uint16 fc:1;
uint16 fb:1;
uint16 rc:1;
uint16 rb:1;
uint16 :3;
uint16 df:1;
uint16 rm:1;
uint16 rw:1;
uint16 size:2;
uint16 :1;
uint16 as:3;
} _PACKED;
struct mc68040_ssw {
uint16 cp:1;
uint16 cu:1;
uint16 ct:1;
uint16 cm:1;
uint16 ma:1;
uint16 atc:1;
uint16 lk:1;
uint16 rw:1;
uint16 :1;
uint16 size:2;
uint16 tt:2;
uint16 tm:3;
} _PACKED;
struct mc68060_fslw {
uint32 :4;
uint32 ma:1;
uint32 :1;
uint32 lk:1;
uint32 rw:2; //XXX ??
uint32 size:2;
uint32 tt:2;
uint32 tm:2;
uint32 io:1;
uint32 pbe:1;
uint32 sbe:1;
uint32 pta:1;
uint32 ptb:1;
uint32 il:1;
uint32 pf:1;
uint32 sb:1;
uint32 wp:1;
uint32 twe:1;
uint32 re:1;
uint32 we:1;
uint32 ttr:1;
uint32 bpe:1;
uint32 :1;
uint32 see:1;
} _PACKED;
/* raw exception frames */
struct mc680x0_type_0_frame {
uint16 sr;
addr_t pc;
uint16 type:4;
uint16 vector:12;
};
struct mc680x0_type_1_frame {
uint16 sr;
addr_t pc;
uint16 type:4;
uint16 vector:12;
};
struct mc680x0_type_2_frame {
uint16 sr;
addr_t pc;
uint16 type:4;
uint16 vector:12;
addr_t instruction_address;
};
struct mc680x0_type_3_frame {
uint16 sr;
addr_t pc;
uint16 type:4;
uint16 vector:12;
addr_t effective_address;
};
struct mc68040_type_7_frame {
uint16 sr;
addr_t pc;
uint16 type:4;
uint16 vector:12;
addr_t effective_address;
struct mc68040_ssw ssw;
// write-back status
uint16 wb3s;
uint16 wb2s;
uint16 wb1s;
addr_t fault_address;
addr_t wb3a;
uint32 wb3d;
addr_t wb2a;
uint32 wb2d;
addr_t wb1a;
uint32 wb1d; // also pd0
uint32 pd1;
uint32 pd2;
uint32 pd3;
};
struct mc680x0_type_9_frame {
uint16 sr;
addr_t pc;
uint16 type:4;
uint16 vector:12;
addr_t instruction_address;
uint16 intregs[4];
};
struct mc68030_type_a_frame {
uint16 sr;
addr_t pc;
uint16 type:4;
uint16 vector:12;
uint16 intreg1;
struct mc68030_ssw ssw;
uint16 instpipe_c;
uint16 instpipe_b;
addr_t fault_address;
uint16 intregs2[2];
uint32 dataout;
uint16 intregs3[2];
};
struct mc68030_type_b_frame {
uint16 sr;
addr_t pc;
uint16 type:4;
uint16 vector:12;
uint16 intreg1;
struct mc68030_ssw ssw;
uint16 instpipe_c;
uint16 instpipe_b;
addr_t fault_address;
uint16 intregs2[2];
uint32 dataout;
uint16 intregs3[4];
uint32 stbaddr;
uint16 intregs4[2];
uint32 datain;
uint16 intregs5[3];
uint16 intinfo;
uint16 intregs6[18];
};
//XXX: add 060 frames
struct mc680x0_frame {
union {
struct {
uint32 inst;
} format2 _PACKED;
struct {
uint32 inst;
uint16 intregs[4];
} format9 _PACKED;
struct {
uint16 intregs[1];
uint16 ssw;
uint16 instpipe_c;
uint16 instpipe_b;
uint32 faultaddr;
uint16 intregs2[2];
uint32 dataout;
uint16 intregs3[2];
} formata _PACKED;
struct {
uint16 intregs[1];
uint16 ssw;
uint16 instpipe_c;
uint16 instpipe_b;
uint32 faultaddr;
uint16 intregs2[2];
uint32 dataout;
uint16 intregs3[4];
uint32 stbaddr;
uint16 intregs4[2];
uint32 datain;
uint16 intregs5[3];
uint16 intinfo;
uint16 intregs6[18];
} formatb _PACKED;
uint16 sr;
addr_t pc;
uint16 type:4;
uint16 vector:12;
};
struct mc680x0_type_0_frame type_0;
struct mc680x0_type_1_frame type_1;
struct mc680x0_type_2_frame type_2;
struct mc68040_type_7_frame type_7;
struct mc680x0_type_9_frame type_9;
struct mc68030_type_a_frame type_a;
struct mc68030_type_b_frame type_b;
// XXX: add 060 frames
};
};
#warning M68K: check for missing regs/movem
struct iframe {
// XXX: fp_frame ?
/* data and address registers */
// XXX: order depends on movem
uint32 d[8];
uint32 a[7];
/* cpu exception frame, including sr, pc, format and vector */
struct mc680x0_frame cpu;
/* uint32 vector;
uint32 srr0;
uint32 srr1;
@@ -13,34 +13,4 @@
#define NUM_IO_VECTORS 256
/* The sprg0 register of each CPU points to the physical address of such
a structure. So it is at hand in the early exception handling code.
*/
struct m68k_cpu_exception_context {
void *kernel_handle_exception; // exception handler routine in the
// kernel
void *exception_context; // the virtual address of this
// structure
void *kernel_stack; // kernel stack for the current thread
uint32 scratch[8]; // scratch memory for free use in the
// early exception handling code
};
#ifdef __cplusplus
extern "C" {
#endif
struct m68k_cpu_exception_context *m68k_get_cpu_exception_context(int cpu);
void m68k_set_current_cpu_exception_context(
struct m68k_cpu_exception_context *context);
// only called once per CPU
#ifdef __cplusplus
}
#endif
#endif /* _KERNEL_ARCH_M68K_INT_H */
+5 -9
View File
@@ -39,10 +39,6 @@ extern int __irqvec_end;
extern"C" void m68k_exception_tail(void);
// the exception contexts for all CPUs
static m68k_cpu_exception_context sCPUExceptionContexts[SMP_MAX_CPUS];
// An iframe stack used in the early boot process when we don't have
// threads yet.
struct iframe_stack gBootFrameStack;
@@ -82,13 +78,13 @@ print_iframe(struct iframe *frame)
{
dprintf("iframe at %p:\n", frame);
dprintf(" d0 0x%08lx d1 0x%08lx d2 0x%08lx d3 0x%08lx\n",
frame->d0, frame->d1, frame->d2, frame->d3);
frame->d[0], frame->d[1], frame->d[2], frame->d[3]);
kprintf(" d4 0x%08lx d5 0x%08lx d6 0x%08lx d7 0x%08lx\n",
frame->d4, frame->d5, frame->d6, frame->d7);
frame->d[4], frame->d[5], frame->d[6], frame->d[7]);
kprintf(" a0 0x%08lx a1 0x%08lx a2 0x%08lx a3 0x%08lx\n",
frame->a0, frame->a1, frame->a2, frame->a3);
kprintf(" a4 0x%08lx a5 0x%08lx a6 0x%08lx a7 0x%08lx (sp)\n",
frame->d4, frame->d5, frame->d6, frame->d7);
frame->a[0], frame->a[1], frame->a[2], frame->a[3]);
kprintf(" a4 0x%08lx a5 0x%08lx a6 0x%08lx "/*"a7 0x%08lx (sp)"*/"\n",
frame->a[4], frame->a[5], frame->a[6]/*, frame->a[7]*/);
/*kprintf(" pc 0x%08lx ccr 0x%02x\n",
frame->pc, frame->ccr);*/