| /* | |
| * include/asm-v850/entry.h -- Definitions used by low-level trap handlers | |
| * | |
| * Copyright (C) 2001,02,03 NEC Electronics Corporation | |
| * Copyright (C) 2001,02,03 Miles Bader <miles@gnu.org> | |
| * | |
| * This file is subject to the terms and conditions of the GNU General | |
| * Public License. See the file COPYING in the main directory of this | |
| * archive for more details. | |
| * | |
| * Written by Miles Bader <miles@gnu.org> | |
| */ | |
| #ifndef __V850_ENTRY_H__ | |
| #define __V850_ENTRY_H__ | |
| #include <asm/ptrace.h> | |
| #include <asm/machdep.h> | |
| /* These are special variables using by the kernel trap/interrupt code | |
| to save registers in, at a time when there are no spare registers we | |
| can use to do so, and we can't depend on the value of the stack | |
| pointer. This means that they must be within a signed 16-bit | |
| displacement of 0x00000000. */ | |
| #define KERNEL_VAR_SPACE_ADDR R0_RAM_ADDR | |
| #ifdef __ASSEMBLY__ | |
| #define KERNEL_VAR(addr) addr[r0] | |
| #else | |
| #define KERNEL_VAR(addr) (*(volatile unsigned long *)(addr)) | |
| #endif | |
| /* Kernel stack pointer, 4 bytes. */ | |
| #define KSP_ADDR (KERNEL_VAR_SPACE_ADDR + 0) | |
| #define KSP KERNEL_VAR (KSP_ADDR) | |
| /* 1 if in kernel-mode, 0 if in user mode, 1 byte. */ | |
| #define KM_ADDR (KERNEL_VAR_SPACE_ADDR + 4) | |
| #define KM KERNEL_VAR (KM_ADDR) | |
| /* Temporary storage for interrupt handlers, 4 bytes. */ | |
| #define INT_SCRATCH_ADDR (KERNEL_VAR_SPACE_ADDR + 8) | |
| #define INT_SCRATCH KERNEL_VAR (INT_SCRATCH_ADDR) | |
| /* Where the stack-pointer is saved when jumping to various sorts of | |
| interrupt handlers. ENTRY_SP is used by everything except NMIs, | |
| which have their own location. Higher-priority NMIs can clobber the | |
| value written by a lower priority NMI, since they can't be disabled, | |
| but that's OK, because only NMI0 (the lowest-priority one) is allowed | |
| to return. */ | |
| #define ENTRY_SP_ADDR (KERNEL_VAR_SPACE_ADDR + 12) | |
| #define ENTRY_SP KERNEL_VAR (ENTRY_SP_ADDR) | |
| #define NMI_ENTRY_SP_ADDR (KERNEL_VAR_SPACE_ADDR + 16) | |
| #define NMI_ENTRY_SP KERNEL_VAR (NMI_ENTRY_SP_ADDR) | |
| #ifdef CONFIG_RESET_GUARD | |
| /* Used to detect unexpected resets (since the v850 has no MMU, any call | |
| through a null pointer will jump to the reset vector). We detect | |
| such resets by checking for a magic value, RESET_GUARD_ACTIVE, in | |
| this location. Properly resetting the machine stores zero there, so | |
| it shouldn't trigger the guard; the power-on value is uncertain, but | |
| it's unlikely to be RESET_GUARD_ACTIVE. */ | |
| #define RESET_GUARD_ADDR (KERNEL_VAR_SPACE_ADDR + 28) | |
| #define RESET_GUARD KERNEL_VAR (RESET_GUARD_ADDR) | |
| #define RESET_GUARD_ACTIVE 0xFAB4BEEF | |
| #endif /* CONFIG_RESET_GUARD */ | |
| #ifdef CONFIG_V850E_HIGHRES_TIMER | |
| #define HIGHRES_TIMER_SLOW_TICKS_ADDR (KERNEL_VAR_SPACE_ADDR + 32) | |
| #define HIGHRES_TIMER_SLOW_TICKS KERNEL_VAR (HIGHRES_TIMER_SLOW_TICKS_ADDR) | |
| #endif /* CONFIG_V850E_HIGHRES_TIMER */ | |
| #ifndef __ASSEMBLY__ | |
| #ifdef CONFIG_RESET_GUARD | |
| /* Turn off reset guard, so that resetting the machine works normally. | |
| This should be called in the various machine_halt, etc., functions. */ | |
| static inline void disable_reset_guard (void) | |
| { | |
| RESET_GUARD = 0; | |
| } | |
| #endif /* CONFIG_RESET_GUARD */ | |
| #endif /* !__ASSEMBLY__ */ | |
| /* A `state save frame' is a struct pt_regs preceded by some extra space | |
| suitable for a function call stack frame. */ | |
| /* Amount of room on the stack reserved for arguments and to satisfy the | |
| C calling conventions, in addition to the space used by the struct | |
| pt_regs that actually holds saved values. */ | |
| #define STATE_SAVE_ARG_SPACE (6*4) /* Up to six arguments. */ | |
| #ifdef __ASSEMBLY__ | |
| /* The size of a state save frame. */ | |
| #define STATE_SAVE_SIZE (PT_SIZE + STATE_SAVE_ARG_SPACE) | |
| #else /* !__ASSEMBLY__ */ | |
| /* The size of a state save frame. */ | |
| #define STATE_SAVE_SIZE (sizeof (struct pt_regs) + STATE_SAVE_ARG_SPACE) | |
| #endif /* __ASSEMBLY__ */ | |
| /* Offset of the struct pt_regs in a state save frame. */ | |
| #define STATE_SAVE_PT_OFFSET STATE_SAVE_ARG_SPACE | |
| #endif /* __V850_ENTRY_H__ */ |