/kernel/trunk/tools/sparc64/gencontext.c |
---|
45,6 → 45,7 |
fprintf(f,"#define OFFSET_L5 0x%x\n",((int)&pctx->l5) - (int )pctx); |
fprintf(f,"#define OFFSET_L6 0x%x\n",((int)&pctx->l6) - (int )pctx); |
fprintf(f,"#define OFFSET_L7 0x%x\n",((int)&pctx->l7) - (int )pctx); |
fprintf(f,"#define OFFSET_CLEANWIN 0x%x\n",((int)&pctx->cleanwin) - (int )pctx); |
fclose(f); |
/kernel/trunk/arch/sparc64/include/context_offset.h |
---|
18,3 → 18,4 |
#define OFFSET_L5 0x78 |
#define OFFSET_L6 0x80 |
#define OFFSET_L7 0x88 |
#define OFFSET_CLEANWIN 0x98 |
/kernel/trunk/arch/sparc64/include/trap/regwin.h |
---|
118,12 → 118,14 |
mov %r0, %l5 |
mov %r0, %l6 |
mov %r0, %l7 |
mov %r0, %i0 |
mov %r0, %i1 |
mov %r0, %i2 |
mov %r0, %i3 |
mov %r0, %i4 |
mov %r0, %i5 |
mov %r0, %o0 |
mov %r0, %o1 |
mov %r0, %o2 |
mov %r0, %o3 |
mov %r0, %o4 |
mov %r0, %o5 |
mov %r0, %o6 |
mov %r0, %o7 |
retry |
.endm |
#endif /* __ASM__ */ |
/kernel/trunk/arch/sparc64/include/trap/interrupt.h |
---|
34,6 → 34,7 |
#define __sparc64_INTERRUPT_H__ |
#include <arch/trap/trap_table.h> |
#include <arch/stack.h> |
#define TT_INTERRUPT_LEVEL_1 0x41 |
#define TT_INTERRUPT_LEVEL_2 0x42 |
58,12 → 59,10 |
#ifdef __ASM__ |
.macro INTERRUPT_LEVEL_N_HANDLER n |
save %sp, -128, %sp |
save %sp, -STACK_WINDOW_SAVE_AREA_SIZE, %sp |
mov \n - 1, %o0 |
call exc_dispatch |
mov %fp, %o1 |
restore |
retry |
SAVING_HANDLER exc_dispatch |
.endm |
.macro INTERRUPT_VECTOR_TRAP_HANDLER |
/kernel/trunk/arch/sparc64/include/trap/trap_table.h |
---|
33,6 → 33,8 |
#include <arch/types.h> |
#endif /* __ASM__ */ |
#include <arch/stack.h> |
#define TRAP_TABLE_ENTRY_COUNT 1024 |
#define TRAP_TABLE_ENTRY_SIZE 32 |
#define TRAP_TABLE_SIZE (TRAP_TABLE_ENTRY_COUNT*TRAP_TABLE_ENTRY_SIZE) |
48,4 → 50,32 |
extern trap_table_entry_t trap_table_save[TRAP_TABLE_ENTRY_COUNT]; |
#endif /* !__ASM__ */ |
#ifdef __ASM__ |
.macro SAVE_GLOBALS |
mov %g1, %l1 |
mov %g2, %l2 |
mov %g3, %l3 |
mov %g4, %l4 |
mov %g5, %l5 |
mov %g6, %l6 |
mov %g7, %l7 |
.endm |
.macro RESTORE_GLOBALS |
mov %l1, %g1 |
mov %l2, %g2 |
mov %l3, %g3 |
mov %l4, %g4 |
mov %l5, %g5 |
mov %l6, %g6 |
mov %l7, %g7 |
.endm |
.macro SAVING_HANDLER f |
set \f, %l0 |
b saving_handler |
nop |
.endm |
#endif /* __ASM__ */ |
#endif |
/kernel/trunk/arch/sparc64/include/context.h |
---|
50,7 → 50,8 |
#define context_set(c, _pc, stack, size) \ |
(c)->pc = ((__address) _pc) - 8; \ |
(c)->sp = ((__address) stack) + ALIGN_UP((size), STACK_ALIGNMENT) - (STACK_BIAS + SP_DELTA); \ |
(c)->fp = -STACK_BIAS |
(c)->fp = -STACK_BIAS; \ |
(c)->cleanwin = 0 |
/* |
77,6 → 78,7 |
__u64 l6; |
__u64 l7; |
ipl_t ipl; |
__u64 cleanwin; |
}; |
#endif |
/kernel/trunk/arch/sparc64/src/context.S |
---|
61,6 → 61,8 |
stx %l5, [\r + OFFSET_L5] |
stx %l6, [\r + OFFSET_L6] |
stx %l7, [\r + OFFSET_L7] |
rdpr %cleanwin, %g1 |
stx %g1, [\r + OFFSET_CLEANWIN] |
.endm |
.macro CONTEXT_LOAD r |
82,6 → 84,8 |
ldx [\r + OFFSET_L5], %l5 |
ldx [\r + OFFSET_L6], %l6 |
ldx [\r + OFFSET_L7], %l7 |
ldx [\r + OFFSET_CLEANWIN], %g1 |
wrpr %g1, %g0, %cleanwin |
.endm |
context_save_arch: |
/kernel/trunk/arch/sparc64/src/trap/trap_table.S |
---|
37,7 → 37,12 |
* This arrangement is beneficial because kernel handlers stay on their |
* link-time addresses which is good for debugging. |
*/ |
.register %g2, #scratch |
.register %g3, #scratch |
.register %g6, #scratch |
.register %g7, #scratch |
.text |
#include <arch/trap/trap_table.h> |
202,3 → 207,20 |
.global trap_table_save |
trap_table_save: |
.space TABLE_SIZE, 0 |
/* Trap handler that explicitly saves global registers. |
* |
* Input registers: |
* %l0 Address of function to call. |
* Output registers: |
* %l1 - %l7 Copy of %g1 - %g7 |
*/ |
.global saving_handler |
saving_handler: |
SAVE_GLOBALS |
call %l0 |
nop |
RESTORE_GLOBALS |
restore /* matches the save instruction from the top-level handler */ |
retry |
/kernel/trunk/arch/sparc64/src/panic.S |
---|
28,10 → 28,15 |
.text |
#include <arch/stack.h> |
.global panic_printf |
panic_printf: |
save %sp, -STACK_WINDOW_SAVE_AREA_SIZE, %sp |
call printf |
nop |
call halt |
nop |
/* Not reached. */ |
restore |