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