summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2006-12-17 05:07:01 +0000
committerkmacy <kmacy@FreeBSD.org>2006-12-17 05:07:01 +0000
commitee539b99dcacb73703a09f64d8ada227bb88a165 (patch)
tree1efe0da4c2d3a8dd001c384ae0b90857bc051940 /sys/i386/isa
parent6795d7528dafe4542404d5c897996ab60825164e (diff)
downloadFreeBSD-src-ee539b99dcacb73703a09f64d8ada227bb88a165.zip
FreeBSD-src-ee539b99dcacb73703a09f64d8ada227bb88a165.tar.gz
Evidently FreeBSD has long relied on the compiler to treat structures
passed by value (trap frames) as if they were in fact being passed by reference. For better or worse, this incorrect behaviour is no longer present in gcc 4.1. In this patch I convert all trapframe arguments to be explicitly pass by reference. I also remove vm86_initflags, pushing the very little work that it actually does up into vm86_prepcall. Reviewed by: kan Tested by: kan
Diffstat (limited to 'sys/i386/isa')
-rw-r--r--sys/i386/isa/atpic.c4
-rw-r--r--sys/i386/isa/atpic_vector.s3
-rw-r--r--sys/i386/isa/icu.h2
3 files changed, 5 insertions, 4 deletions
diff --git a/sys/i386/isa/atpic.c b/sys/i386/isa/atpic.c
index 9dfaf0c..9cd3b33 100644
--- a/sys/i386/isa/atpic.c
+++ b/sys/i386/isa/atpic.c
@@ -558,7 +558,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;
@@ -585,7 +585,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/i386/isa/atpic_vector.s b/sys/i386/isa/atpic_vector.s
index 13b9b05..0e4e1b6 100644
--- a/sys/i386/isa/atpic_vector.s
+++ b/sys/i386/isa/atpic_vector.s
@@ -51,9 +51,10 @@ IDTVEC(vec_name) ; \
SET_KERNEL_SREGS ; \
; \
FAKE_MCOUNT(TF_EIP(%esp)) ; \
+ pushl %esp ; \
pushl $irq_num; /* pass the IRQ */ \
call atpic_handle_intr ; \
- addl $4, %esp ; /* discard the parameter */ \
+ addl $8, %esp ; /* discard the parameters */ \
; \
MEXITCOUNT ; \
jmp doreti
diff --git a/sys/i386/isa/icu.h b/sys/i386/isa/icu.h
index a74f183..bd9df08 100644
--- a/sys/i386/isa/icu.h
+++ b/sys/i386/isa/icu.h
@@ -47,7 +47,7 @@
#define ICU_IMR_OFFSET 1
#endif
-void atpic_handle_intr(u_int vector, struct trapframe frame);
+void atpic_handle_intr(u_int vector, struct trapframe *frame);
void atpic_startup(void);
#endif /* !_I386_ISA_ICU_H_ */
OpenPOWER on IntegriCloud