|
@@ -272,9 +272,9 @@ static void hardwall_setup_func(void *info)
|
|
|
struct hardwall_info *r = info;
|
|
|
struct hardwall_type *hwt = r->type;
|
|
|
|
|
|
- int cpu = smp_processor_id();
|
|
|
- int x = cpu % smp_width;
|
|
|
- int y = cpu / smp_width;
|
|
|
+ int cpu = smp_processor_id(); /* on_each_cpu disables preemption */
|
|
|
+ int x = cpu_x(cpu);
|
|
|
+ int y = cpu_y(cpu);
|
|
|
int bits = 0;
|
|
|
if (x == r->ulhc_x)
|
|
|
bits |= W_PROTECT;
|
|
@@ -317,6 +317,7 @@ static void hardwall_protect_rectangle(struct hardwall_info *r)
|
|
|
on_each_cpu_mask(&rect_cpus, hardwall_setup_func, r, 1);
|
|
|
}
|
|
|
|
|
|
+/* Entered from INT_xDN_FIREWALL interrupt vector with irqs disabled. */
|
|
|
void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
|
|
|
{
|
|
|
struct hardwall_info *rect;
|
|
@@ -325,7 +326,6 @@ void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
|
|
|
struct siginfo info;
|
|
|
int cpu = smp_processor_id();
|
|
|
int found_processes;
|
|
|
- unsigned long flags;
|
|
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
|
|
|
|
|
irq_enter();
|
|
@@ -346,7 +346,7 @@ void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
|
|
|
BUG_ON(hwt->disabled);
|
|
|
|
|
|
/* This tile trapped a network access; find the rectangle. */
|
|
|
- spin_lock_irqsave(&hwt->lock, flags);
|
|
|
+ spin_lock(&hwt->lock);
|
|
|
list_for_each_entry(rect, &hwt->list, list) {
|
|
|
if (cpumask_test_cpu(cpu, &rect->cpumask))
|
|
|
break;
|
|
@@ -401,7 +401,7 @@ void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
|
|
|
pr_notice("hardwall: no associated processes!\n");
|
|
|
|
|
|
done:
|
|
|
- spin_unlock_irqrestore(&hwt->lock, flags);
|
|
|
+ spin_unlock(&hwt->lock);
|
|
|
|
|
|
/*
|
|
|
* We have to disable firewall interrupts now, or else when we
|
|
@@ -661,7 +661,7 @@ static int hardwall_deactivate(struct hardwall_type *hwt,
|
|
|
return -EINVAL;
|
|
|
|
|
|
printk(KERN_DEBUG "Pid %d (%s) deactivated for %s hardwall: cpu %d\n",
|
|
|
- task->pid, task->comm, hwt->name, smp_processor_id());
|
|
|
+ task->pid, task->comm, hwt->name, raw_smp_processor_id());
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -803,8 +803,8 @@ static void reset_xdn_network_state(struct hardwall_type *hwt)
|
|
|
/* Reset UDN coordinates to their standard value */
|
|
|
{
|
|
|
unsigned int cpu = smp_processor_id();
|
|
|
- unsigned int x = cpu % smp_width;
|
|
|
- unsigned int y = cpu / smp_width;
|
|
|
+ unsigned int x = cpu_x(cpu);
|
|
|
+ unsigned int y = cpu_y(cpu);
|
|
|
__insn_mtspr(SPR_UDN_TILE_COORD, (x << 18) | (y << 7));
|
|
|
}
|
|
|
|