| 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__ */ |