| #ifndef __M68K_ENTRY_H |
| #define __M68K_ENTRY_H |
| |
| #include <asm/setup.h> |
| #include <asm/page.h> |
| |
| /* |
| * Stack layout in 'ret_from_exception': |
| * |
| * This allows access to the syscall arguments in registers d1-d5 |
| * |
| * 0(sp) - d1 |
| * 4(sp) - d2 |
| * 8(sp) - d3 |
| * C(sp) - d4 |
| * 10(sp) - d5 |
| * 14(sp) - a0 |
| * 18(sp) - a1 |
| * 1C(sp) - a2 |
| * 20(sp) - d0 |
| * 24(sp) - orig_d0 |
| * 28(sp) - stack adjustment |
| * 2C(sp) - sr |
| * 2E(sp) - pc |
| * 32(sp) - format & vector |
| */ |
| |
| /* |
| * 97/05/14 Andreas: Register %a2 is now set to the current task throughout |
| * the whole kernel. |
| */ |
| |
| /* the following macro is used when enabling interrupts */ |
| #if defined(MACH_ATARI_ONLY) && !defined(CONFIG_HADES) |
| /* block out HSYNC on the atari */ |
| #define ALLOWINT (~0x400) |
| #define MAX_NOINT_IPL 3 |
| #else |
| /* portable version */ |
| #define ALLOWINT (~0x700) |
| #define MAX_NOINT_IPL 0 |
| #endif /* machine compilation types */ |
| |
| #ifdef __ASSEMBLY__ |
| |
| #define curptr a2 |
| |
| LFLUSH_I_AND_D = 0x00000808 |
| LSIGTRAP = 5 |
| |
| /* process bits for task_struct.ptrace */ |
| PT_TRACESYS_OFF = 3 |
| PT_TRACESYS_BIT = 1 |
| PT_PTRACED_OFF = 3 |
| PT_PTRACED_BIT = 0 |
| PT_DTRACE_OFF = 3 |
| PT_DTRACE_BIT = 2 |
| |
| #define SAVE_ALL_INT save_all_int |
| #define SAVE_ALL_SYS save_all_sys |
| #define RESTORE_ALL restore_all |
| /* |
| * This defines the normal kernel pt-regs layout. |
| * |
| * regs a3-a6 and d6-d7 are preserved by C code |
| * the kernel doesn't mess with usp unless it needs to |
| */ |
| |
| /* |
| * a -1 in the orig_d0 field signifies |
| * that the stack frame is NOT for syscall |
| */ |
| .macro save_all_int |
| clrl %sp@- | stk_adj |
| pea -1:w | orig d0 |
| movel %d0,%sp@- | d0 |
| moveml %d1-%d5/%a0-%a1/%curptr,%sp@- |
| .endm |
| |
| .macro save_all_sys |
| clrl %sp@- | stk_adj |
| movel %d0,%sp@- | orig d0 |
| movel %d0,%sp@- | d0 |
| moveml %d1-%d5/%a0-%a1/%curptr,%sp@- |
| .endm |
| |
| .macro restore_all |
| moveml %sp@+,%a0-%a1/%curptr/%d1-%d5 |
| movel %sp@+,%d0 |
| addql #4,%sp | orig d0 |
| addl %sp@+,%sp | stk adj |
| rte |
| .endm |
| |
| #define SWITCH_STACK_SIZE (6*4+4) /* includes return address */ |
| |
| #define SAVE_SWITCH_STACK save_switch_stack |
| #define RESTORE_SWITCH_STACK restore_switch_stack |
| #define GET_CURRENT(tmp) get_current tmp |
| |
| .macro save_switch_stack |
| moveml %a3-%a6/%d6-%d7,%sp@- |
| .endm |
| |
| .macro restore_switch_stack |
| moveml %sp@+,%a3-%a6/%d6-%d7 |
| .endm |
| |
| .macro get_current reg=%d0 |
| movel %sp,\reg |
| andw #-THREAD_SIZE,\reg |
| movel \reg,%curptr |
| movel %curptr@,%curptr |
| .endm |
| |
| #else /* C source */ |
| |
| #define STR(X) STR1(X) |
| #define STR1(X) #X |
| |
| #define PT_OFF_ORIG_D0 0x24 |
| #define PT_OFF_FORMATVEC 0x32 |
| #define PT_OFF_SR 0x2C |
| #define SAVE_ALL_INT \ |
| "clrl %%sp@-;" /* stk_adj */ \ |
| "pea -1:w;" /* orig d0 = -1 */ \ |
| "movel %%d0,%%sp@-;" /* d0 */ \ |
| "moveml %%d1-%%d5/%%a0-%%a2,%%sp@-" |
| #define GET_CURRENT(tmp) \ |
| "movel %%sp,"#tmp"\n\t" \ |
| "andw #-"STR(THREAD_SIZE)","#tmp"\n\t" \ |
| "movel "#tmp",%%a2\n\t" \ |
| "movel %%a2@,%%a2" |
| |
| #endif |
| |
| #endif /* __M68K_ENTRY_H */ |