ChangeSet 1.1423.5.3, 2005/05/09 12:51:24-06:00, djm@xxxxxxxxxxxxxxx
Move per-domain-per-cpu variables out of shared page for security
arch/ia64/asm-offsets.c | 4 -
arch/ia64/process.c | 5 +
arch/ia64/vcpu.c | 134 ++++++++++++++++++++++-----------------------
include/asm-ia64/domain.h | 20 ++++++
include/public/arch-ia64.h | 20 ------
5 files changed, 93 insertions(+), 90 deletions(-)
diff -Nru a/xen/arch/ia64/asm-offsets.c b/xen/arch/ia64/asm-offsets.c
--- a/xen/arch/ia64/asm-offsets.c 2005-05-11 03:03:50 -04:00
+++ b/xen/arch/ia64/asm-offsets.c 2005-05-11 03:03:50 -04:00
@@ -50,8 +50,8 @@
//DEFINE(IA64_TASK_SIGHAND_OFFSET,offsetof (struct task_struct,
sighand));
//DEFINE(IA64_TASK_SIGNAL_OFFSET,offsetof (struct task_struct, signal));
//DEFINE(IA64_TASK_TGID_OFFSET, offsetof (struct task_struct, tgid));
- DEFINE(IA64_TASK_THREAD_KSP_OFFSET, offsetof (struct task_struct,
thread.ksp));
- DEFINE(IA64_TASK_THREAD_ON_USTACK_OFFSET, offsetof (struct task_struct,
thread.on_ustack));
+ DEFINE(IA64_TASK_THREAD_KSP_OFFSET, offsetof (struct exec_domain,
arch._thread.ksp));
+ DEFINE(IA64_TASK_THREAD_ON_USTACK_OFFSET, offsetof (struct exec_domain,
arch._thread.on_ustack));
BLANK();
diff -Nru a/xen/arch/ia64/process.c b/xen/arch/ia64/process.c
--- a/xen/arch/ia64/process.c 2005-05-11 03:03:50 -04:00
+++ b/xen/arch/ia64/process.c 2005-05-11 03:03:50 -04:00
@@ -51,6 +51,7 @@
IA64_PSR_SS | IA64_PSR_RI | IA64_PSR_ED | IA64_PSR_IA)
#define PSCB(x,y) x->vcpu_info->arch.y
+#define PSCBX(x,y) x->arch.y
extern unsigned long vcpu_verbose;
@@ -154,7 +155,7 @@
}
//printf("Delivering NESTED DATA TLB fault\n");
vector = IA64_DATA_NESTED_TLB_VECTOR;
- regs->cr_iip = ((unsigned long) PSCB(ed,iva) + vector) &
~0xffUL;
+ regs->cr_iip = ((unsigned long) PSCBX(ed,iva) + vector) &
~0xffUL;
regs->cr_ipsr = (regs->cr_ipsr & ~DELIVER_PSR_CLR) |
DELIVER_PSR_SET;
// NOTE: nested trap must NOT pass PSCB address
//regs->r31 = (unsigned long) &PSCB(ed);
@@ -187,7 +188,7 @@
PSCB(ed,ifs) = 0;
PSCB(ed,incomplete_regframe) = 0;
- regs->cr_iip = ((unsigned long) PSCB(ed,iva) + vector) & ~0xffUL;
+ regs->cr_iip = ((unsigned long) PSCBX(ed,iva) + vector) & ~0xffUL;
regs->cr_ipsr = (regs->cr_ipsr & ~DELIVER_PSR_CLR) | DELIVER_PSR_SET;
#ifdef CONFIG_SMP
#error "sharedinfo doesn't handle smp yet"
diff -Nru a/xen/arch/ia64/vcpu.c b/xen/arch/ia64/vcpu.c
--- a/xen/arch/ia64/vcpu.c 2005-05-11 03:03:50 -04:00
+++ b/xen/arch/ia64/vcpu.c 2005-05-11 03:03:50 -04:00
@@ -1,6 +1,6 @@
/*
* Virtualized CPU functions
- *
+ *
* Copyright (C) 2004 Hewlett-Packard Co.
* Dan Magenheimer (dan.magenheimer@xxxxxx)
*
@@ -26,6 +26,7 @@
// this def for vcpu_regs won't work if kernel stack is present
#define vcpu_regs(vcpu) ((struct pt_regs *) vcpu->arch.regs)
#define PSCB(x,y) x->vcpu_info->arch.y
+#define PSCBX(x,y) x->arch.y
#define TRUE 1
#define FALSE 0
@@ -289,9 +290,9 @@
UINT64 vcpu_get_ipsr_int_state(VCPU *vcpu,UINT64 prevpsr)
{
- UINT64 dcr = PSCB(vcpu,dcr);
+ UINT64 dcr = PSCBX(vcpu,dcr);
PSR psr = {0};
-
+
//printf("*** vcpu_get_ipsr_int_state (0x%016lx)...",prevpsr);
psr.i64 = prevpsr;
psr.ia64_psr.be = 0; if (dcr & IA64_DCR_BE) psr.ia64_psr.be = 1;
@@ -317,13 +318,13 @@
//verbose("vcpu_get_dcr: called @%p\n",PSCB(vcpu,iip));
// Reads of cr.dcr on Xen always have the sign bit set, so
// a domain can differentiate whether it is running on SP or not
- *pval = PSCB(vcpu,dcr) | 0x8000000000000000L;
+ *pval = PSCBX(vcpu,dcr) | 0x8000000000000000L;
return (IA64_NO_FAULT);
}
IA64FAULT vcpu_get_iva(VCPU *vcpu, UINT64 *pval)
{
- *pval = PSCB(vcpu,iva) & ~0x7fffL;
+ *pval = PSCBX(vcpu,iva) & ~0x7fffL;
return (IA64_NO_FAULT);
}
@@ -423,13 +424,13 @@
// a domain can differentiate whether it is running on SP or not
// Thus, writes of DCR should ignore the sign bit
//verbose("vcpu_set_dcr: called\n");
- PSCB(vcpu,dcr) = val & ~0x8000000000000000L;
+ PSCBX(vcpu,dcr) = val & ~0x8000000000000000L;
return (IA64_NO_FAULT);
}
IA64FAULT vcpu_set_iva(VCPU *vcpu, UINT64 val)
{
- PSCB(vcpu,iva) = val & ~0x7fffL;
+ PSCBX(vcpu,iva) = val & ~0x7fffL;
return (IA64_NO_FAULT);
}
@@ -523,16 +524,16 @@
return;
}
if (!test_bit(vector,PSCB(vcpu,delivery_mask))) return;
- if (test_bit(vector,PSCB(vcpu,irr))) {
+ if (test_bit(vector,PSCBX(vcpu,irr))) {
//printf("vcpu_pend_interrupt: overrun\n");
}
- set_bit(vector,PSCB(vcpu,irr));
+ set_bit(vector,PSCBX(vcpu,irr));
PSCB(vcpu,pending_interruption) = 1;
}
void early_tick(VCPU *vcpu)
{
- UINT64 *p = &PSCB(vcpu,irr[3]);
+ UINT64 *p = &PSCBX(vcpu,irr[3]);
printf("vcpu_check_pending: about to deliver early tick\n");
printf("&irr[0]=%p, irr[0]=0x%lx\n",p,*p);
}
@@ -550,9 +551,9 @@
{
UINT64 *p, *q, *r, bits, bitnum, mask, i, vector;
- p = &PSCB(vcpu,irr[3]);
+ p = &PSCBX(vcpu,irr[3]);
q = &PSCB(vcpu,delivery_mask[3]);
- r = &PSCB(vcpu,insvc[3]);
+ r = &PSCBX(vcpu,insvc[3]);
for (i = 3; ; p--, q--, r--, i--) {
bits = *p & *q;
if (bits) break; // got a potential interrupt
@@ -592,9 +593,9 @@
#if 0
if (vector == (PSCB(vcpu,itv) & 0xff)) {
UINT64 now = ia64_get_itc();
- UINT64 itm = PSCB(vcpu,domain_itm);
+ UINT64 itm = PSCBX(vcpu,domain_itm);
if (now < itm) early_tick(vcpu);
-
+
}
#endif
return vector;
@@ -654,13 +655,13 @@
i = vector >> 6;
mask = 1L << (vector & 0x3f);
//printf("ZZZZZZ vcpu_get_ivr: setting insvc mask for vector %ld\n",vector);
- PSCB(vcpu,insvc[i]) |= mask;
- PSCB(vcpu,irr[i]) &= ~mask;
+ PSCBX(vcpu,insvc[i]) |= mask;
+ PSCBX(vcpu,irr[i]) &= ~mask;
//PSCB(vcpu,pending_interruption)--;
*pval = vector;
// if delivering a timer interrupt, remember domain_itm
if (vector == (PSCB(vcpu,itv) & 0xff)) {
- PSCB(vcpu,domain_itm_last) = PSCB(vcpu,domain_itm);
+ PSCBX(vcpu,domain_itm_last) = PSCBX(vcpu,domain_itm);
}
return IA64_NO_FAULT;
}
@@ -775,7 +776,7 @@
UINT64 *p, bits, vec, bitnum;
int i;
- p = &PSCB(vcpu,insvc[3]);
+ p = &PSCBX(vcpu,insvc[3]);
for (i = 3; (i >= 0) && !(bits = *p); i--, p--);
if (i < 0) {
printf("Trying to EOI interrupt when none are in-service.\r\n");
@@ -826,8 +827,8 @@
if (val & 0xef00) return (IA64_ILLOP_FAULT);
PSCB(vcpu,itv) = val;
if (val & 0x10000) {
-printf("**** vcpu_set_itv(%d): vitm=%lx, setting to
0\n",val,PSCB(vcpu,domain_itm));
- PSCB(vcpu,domain_itm) = 0;
+printf("**** vcpu_set_itv(%d): vitm=%lx, setting to
0\n",val,PSCBX(vcpu,domain_itm));
+ PSCBX(vcpu,domain_itm) = 0;
}
else vcpu_enable_timer(vcpu,1000000L);
return (IA64_NO_FAULT);
@@ -860,14 +861,14 @@
BOOLEAN vcpu_timer_inservice(VCPU *vcpu)
{
UINT64 itv = PSCB(vcpu,itv);
- return (test_bit(itv, PSCB(vcpu,insvc)));
+ return (test_bit(itv, PSCBX(vcpu,insvc)));
}
BOOLEAN vcpu_timer_expired(VCPU *vcpu)
{
- unsigned long domain_itm = PSCB(vcpu,domain_itm);
+ unsigned long domain_itm = PSCBX(vcpu,domain_itm);
unsigned long now = ia64_get_itc();
-
+
if (!domain_itm) return FALSE;
if (now < domain_itm) return FALSE;
if (vcpu_timer_disabled(vcpu)) return FALSE;
@@ -892,36 +893,36 @@
void vcpu_set_next_timer(VCPU *vcpu)
{
- UINT64 d = PSCB(vcpu,domain_itm);
- //UINT64 s = PSCB(vcpu,xen_itm);
+ UINT64 d = PSCBX(vcpu,domain_itm);
+ //UINT64 s = PSCBX(vcpu,xen_itm);
UINT64 s = local_cpu_data->itm_next;
UINT64 now = ia64_get_itc();
- //UINT64 interval = PSCB(vcpu,xen_timer_interval);
+ //UINT64 interval = PSCBX(vcpu,xen_timer_interval);
/* gloss over the wraparound problem for now... we know it exists
* but it doesn't matter right now */
#if 0
/* ensure at least next SP tick is in the future */
- if (!interval) PSCB(vcpu,xen_itm) = now +
+ if (!interval) PSCBX(vcpu,xen_itm) = now +
#if 0
(running_on_sim() ? SIM_DEFAULT_CLOCK_RATE :
- DEFAULT_CLOCK_RATE);
+ DEFAULT_CLOCK_RATE);
#else
3000000;
//printf("vcpu_set_next_timer: HACK!\n");
#endif
#if 0
- if (PSCB(vcpu,xen_itm) < now)
- while (PSCB(vcpu,xen_itm) < now + (interval>>1))
- PSCB(vcpu,xen_itm) += interval;
+ if (PSCBX(vcpu,xen_itm) < now)
+ while (PSCBX(vcpu,xen_itm) < now + (interval>>1))
+ PSCBX(vcpu,xen_itm) += interval;
#endif
#endif
if (is_idle_task(vcpu->domain)) {
printf("****** vcpu_set_next_timer called during idle!!\n");
}
- //s = PSCB(vcpu,xen_itm);
+ //s = PSCBX(vcpu,xen_itm);
if (d && (d > now) && (d < s)) {
vcpu_safe_set_itm(d);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|