summaryrefslogtreecommitdiffstats
path: root/sys/amd64/isa
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2006-12-17 06:48:40 +0000
committerkmacy <kmacy@FreeBSD.org>2006-12-17 06:48:40 +0000
commit20611107850a6c1de42880a35271d3a18a4b8811 (patch)
tree4a10bc4aba837d9f1be450b197838da90973dd1b /sys/amd64/isa
parentee539b99dcacb73703a09f64d8ada227bb88a165 (diff)
downloadFreeBSD-src-20611107850a6c1de42880a35271d3a18a4b8811.zip
FreeBSD-src-20611107850a6c1de42880a35271d3a18a4b8811.tar.gz
Newer versions of gcc don't support treating structures passed by value
as if they were really passed by reference. Specifically, the dead stores elimination pass in the GCC 4.1 optimiser breaks the non-compliant behavior on which FreeBSD relied. This change brings FreeBSD up to date by switching trap frames to being explicitly passed by reference. Reviewed by: kan Tested by: kan
Diffstat (limited to 'sys/amd64/isa')
-rw-r--r--sys/amd64/isa/atpic.c4
-rw-r--r--sys/amd64/isa/atpic_vector.S1
2 files changed, 3 insertions, 2 deletions
diff --git a/sys/amd64/isa/atpic.c b/sys/amd64/isa/atpic.c
index 1115c92..3a88eda 100644
--- a/sys/amd64/isa/atpic.c
+++ b/sys/amd64/isa/atpic.c
@@ -494,7 +494,7 @@ atpic_init(void *dummy __unused)
SYSINIT(atpic_init, SI_SUB_INTR, SI_ORDER_SECOND + 1, atpic_init, NULL)
void
-atpic_handle_intr(u_int vector, struct trapframe frame)
+atpic_handle_intr(u_int vector, struct trapframe *frame)
{
struct intsrc *isrc;
@@ -521,7 +521,7 @@ atpic_handle_intr(u_int vector, struct trapframe frame)
if ((isr & IRQ_MASK(7)) == 0)
return;
}
- intr_execute_handlers(isrc, &frame);
+ intr_execute_handlers(isrc, frame);
}
#ifdef DEV_ISA
diff --git a/sys/amd64/isa/atpic_vector.S b/sys/amd64/isa/atpic_vector.S
index 8cddf43..e7dcbc3 100644
--- a/sys/amd64/isa/atpic_vector.S
+++ b/sys/amd64/isa/atpic_vector.S
@@ -49,6 +49,7 @@
IDTVEC(vec_name) ; \
PUSH_FRAME ; \
FAKE_MCOUNT(TF_RIP(%rsp)) ; \
+ movq %rsp, %rsi ; \
movl $irq_num, %edi; /* pass the IRQ */ \
call atpic_handle_intr ; \
MEXITCOUNT ; \
OpenPOWER on IntegriCloud