aboutsummaryrefslogtreecommitdiffstats
path: root/netbsd-2.0-xen-sparse
diff options
context:
space:
mode:
authorcl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>2004-09-22 16:00:42 +0000
committercl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>2004-09-22 16:00:42 +0000
commitab8cc8dfe79f28758463df2b907affee3fd27418 (patch)
treef60f7124547da69dadf2649455d1b04e7a131bfe /netbsd-2.0-xen-sparse
parent262c170bd9d8b9f80329abf19154d6852c283777 (diff)
downloadxen-ab8cc8dfe79f28758463df2b907affee3fd27418.tar.gz
xen-ab8cc8dfe79f28758463df2b907affee3fd27418.tar.bz2
xen-ab8cc8dfe79f28758463df2b907affee3fd27418.zip
bitkeeper revision 1.1159.79.15 (4151a1aaxwsNrL2Uz8ag9J-2-2nVwQ)
Don't use fake clockframe for interrupt delivery. Fixes all cpu time getting accounted to the kernel and not to userspace programs.
Diffstat (limited to 'netbsd-2.0-xen-sparse')
-rw-r--r--netbsd-2.0-xen-sparse/sys/arch/xen/i386/hypervisor_machdep.c2
-rw-r--r--netbsd-2.0-xen-sparse/sys/arch/xen/i386/vector.S5
-rw-r--r--netbsd-2.0-xen-sparse/sys/arch/xen/include/evtchn.h2
-rw-r--r--netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h2
-rw-r--r--netbsd-2.0-xen-sparse/sys/arch/xen/xen/clock.c6
-rw-r--r--netbsd-2.0-xen-sparse/sys/arch/xen/xen/evtchn.c51
6 files changed, 52 insertions, 16 deletions
diff --git a/netbsd-2.0-xen-sparse/sys/arch/xen/i386/hypervisor_machdep.c b/netbsd-2.0-xen-sparse/sys/arch/xen/i386/hypervisor_machdep.c
index e08b5a64bd..82e998d3b6 100644
--- a/netbsd-2.0-xen-sparse/sys/arch/xen/i386/hypervisor_machdep.c
+++ b/netbsd-2.0-xen-sparse/sys/arch/xen/i386/hypervisor_machdep.c
@@ -151,7 +151,7 @@ stipending()
return (ret);
}
-void do_hypervisor_callback(struct trapframe *regs)
+void do_hypervisor_callback(struct intrframe *regs)
{
uint32_t l1;
unsigned long l2;
diff --git a/netbsd-2.0-xen-sparse/sys/arch/xen/i386/vector.S b/netbsd-2.0-xen-sparse/sys/arch/xen/i386/vector.S
index 165b5f06be..db7a57485d 100644
--- a/netbsd-2.0-xen-sparse/sys/arch/xen/i386/vector.S
+++ b/netbsd-2.0-xen-sparse/sys/arch/xen/i386/vector.S
@@ -1347,9 +1347,10 @@ ENTRY(hypervisor_callback)
jb 11f
cmpl $ecrit,%eax
jb critical_region_fixup
-11: push %esp
+11: pushl CPUVAR(ILEVEL)
+ push %esp
call do_hypervisor_callback
- add $4,%esp
+ add $8,%esp
movl HYPERVISOR_shared_info,%esi
xorl %eax,%eax
movb TF_CS(%esp),%cl
diff --git a/netbsd-2.0-xen-sparse/sys/arch/xen/include/evtchn.h b/netbsd-2.0-xen-sparse/sys/arch/xen/include/evtchn.h
index 5dd98ef250..f12ad28016 100644
--- a/netbsd-2.0-xen-sparse/sys/arch/xen/include/evtchn.h
+++ b/netbsd-2.0-xen-sparse/sys/arch/xen/include/evtchn.h
@@ -43,7 +43,7 @@ typedef int (*ev_handler_t)(void *);
void events_default_setup(void);
void init_events(void);
-unsigned int do_event(int, struct trapframe *);
+unsigned int do_event(int, struct intrframe *);
int event_set_handler(int, ev_handler_t, void *, int);
int bind_virq_to_irq(int);
diff --git a/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h b/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h
index 13442d22eb..83a170485e 100644
--- a/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h
+++ b/netbsd-2.0-xen-sparse/sys/arch/xen/include/hypervisor.h
@@ -83,7 +83,7 @@ extern union start_info_union start_info_union;
/* hypervisor.c */
-void do_hypervisor_callback(struct trapframe *regs);
+void do_hypervisor_callback(struct intrframe *regs);
void hypervisor_notify_via_evtchn(unsigned int);
void hypervisor_enable_irq(unsigned int);
void hypervisor_disable_irq(unsigned int);
diff --git a/netbsd-2.0-xen-sparse/sys/arch/xen/xen/clock.c b/netbsd-2.0-xen-sparse/sys/arch/xen/xen/clock.c
index 16add4e591..2db3332d21 100644
--- a/netbsd-2.0-xen-sparse/sys/arch/xen/xen/clock.c
+++ b/netbsd-2.0-xen-sparse/sys/arch/xen/xen/clock.c
@@ -51,7 +51,7 @@ __KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.1.2.2 2004/07/17 16:43:56 he Exp $");
#include "config_time.h" /* for CONFIG_TIME */
-static int xen_timer_handler(void *, struct trapframe *);
+static int xen_timer_handler(void *, struct intrframe *);
/* These are peridically updated in shared_info, and then copied here. */
static uint64_t shadow_tsc_stamp;
@@ -213,7 +213,7 @@ xen_initclocks()
}
static int
-xen_timer_handler(void *arg, struct trapframe *regs)
+xen_timer_handler(void *arg, struct intrframe *regs)
{
int64_t delta;
@@ -245,7 +245,7 @@ xen_timer_handler(void *arg, struct trapframe *regs)
delta = (int64_t)(shadow_system_time + get_tsc_offset_ns() -
processed_system_time);
while (delta >= NS_PER_TICK) {
- hardclock((struct clockframe *)regs);
+ hardclock(regs);
delta -= NS_PER_TICK;
processed_system_time += NS_PER_TICK;
}
diff --git a/netbsd-2.0-xen-sparse/sys/arch/xen/xen/evtchn.c b/netbsd-2.0-xen-sparse/sys/arch/xen/xen/evtchn.c
index ca3f7c99f6..0f275484dd 100644
--- a/netbsd-2.0-xen-sparse/sys/arch/xen/xen/evtchn.c
+++ b/netbsd-2.0-xen-sparse/sys/arch/xen/xen/evtchn.c
@@ -123,9 +123,13 @@ init_events()
}
unsigned int
-do_event(int irq, struct trapframe *regs)
+do_event(int irq, struct intrframe *regs)
{
struct cpu_info *ci;
+ int ilevel;
+ struct intrhand *ih;
+ int (*ih_fun)(void *, void *);
+ extern struct uvmexp uvmexp;
if (irq >= NR_IRQS) {
#ifdef DIAGNOSTIC
@@ -144,15 +148,46 @@ do_event(int irq, struct trapframe *regs)
hypervisor_acknowledge_irq(irq);
if (ci->ci_isources[irq] == NULL) {
+ hypervisor_enable_irq(irq);
+ return 0;
+ }
+ ilevel = ci->ci_ilevel;
+ if (ci->ci_isources[irq]->is_maxlevel <= ilevel) {
+ ci->ci_ipending |= 1 << irq;
+ /* leave masked */
return 0;
}
- __asm__ __volatile__ (
- " movl $1f,%%esi ;"
- " jmp *%%eax ;"
- "1: "
- : : "a" (ci->ci_isources[irq]->is_recurse),
- "b" (ci->ci_ilevel)
- : "esi", "ecx", "edx", "memory");
+ uvmexp.intrs++;
+ ci->ci_isources[irq]->is_evcnt.ev_count++;
+ ci->ci_ilevel = ci->ci_isources[irq]->is_maxlevel;
+ /* sti */
+ ci->ci_idepth++;
+#ifdef MULTIPROCESSOR
+ x86_intlock(regs);
+#endif
+ ih = ci->ci_isources[irq]->is_handlers;
+ while (ih != NULL) {
+ if (ih->ih_level <= ilevel) {
+#ifdef MULTIPROCESSOR
+ x86_intunlock(regs);
+#endif
+ ci->ci_ipending |= 1 << irq;
+ /* leave masked */
+ ci->ci_idepth--;
+ splx(ilevel);
+ return 0;
+ }
+ ci->ci_ilevel = ih->ih_level;
+ ih_fun = (void *)ih->ih_fun;
+ ih_fun(ih->ih_arg, regs);
+ ih = ih->ih_next;
+ }
+#ifdef MULTIPROCESSOR
+ x86_intunlock(regs);
+#endif
+ hypervisor_enable_irq(irq);
+ ci->ci_idepth--;
+ splx(ilevel);
if (0 && irq == 4)
printf("do_event %d done, ipending %08x\n", irq,