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