Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* |
| 2 | * include/asm-v850/entry.h -- Definitions used by low-level trap handlers |
| 3 | * |
| 4 | * Copyright (C) 2001,02,03 NEC Electronics Corporation |
| 5 | * Copyright (C) 2001,02,03 Miles Bader <miles@gnu.org> |
| 6 | * |
| 7 | * This file is subject to the terms and conditions of the GNU General |
| 8 | * Public License. See the file COPYING in the main directory of this |
| 9 | * archive for more details. |
| 10 | * |
| 11 | * Written by Miles Bader <miles@gnu.org> |
| 12 | */ |
| 13 | |
| 14 | #ifndef __V850_ENTRY_H__ |
| 15 | #define __V850_ENTRY_H__ |
| 16 | |
| 17 | |
| 18 | #include <asm/ptrace.h> |
| 19 | #include <asm/machdep.h> |
| 20 | |
| 21 | |
| 22 | /* These are special variables using by the kernel trap/interrupt code |
| 23 | to save registers in, at a time when there are no spare registers we |
| 24 | can use to do so, and we can't depend on the value of the stack |
| 25 | pointer. This means that they must be within a signed 16-bit |
| 26 | displacement of 0x00000000. */ |
| 27 | |
| 28 | #define KERNEL_VAR_SPACE_ADDR R0_RAM_ADDR |
| 29 | |
| 30 | #ifdef __ASSEMBLY__ |
| 31 | #define KERNEL_VAR(addr) addr[r0] |
| 32 | #else |
| 33 | #define KERNEL_VAR(addr) (*(volatile unsigned long *)(addr)) |
| 34 | #endif |
| 35 | |
| 36 | /* Kernel stack pointer, 4 bytes. */ |
| 37 | #define KSP_ADDR (KERNEL_VAR_SPACE_ADDR + 0) |
| 38 | #define KSP KERNEL_VAR (KSP_ADDR) |
| 39 | /* 1 if in kernel-mode, 0 if in user mode, 1 byte. */ |
| 40 | #define KM_ADDR (KERNEL_VAR_SPACE_ADDR + 4) |
| 41 | #define KM KERNEL_VAR (KM_ADDR) |
| 42 | /* Temporary storage for interrupt handlers, 4 bytes. */ |
| 43 | #define INT_SCRATCH_ADDR (KERNEL_VAR_SPACE_ADDR + 8) |
| 44 | #define INT_SCRATCH KERNEL_VAR (INT_SCRATCH_ADDR) |
| 45 | /* Where the stack-pointer is saved when jumping to various sorts of |
| 46 | interrupt handlers. ENTRY_SP is used by everything except NMIs, |
| 47 | which have their own location. Higher-priority NMIs can clobber the |
| 48 | value written by a lower priority NMI, since they can't be disabled, |
| 49 | but that's OK, because only NMI0 (the lowest-priority one) is allowed |
| 50 | to return. */ |
| 51 | #define ENTRY_SP_ADDR (KERNEL_VAR_SPACE_ADDR + 12) |
| 52 | #define ENTRY_SP KERNEL_VAR (ENTRY_SP_ADDR) |
| 53 | #define NMI_ENTRY_SP_ADDR (KERNEL_VAR_SPACE_ADDR + 16) |
| 54 | #define NMI_ENTRY_SP KERNEL_VAR (NMI_ENTRY_SP_ADDR) |
| 55 | |
| 56 | #ifdef CONFIG_RESET_GUARD |
| 57 | /* Used to detect unexpected resets (since the v850 has no MMU, any call |
| 58 | through a null pointer will jump to the reset vector). We detect |
| 59 | such resets by checking for a magic value, RESET_GUARD_ACTIVE, in |
| 60 | this location. Properly resetting the machine stores zero there, so |
| 61 | it shouldn't trigger the guard; the power-on value is uncertain, but |
| 62 | it's unlikely to be RESET_GUARD_ACTIVE. */ |
| 63 | #define RESET_GUARD_ADDR (KERNEL_VAR_SPACE_ADDR + 28) |
| 64 | #define RESET_GUARD KERNEL_VAR (RESET_GUARD_ADDR) |
| 65 | #define RESET_GUARD_ACTIVE 0xFAB4BEEF |
| 66 | #endif /* CONFIG_RESET_GUARD */ |
| 67 | |
| 68 | #ifdef CONFIG_V850E_HIGHRES_TIMER |
| 69 | #define HIGHRES_TIMER_SLOW_TICKS_ADDR (KERNEL_VAR_SPACE_ADDR + 32) |
| 70 | #define HIGHRES_TIMER_SLOW_TICKS KERNEL_VAR (HIGHRES_TIMER_SLOW_TICKS_ADDR) |
| 71 | #endif /* CONFIG_V850E_HIGHRES_TIMER */ |
| 72 | |
| 73 | #ifndef __ASSEMBLY__ |
| 74 | |
| 75 | #ifdef CONFIG_RESET_GUARD |
| 76 | /* Turn off reset guard, so that resetting the machine works normally. |
| 77 | This should be called in the various machine_halt, etc., functions. */ |
| 78 | static inline void disable_reset_guard (void) |
| 79 | { |
| 80 | RESET_GUARD = 0; |
| 81 | } |
| 82 | #endif /* CONFIG_RESET_GUARD */ |
| 83 | |
| 84 | #endif /* !__ASSEMBLY__ */ |
| 85 | |
| 86 | |
| 87 | /* A `state save frame' is a struct pt_regs preceded by some extra space |
| 88 | suitable for a function call stack frame. */ |
| 89 | |
| 90 | /* Amount of room on the stack reserved for arguments and to satisfy the |
| 91 | C calling conventions, in addition to the space used by the struct |
| 92 | pt_regs that actually holds saved values. */ |
| 93 | #define STATE_SAVE_ARG_SPACE (6*4) /* Up to six arguments. */ |
| 94 | |
| 95 | |
| 96 | #ifdef __ASSEMBLY__ |
| 97 | |
| 98 | /* The size of a state save frame. */ |
| 99 | #define STATE_SAVE_SIZE (PT_SIZE + STATE_SAVE_ARG_SPACE) |
| 100 | |
| 101 | #else /* !__ASSEMBLY__ */ |
| 102 | |
| 103 | /* The size of a state save frame. */ |
| 104 | #define STATE_SAVE_SIZE (sizeof (struct pt_regs) + STATE_SAVE_ARG_SPACE) |
| 105 | |
| 106 | #endif /* __ASSEMBLY__ */ |
| 107 | |
| 108 | |
| 109 | /* Offset of the struct pt_regs in a state save frame. */ |
| 110 | #define STATE_SAVE_PT_OFFSET STATE_SAVE_ARG_SPACE |
| 111 | |
| 112 | |
| 113 | #endif /* __V850_ENTRY_H__ */ |