/kernel/trunk/arch/ia64/include/interrupt.h |
---|
70,6 → 70,7 |
__u64 in1; |
__u64 in2; |
__u64 in3; |
__u64 in4; |
} __attribute__ ((packed)); |
extern void *ivt; |
/kernel/trunk/arch/ia64/src/ivt.S |
---|
32,7 → 32,7 |
#include <arch/mm/page.h> |
#include <align.h> |
#define STACK_ITEMS 18 |
#define STACK_ITEMS 19 |
#define STACK_FRAME_SIZE ALIGN_UP((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT) |
#if (STACK_ITEMS % 2 == 0) |
130,12 → 130,13 |
* Otherwise p6 is false and p5 is true. |
* Note that p5 is a preserved predicate register and we make use of it. |
*/ |
(p6) st8 [r31] = r36, -8 ;; /* save in4 */ |
(p6) st8 [r31] = r35, -8 ;; /* save in3 */ |
(p6) st8 [r31] = r34, -8 ;; /* save in2 */ |
(p6) st8 [r31] = r33, -8 ;; /* save in1 */ |
(p6) st8 [r31] = r32, -8 ;; /* save in0 */ |
(p5) add r31 = -32, r31 ;; |
(p5) add r31 = -40, r31 ;; |
st8 [r31] = r30, -8 ;; /* save old stack pointer */ |
/kernel/trunk/arch/ia64/src/ia64.c |
---|
35,6 → 35,7 |
#include <arch/register.h> |
#include <arch/types.h> |
#include <arch/context.h> |
#include <arch/stack.h> |
#include <arch/mm/page.h> |
#include <mm/as.h> |
#include <config.h> |
83,7 → 84,7 |
rsc.pl = PL_USER; |
rsc.mode = 3; /* eager mode */ |
switch_to_userspace(entry, USTACK_ADDRESS+PAGE_SIZE-1, USTACK_ADDRESS, psr.value, rsc.value); |
switch_to_userspace(entry, USTACK_ADDRESS+PAGE_SIZE-ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT), USTACK_ADDRESS, psr.value, rsc.value); |
while (1) { |
; |
/kernel/trunk/arch/ia64/src/interrupt.c |
---|
186,10 → 186,10 |
istate->cr_ipsr.ri++; |
} |
if (istate->in3 < SYSCALL_END) |
return syscall_table[istate->in3](istate->in0, istate->in1, istate->in2); |
if (istate->in4 < SYSCALL_END) |
return syscall_table[istate->in4](istate->in0, istate->in1, istate->in2, istate->in3); |
else |
panic("Undefined syscall %d", istate->in3); |
panic("Undefined syscall %d", istate->in4); |
return -1; |
} |