/SPARTAN/trunk/arch/ia64/include/stack.h |
---|
0,0 → 1,37 |
/* |
* Copyright (C) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef __ia64_STACK_H__ |
#define __ia64_STACK_H__ |
#define STACK_ITEM_SIZE 16 |
#define STACK_ALIGNMENT 16 |
#define STACK_SCRATCH_AREA_SIZE 16 |
#define REGISTER_STACK_ALIGNMENT 8 |
#endif |
/SPARTAN/trunk/arch/ia64/include/context.h |
---|
32,11 → 32,8 |
#include <arch/types.h> |
#include <typedefs.h> |
#include <align.h> |
#include <arch/stack.h> |
#define STACK_ITEM_SIZE 16 |
#define STACK_ALIGNMENT 16 |
#define REGISTER_STACK_ALIGNMENT 8 |
/* |
* context_save() and context_restore() are both leaf procedures. |
* No need to allocate scratch area. |
/SPARTAN/trunk/arch/ia64/src/ivt.S |
---|
26,7 → 26,15 |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/stack.h> |
#define STACK_ITEMS 12 |
#define STACK_FRAME_SIZE ((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE) |
#if (STACK_FRAME_SIZE % STACK_ALIGNMENT != 0) |
#error Memory stack must be 16-byte aligned. |
#endif |
/** Heavyweight interrupt handler |
* |
* This macro roughly follows steps from 1 to 19 described in |
57,15 → 65,16 |
/* assume kernel stack */ |
/* 4. save registers in bank 0 into memory stack */ |
add r12 = -8, r12 ;; |
add r31 = -8, r12 ;; |
add r12 = -STACK_FRAME_SIZE, r12 ;; |
st8 [r12] = r29, -8 ;; /* save predicate registers */ |
st8 [r31] = r29, -8 ;; /* save predicate registers */ |
st8 [r12] = r24, -8 ;; /* save cr.iip */ |
st8 [r12] = r25, -8 ;; /* save cr.ipsr */ |
st8 [r12] = r26, -8 ;; /* save cr.iipa */ |
st8 [r12] = r27, -8 ;; /* save cr.isr */ |
st8 [r12] = r28, -8 ;; /* save cr.ifa */ |
st8 [r31] = r24, -8 ;; /* save cr.iip */ |
st8 [r31] = r25, -8 ;; /* save cr.ipsr */ |
st8 [r31] = r26, -8 ;; /* save cr.iipa */ |
st8 [r31] = r27, -8 ;; /* save cr.isr */ |
st8 [r31] = r28, -8 ;; /* save cr.ifa */ |
/* 5. RSE switch from interrupted context */ |
.auto |
74,9 → 83,9 |
cover |
mov r26 = cr.ifs |
st8 [r12] = r24, -8 /* save ar.rsc */ |
st8 [r12] = r25, -8 /* save ar.pfs */ |
st8 [r12] = r26, -8 /* save ar.ifs */ |
st8 [r31] = r24, -8 /* save ar.rsc */ |
st8 [r31] = r25, -8 /* save ar.pfs */ |
st8 [r31] = r26, -8 /* save ar.ifs */ |
and r30 = ~3, r24 |
mov ar.rsc = r30 /* place RSE in enforced lazy mode */ |
89,9 → 98,9 |
mov r29 = ar.bsp |
st8 [r12] = r27, -8 /* save ar.rnat */ |
st8 [r12] = r28, -8 /* save ar.bspstore */ |
st8 [r12] = r29 /* save ar.bsp */ |
st8 [r31] = r27, -8 /* save ar.rnat */ |
st8 [r31] = r28, -8 /* save ar.bspstore */ |
st8 [r31] = r29 /* save ar.bsp */ |
mov ar.rsc = r24 /* restore RSE's setting */ |
.explicit |