blob: 0c32e3cfc69337e6c11e2819e33865f10644623b [file] [log] [blame]
/*
* Copyright (c) 2019-2020 Cobham Gaisler AB
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_ARCH_SPARC_CORE_STACK_H_
#define ZEPHYR_ARCH_SPARC_CORE_STACK_H_
/*
* Offsets for SPARC ABI stack frame.
*
* Reference: System V Application Binary Interface, SPARC Processor
* Supplement, Third Edition, Page 3-35.
*/
#define STACK_FRAME_L0_OFFSET 0x00
#define STACK_FRAME_L1_OFFSET 0x04
#define STACK_FRAME_L2_OFFSET 0x08
#define STACK_FRAME_L3_OFFSET 0x0c
#define STACK_FRAME_L4_OFFSET 0x10
#define STACK_FRAME_L5_OFFSET 0x14
#define STACK_FRAME_L6_OFFSET 0x18
#define STACK_FRAME_L7_OFFSET 0x1c
#define STACK_FRAME_I0_OFFSET 0x20
#define STACK_FRAME_I1_OFFSET 0x24
#define STACK_FRAME_I2_OFFSET 0x28
#define STACK_FRAME_I3_OFFSET 0x2c
#define STACK_FRAME_I4_OFFSET 0x30
#define STACK_FRAME_I5_OFFSET 0x34
#define STACK_FRAME_I6_OFFSET 0x38
#define STACK_FRAME_I7_OFFSET 0x3c
#define STACK_FRAME_STRUCTURE_RETURN_ADDRESS_OFFSET 0x40
#define STACK_FRAME_SAVED_ARG0_OFFSET 0x44
#define STACK_FRAME_SAVED_ARG1_OFFSET 0x48
#define STACK_FRAME_SAVED_ARG2_OFFSET 0x4c
#define STACK_FRAME_SAVED_ARG3_OFFSET 0x50
#define STACK_FRAME_SAVED_ARG4_OFFSET 0x54
#define STACK_FRAME_SAVED_ARG5_OFFSET 0x58
#define STACK_FRAME_PAD0_OFFSET 0x5c
#define STACK_FRAME_SIZE 0x60
/* Interrupt stack frame */
#define ISF_PSR_OFFSET (0x40 + 0x00)
#define ISF_PC_OFFSET (0x40 + 0x04)
#define ISF_NPC_OFFSET (0x40 + 0x08)
#define ISF_G1_OFFSET (0x40 + 0x0c)
#define ISF_G2_OFFSET (0x40 + 0x10)
#define ISF_G3_OFFSET (0x40 + 0x14)
#define ISF_G4_OFFSET (0x40 + 0x18)
#define ISF_Y_OFFSET (0x40 + 0x1c)
#if !defined(_FLAT)
#define ISF_SIZE (0x20)
#else
/*
* The flat ABI stores and loads "local" and "in" registers in the save area as
* part of function prologue and epilogue. So we allocate space for a new save
* area (0x40 byte) as part of the interrupt stack frame.
*/
#define ISF_SIZE (0x40 + 0x20)
#endif
#endif /* ZEPHYR_ARCH_SPARC_CORE_STACK_H_ */