114 строки
3.9 KiB
C
114 строки
3.9 KiB
C
|
/*
|
||
|
* 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__ */
|