diff options
| author | Steve French <sfrench@us.ibm.com> | 2007-11-25 04:53:27 -0500 |
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2007-11-25 04:53:27 -0500 |
| commit | 058250a0d5886b4d96a195ecc7e3a75e2df5e4b1 (patch) | |
| tree | fb67e8f5258c6aa11d4e8c39650e23de7556b38d /arch/mips/kernel | |
| parent | cea218054ad277d6c126890213afde07b4eb1602 (diff) | |
| parent | 2ffbb8377c7a0713baf6644e285adc27a5654582 (diff) | |
Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'arch/mips/kernel')
| -rw-r--r-- | arch/mips/kernel/cevt-bcm1480.c | 6 | ||||
| -rw-r--r-- | arch/mips/kernel/cevt-sb1250.c | 6 | ||||
| -rw-r--r-- | arch/mips/kernel/cpu-probe.c | 5 | ||||
| -rw-r--r-- | arch/mips/kernel/csrc-sb1250.c | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/genex.S | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/irixsig.c | 1 | ||||
| -rw-r--r-- | arch/mips/kernel/irq-rm7000.c | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/irq-rm9000.c | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/irq_cpu.c | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/proc.c | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-n32.S | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/traps.c | 68 | ||||
| -rw-r--r-- | arch/mips/kernel/vpe.c | 14 |
13 files changed, 37 insertions, 77 deletions
diff --git a/arch/mips/kernel/cevt-bcm1480.c b/arch/mips/kernel/cevt-bcm1480.c index 21e6d63eb4d1..0a57f86945f1 100644 --- a/arch/mips/kernel/cevt-bcm1480.c +++ b/arch/mips/kernel/cevt-bcm1480.c | |||
| @@ -75,6 +75,7 @@ static int sibyte_next_event(unsigned long delta, struct clock_event_device *cd) | |||
| 75 | cfg = IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG)); | 75 | cfg = IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG)); |
| 76 | init = IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT)); | 76 | init = IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT)); |
| 77 | 77 | ||
| 78 | __raw_writeq(0, cfg); | ||
| 78 | __raw_writeq(delta - 1, init); | 79 | __raw_writeq(delta - 1, init); |
| 79 | __raw_writeq(M_SCD_TIMER_ENABLE, cfg); | 80 | __raw_writeq(M_SCD_TIMER_ENABLE, cfg); |
| 80 | 81 | ||
| @@ -122,7 +123,7 @@ void __cpuinit sb1480_clockevent_init(void) | |||
| 122 | CLOCK_EVT_FEAT_ONESHOT; | 123 | CLOCK_EVT_FEAT_ONESHOT; |
| 123 | clockevent_set_clock(cd, V_SCD_TIMER_FREQ); | 124 | clockevent_set_clock(cd, V_SCD_TIMER_FREQ); |
| 124 | cd->max_delta_ns = clockevent_delta2ns(0x7fffff, cd); | 125 | cd->max_delta_ns = clockevent_delta2ns(0x7fffff, cd); |
| 125 | cd->min_delta_ns = clockevent_delta2ns(1, cd); | 126 | cd->min_delta_ns = clockevent_delta2ns(2, cd); |
| 126 | cd->rating = 200; | 127 | cd->rating = 200; |
| 127 | cd->irq = irq; | 128 | cd->irq = irq; |
| 128 | cd->cpumask = cpumask_of_cpu(cpu); | 129 | cd->cpumask = cpumask_of_cpu(cpu); |
| @@ -143,7 +144,10 @@ void __cpuinit sb1480_clockevent_init(void) | |||
| 143 | 144 | ||
| 144 | action->handler = sibyte_counter_handler; | 145 | action->handler = sibyte_counter_handler; |
| 145 | action->flags = IRQF_DISABLED | IRQF_PERCPU; | 146 | action->flags = IRQF_DISABLED | IRQF_PERCPU; |
| 147 | action->mask = cpumask_of_cpu(cpu); | ||
| 146 | action->name = name; | 148 | action->name = name; |
| 147 | action->dev_id = cd; | 149 | action->dev_id = cd; |
| 150 | |||
| 151 | irq_set_affinity(irq, cpumask_of_cpu(cpu)); | ||
| 148 | setup_irq(irq, action); | 152 | setup_irq(irq, action); |
| 149 | } | 153 | } |
diff --git a/arch/mips/kernel/cevt-sb1250.c b/arch/mips/kernel/cevt-sb1250.c index e2029d0fc39b..63ac3ad462bc 100644 --- a/arch/mips/kernel/cevt-sb1250.c +++ b/arch/mips/kernel/cevt-sb1250.c | |||
| @@ -73,6 +73,7 @@ static int sibyte_next_event(unsigned long delta, struct clock_event_device *cd) | |||
| 73 | cfg = IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG)); | 73 | cfg = IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG)); |
| 74 | init = IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT)); | 74 | init = IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT)); |
| 75 | 75 | ||
| 76 | __raw_writeq(0, cfg); | ||
| 76 | __raw_writeq(delta - 1, init); | 77 | __raw_writeq(delta - 1, init); |
| 77 | __raw_writeq(M_SCD_TIMER_ENABLE, cfg); | 78 | __raw_writeq(M_SCD_TIMER_ENABLE, cfg); |
| 78 | 79 | ||
| @@ -121,7 +122,7 @@ void __cpuinit sb1250_clockevent_init(void) | |||
| 121 | CLOCK_EVT_FEAT_ONESHOT; | 122 | CLOCK_EVT_FEAT_ONESHOT; |
| 122 | clockevent_set_clock(cd, V_SCD_TIMER_FREQ); | 123 | clockevent_set_clock(cd, V_SCD_TIMER_FREQ); |
| 123 | cd->max_delta_ns = clockevent_delta2ns(0x7fffff, cd); | 124 | cd->max_delta_ns = clockevent_delta2ns(0x7fffff, cd); |
| 124 | cd->min_delta_ns = clockevent_delta2ns(1, cd); | 125 | cd->min_delta_ns = clockevent_delta2ns(2, cd); |
| 125 | cd->rating = 200; | 126 | cd->rating = 200; |
| 126 | cd->irq = irq; | 127 | cd->irq = irq; |
| 127 | cd->cpumask = cpumask_of_cpu(cpu); | 128 | cd->cpumask = cpumask_of_cpu(cpu); |
| @@ -142,7 +143,10 @@ void __cpuinit sb1250_clockevent_init(void) | |||
| 142 | 143 | ||
| 143 | action->handler = sibyte_counter_handler; | 144 | action->handler = sibyte_counter_handler; |
| 144 | action->flags = IRQF_DISABLED | IRQF_PERCPU; | 145 | action->flags = IRQF_DISABLED | IRQF_PERCPU; |
| 146 | action->mask = cpumask_of_cpu(cpu); | ||
| 145 | action->name = name; | 147 | action->name = name; |
| 146 | action->dev_id = cd; | 148 | action->dev_id = cd; |
| 149 | |||
| 150 | irq_set_affinity(irq, cpumask_of_cpu(cpu)); | ||
| 147 | setup_irq(irq, action); | 151 | setup_irq(irq, action); |
| 148 | } | 152 | } |
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index c8c47a2d1972..5c2794391bf5 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
| @@ -943,6 +943,11 @@ __init void cpu_probe(void) | |||
| 943 | } | 943 | } |
| 944 | 944 | ||
| 945 | __cpu_name[cpu] = cpu_to_name(c); | 945 | __cpu_name[cpu] = cpu_to_name(c); |
| 946 | |||
| 947 | if (cpu_has_mips_r2) | ||
| 948 | c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1; | ||
| 949 | else | ||
| 950 | c->srsets = 1; | ||
| 946 | } | 951 | } |
| 947 | 952 | ||
| 948 | __init void cpu_report(void) | 953 | __init void cpu_report(void) |
diff --git a/arch/mips/kernel/csrc-sb1250.c b/arch/mips/kernel/csrc-sb1250.c index ebb16e668877..92212bbb8e45 100644 --- a/arch/mips/kernel/csrc-sb1250.c +++ b/arch/mips/kernel/csrc-sb1250.c | |||
| @@ -43,7 +43,7 @@ static cycle_t sb1250_hpt_read(void) | |||
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | struct clocksource bcm1250_clocksource = { | 45 | struct clocksource bcm1250_clocksource = { |
| 46 | .name = "MIPS", | 46 | .name = "bcm1250-counter-3", |
| 47 | .rating = 200, | 47 | .rating = 200, |
| 48 | .read = sb1250_hpt_read, | 48 | .read = sb1250_hpt_read, |
| 49 | .mask = CLOCKSOURCE_MASK(23), | 49 | .mask = CLOCKSOURCE_MASK(23), |
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index c0f19d638b98..e76a76bf0b3d 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S | |||
| @@ -146,7 +146,7 @@ NESTED(handle_int, PT_SIZE, sp) | |||
| 146 | and k0, ST0_IEP | 146 | and k0, ST0_IEP |
| 147 | bnez k0, 1f | 147 | bnez k0, 1f |
| 148 | 148 | ||
| 149 | mfc0 k0, EP0_EPC | 149 | mfc0 k0, CP0_EPC |
| 150 | .set noreorder | 150 | .set noreorder |
| 151 | j k0 | 151 | j k0 |
| 152 | rfe | 152 | rfe |
diff --git a/arch/mips/kernel/irixsig.c b/arch/mips/kernel/irixsig.c index 33506ff25910..5b10ac133ec8 100644 --- a/arch/mips/kernel/irixsig.c +++ b/arch/mips/kernel/irixsig.c | |||
| @@ -430,6 +430,7 @@ asmlinkage int irix_sigprocmask(int how, irix_sigset_t __user *new, | |||
| 430 | break; | 430 | break; |
| 431 | 431 | ||
| 432 | default: | 432 | default: |
| 433 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 433 | return -EINVAL; | 434 | return -EINVAL; |
| 434 | } | 435 | } |
| 435 | recalc_sigpending(); | 436 | recalc_sigpending(); |
diff --git a/arch/mips/kernel/irq-rm7000.c b/arch/mips/kernel/irq-rm7000.c index 250732883488..971adf6ef4f4 100644 --- a/arch/mips/kernel/irq-rm7000.c +++ b/arch/mips/kernel/irq-rm7000.c | |||
| @@ -44,5 +44,5 @@ void __init rm7k_cpu_irq_init(void) | |||
| 44 | 44 | ||
| 45 | for (i = base; i < base + 4; i++) | 45 | for (i = base; i < base + 4; i++) |
| 46 | set_irq_chip_and_handler(i, &rm7k_irq_controller, | 46 | set_irq_chip_and_handler(i, &rm7k_irq_controller, |
| 47 | handle_level_irq); | 47 | handle_percpu_irq); |
| 48 | } | 48 | } |
diff --git a/arch/mips/kernel/irq-rm9000.c b/arch/mips/kernel/irq-rm9000.c index ae83d2df6f31..7b04583bd800 100644 --- a/arch/mips/kernel/irq-rm9000.c +++ b/arch/mips/kernel/irq-rm9000.c | |||
| @@ -104,5 +104,5 @@ void __init rm9k_cpu_irq_init(void) | |||
| 104 | 104 | ||
| 105 | rm9000_perfcount_irq = base + 1; | 105 | rm9000_perfcount_irq = base + 1; |
| 106 | set_irq_chip_and_handler(rm9000_perfcount_irq, &rm9k_perfcounter_irq, | 106 | set_irq_chip_and_handler(rm9000_perfcount_irq, &rm9k_perfcounter_irq, |
| 107 | handle_level_irq); | 107 | handle_percpu_irq); |
| 108 | } | 108 | } |
diff --git a/arch/mips/kernel/irq_cpu.c b/arch/mips/kernel/irq_cpu.c index 7b66e03b5899..0ee2567b780d 100644 --- a/arch/mips/kernel/irq_cpu.c +++ b/arch/mips/kernel/irq_cpu.c | |||
| @@ -116,5 +116,5 @@ void __init mips_cpu_irq_init(void) | |||
| 116 | 116 | ||
| 117 | for (i = irq_base + 2; i < irq_base + 8; i++) | 117 | for (i = irq_base + 2; i < irq_base + 8; i++) |
| 118 | set_irq_chip_and_handler(i, &mips_cpu_irq_controller, | 118 | set_irq_chip_and_handler(i, &mips_cpu_irq_controller, |
| 119 | handle_level_irq); | 119 | handle_percpu_irq); |
| 120 | } | 120 | } |
diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c index efd2d1314123..6e6e947cce1e 100644 --- a/arch/mips/kernel/proc.c +++ b/arch/mips/kernel/proc.c | |||
| @@ -60,6 +60,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
| 60 | cpu_has_dsp ? " dsp" : "", | 60 | cpu_has_dsp ? " dsp" : "", |
| 61 | cpu_has_mipsmt ? " mt" : "" | 61 | cpu_has_mipsmt ? " mt" : "" |
| 62 | ); | 62 | ); |
| 63 | seq_printf(m, "shadow register sets\t: %d\n", | ||
| 64 | cpu_data[n].srsets); | ||
| 63 | 65 | ||
| 64 | sprintf(fmt, "VCE%%c exceptions\t\t: %s\n", | 66 | sprintf(fmt, "VCE%%c exceptions\t\t: %s\n", |
| 65 | cpu_has_vce ? "%u" : "not available"); | 67 | cpu_has_vce ? "%u" : "not available"); |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 118be24224f2..01993ec3368b 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
| @@ -293,7 +293,7 @@ EXPORT(sysn32_call_table) | |||
| 293 | PTR sys_ni_syscall /* 6170, was get_kernel_syms */ | 293 | PTR sys_ni_syscall /* 6170, was get_kernel_syms */ |
| 294 | PTR sys_ni_syscall /* was query_module */ | 294 | PTR sys_ni_syscall /* was query_module */ |
| 295 | PTR sys_quotactl | 295 | PTR sys_quotactl |
| 296 | PTR sys_nfsservctl | 296 | PTR compat_sys_nfsservctl |
| 297 | PTR sys_ni_syscall /* res. for getpmsg */ | 297 | PTR sys_ni_syscall /* res. for getpmsg */ |
| 298 | PTR sys_ni_syscall /* 6175 for putpmsg */ | 298 | PTR sys_ni_syscall /* 6175 for putpmsg */ |
| 299 | PTR sys_ni_syscall /* res. for afs_syscall */ | 299 | PTR sys_ni_syscall /* res. for afs_syscall */ |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index fa500787152d..23e73d0650a3 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -1100,59 +1100,6 @@ void *set_except_vector(int n, void *addr) | |||
| 1100 | return (void *)old_handler; | 1100 | return (void *)old_handler; |
| 1101 | } | 1101 | } |
| 1102 | 1102 | ||
| 1103 | #ifdef CONFIG_CPU_MIPSR2_SRS | ||
| 1104 | /* | ||
| 1105 | * MIPSR2 shadow register set allocation | ||
| 1106 | * FIXME: SMP... | ||
| 1107 | */ | ||
| 1108 | |||
| 1109 | static struct shadow_registers { | ||
| 1110 | /* | ||
| 1111 | * Number of shadow register sets supported | ||
| 1112 | */ | ||
| 1113 | unsigned long sr_supported; | ||
| 1114 | /* | ||
| 1115 | * Bitmap of allocated shadow registers | ||
| 1116 | */ | ||
| 1117 | unsigned long sr_allocated; | ||
| 1118 | } shadow_registers; | ||
| 1119 | |||
| 1120 | static void mips_srs_init(void) | ||
| 1121 | { | ||
| 1122 | shadow_registers.sr_supported = ((read_c0_srsctl() >> 26) & 0x0f) + 1; | ||
| 1123 | printk(KERN_INFO "%ld MIPSR2 register sets available\n", | ||
| 1124 | shadow_registers.sr_supported); | ||
| 1125 | shadow_registers.sr_allocated = 1; /* Set 0 used by kernel */ | ||
| 1126 | } | ||
| 1127 | |||
| 1128 | int mips_srs_max(void) | ||
| 1129 | { | ||
| 1130 | return shadow_registers.sr_supported; | ||
| 1131 | } | ||
| 1132 | |||
| 1133 | int mips_srs_alloc(void) | ||
| 1134 | { | ||
| 1135 | struct shadow_registers *sr = &shadow_registers; | ||
| 1136 | int set; | ||
| 1137 | |||
| 1138 | again: | ||
| 1139 | set = find_first_zero_bit(&sr->sr_allocated, sr->sr_supported); | ||
| 1140 | if (set >= sr->sr_supported) | ||
| 1141 | return -1; | ||
| 1142 | |||
| 1143 | if (test_and_set_bit(set, &sr->sr_allocated)) | ||
| 1144 | goto again; | ||
| 1145 | |||
| 1146 | return set; | ||
| 1147 | } | ||
| 1148 | |||
| 1149 | void mips_srs_free(int set) | ||
| 1150 | { | ||
| 1151 | struct shadow_registers *sr = &shadow_registers; | ||
| 1152 | |||
| 1153 | clear_bit(set, &sr->sr_allocated); | ||
| 1154 | } | ||
| 1155 | |||
| 1156 | static asmlinkage void do_default_vi(void) | 1103 | static asmlinkage void do_default_vi(void) |
| 1157 | { | 1104 | { |
| 1158 | show_regs(get_irq_regs()); | 1105 | show_regs(get_irq_regs()); |
| @@ -1163,6 +1110,7 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
| 1163 | { | 1110 | { |
| 1164 | unsigned long handler; | 1111 | unsigned long handler; |
| 1165 | unsigned long old_handler = vi_handlers[n]; | 1112 | unsigned long old_handler = vi_handlers[n]; |
| 1113 | int srssets = current_cpu_data.srsets; | ||
| 1166 | u32 *w; | 1114 | u32 *w; |
| 1167 | unsigned char *b; | 1115 | unsigned char *b; |
| 1168 | 1116 | ||
| @@ -1178,7 +1126,7 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
| 1178 | 1126 | ||
| 1179 | b = (unsigned char *)(ebase + 0x200 + n*VECTORSPACING); | 1127 | b = (unsigned char *)(ebase + 0x200 + n*VECTORSPACING); |
| 1180 | 1128 | ||
| 1181 | if (srs >= mips_srs_max()) | 1129 | if (srs >= srssets) |
| 1182 | panic("Shadow register set %d not supported", srs); | 1130 | panic("Shadow register set %d not supported", srs); |
| 1183 | 1131 | ||
| 1184 | if (cpu_has_veic) { | 1132 | if (cpu_has_veic) { |
| @@ -1186,7 +1134,7 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
| 1186 | board_bind_eic_interrupt(n, srs); | 1134 | board_bind_eic_interrupt(n, srs); |
| 1187 | } else if (cpu_has_vint) { | 1135 | } else if (cpu_has_vint) { |
| 1188 | /* SRSMap is only defined if shadow sets are implemented */ | 1136 | /* SRSMap is only defined if shadow sets are implemented */ |
| 1189 | if (mips_srs_max() > 1) | 1137 | if (srssets > 1) |
| 1190 | change_c0_srsmap(0xf << n*4, srs << n*4); | 1138 | change_c0_srsmap(0xf << n*4, srs << n*4); |
| 1191 | } | 1139 | } |
| 1192 | 1140 | ||
| @@ -1253,14 +1201,6 @@ void *set_vi_handler(int n, vi_handler_t addr) | |||
| 1253 | return set_vi_srs_handler(n, addr, 0); | 1201 | return set_vi_srs_handler(n, addr, 0); |
| 1254 | } | 1202 | } |
| 1255 | 1203 | ||
| 1256 | #else | ||
| 1257 | |||
| 1258 | static inline void mips_srs_init(void) | ||
| 1259 | { | ||
| 1260 | } | ||
| 1261 | |||
| 1262 | #endif /* CONFIG_CPU_MIPSR2_SRS */ | ||
| 1263 | |||
| 1264 | /* | 1204 | /* |
| 1265 | * This is used by native signal handling | 1205 | * This is used by native signal handling |
| 1266 | */ | 1206 | */ |
| @@ -1503,8 +1443,6 @@ void __init trap_init(void) | |||
| 1503 | else | 1443 | else |
| 1504 | ebase = CAC_BASE; | 1444 | ebase = CAC_BASE; |
| 1505 | 1445 | ||
| 1506 | mips_srs_init(); | ||
| 1507 | |||
| 1508 | per_cpu_trap_init(); | 1446 | per_cpu_trap_init(); |
| 1509 | 1447 | ||
| 1510 | /* | 1448 | /* |
diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c index 436a64ff3989..38bd33fa2a23 100644 --- a/arch/mips/kernel/vpe.c +++ b/arch/mips/kernel/vpe.c | |||
| @@ -1003,6 +1003,7 @@ static void cleanup_tc(struct tc *tc) | |||
| 1003 | write_tc_c0_tcstatus(tmp); | 1003 | write_tc_c0_tcstatus(tmp); |
| 1004 | 1004 | ||
| 1005 | write_tc_c0_tchalt(TCHALT_H); | 1005 | write_tc_c0_tchalt(TCHALT_H); |
| 1006 | mips_ihb(); | ||
| 1006 | 1007 | ||
| 1007 | /* bind it to anything other than VPE1 */ | 1008 | /* bind it to anything other than VPE1 */ |
| 1008 | // write_tc_c0_tcbind(read_tc_c0_tcbind() & ~TCBIND_CURVPE); // | TCBIND_CURVPE | 1009 | // write_tc_c0_tcbind(read_tc_c0_tcbind() & ~TCBIND_CURVPE); // | TCBIND_CURVPE |
| @@ -1235,9 +1236,12 @@ int vpe_free(vpe_handle vpe) | |||
| 1235 | settc(t->index); | 1236 | settc(t->index); |
| 1236 | write_vpe_c0_vpeconf0(read_vpe_c0_vpeconf0() & ~VPECONF0_VPA); | 1237 | write_vpe_c0_vpeconf0(read_vpe_c0_vpeconf0() & ~VPECONF0_VPA); |
| 1237 | 1238 | ||
| 1238 | /* mark the TC unallocated and halt'ed */ | 1239 | /* halt the TC */ |
| 1239 | write_tc_c0_tcstatus(read_tc_c0_tcstatus() & ~TCSTATUS_A); | ||
| 1240 | write_tc_c0_tchalt(TCHALT_H); | 1240 | write_tc_c0_tchalt(TCHALT_H); |
| 1241 | mips_ihb(); | ||
| 1242 | |||
| 1243 | /* mark the TC unallocated */ | ||
| 1244 | write_tc_c0_tcstatus(read_tc_c0_tcstatus() & ~TCSTATUS_A); | ||
| 1241 | 1245 | ||
| 1242 | v->state = VPE_STATE_UNUSED; | 1246 | v->state = VPE_STATE_UNUSED; |
| 1243 | 1247 | ||
| @@ -1533,14 +1537,16 @@ static int __init vpe_module_init(void) | |||
| 1533 | t->pvpe = get_vpe(0); /* set the parent vpe */ | 1537 | t->pvpe = get_vpe(0); /* set the parent vpe */ |
| 1534 | } | 1538 | } |
| 1535 | 1539 | ||
| 1540 | /* halt the TC */ | ||
| 1541 | write_tc_c0_tchalt(TCHALT_H); | ||
| 1542 | mips_ihb(); | ||
| 1543 | |||
| 1536 | tmp = read_tc_c0_tcstatus(); | 1544 | tmp = read_tc_c0_tcstatus(); |
| 1537 | 1545 | ||
| 1538 | /* mark not activated and not dynamically allocatable */ | 1546 | /* mark not activated and not dynamically allocatable */ |
| 1539 | tmp &= ~(TCSTATUS_A | TCSTATUS_DA); | 1547 | tmp &= ~(TCSTATUS_A | TCSTATUS_DA); |
| 1540 | tmp |= TCSTATUS_IXMT; /* interrupt exempt */ | 1548 | tmp |= TCSTATUS_IXMT; /* interrupt exempt */ |
| 1541 | write_tc_c0_tcstatus(tmp); | 1549 | write_tc_c0_tcstatus(tmp); |
| 1542 | |||
| 1543 | write_tc_c0_tchalt(TCHALT_H); | ||
| 1544 | } | 1550 | } |
| 1545 | } | 1551 | } |
| 1546 | 1552 | ||
