diff options
Diffstat (limited to 'arch/mips/kernel/head.S')
-rw-r--r-- | arch/mips/kernel/head.S | 56 |
1 files changed, 0 insertions, 56 deletions
diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S index e712dcf18b2d..95afd663cd45 100644 --- a/arch/mips/kernel/head.S +++ b/arch/mips/kernel/head.S | |||
@@ -35,33 +35,12 @@ | |||
35 | */ | 35 | */ |
36 | .macro setup_c0_status set clr | 36 | .macro setup_c0_status set clr |
37 | .set push | 37 | .set push |
38 | #ifdef CONFIG_MIPS_MT_SMTC | ||
39 | /* | ||
40 | * For SMTC, we need to set privilege and disable interrupts only for | ||
41 | * the current TC, using the TCStatus register. | ||
42 | */ | ||
43 | mfc0 t0, CP0_TCSTATUS | ||
44 | /* Fortunately CU 0 is in the same place in both registers */ | ||
45 | /* Set TCU0, TMX, TKSU (for later inversion) and IXMT */ | ||
46 | li t1, ST0_CU0 | 0x08001c00 | ||
47 | or t0, t1 | ||
48 | /* Clear TKSU, leave IXMT */ | ||
49 | xori t0, 0x00001800 | ||
50 | mtc0 t0, CP0_TCSTATUS | ||
51 | _ehb | ||
52 | /* We need to leave the global IE bit set, but clear EXL...*/ | ||
53 | mfc0 t0, CP0_STATUS | ||
54 | or t0, ST0_CU0 | ST0_EXL | ST0_ERL | \set | \clr | ||
55 | xor t0, ST0_EXL | ST0_ERL | \clr | ||
56 | mtc0 t0, CP0_STATUS | ||
57 | #else | ||
58 | mfc0 t0, CP0_STATUS | 38 | mfc0 t0, CP0_STATUS |
59 | or t0, ST0_CU0|\set|0x1f|\clr | 39 | or t0, ST0_CU0|\set|0x1f|\clr |
60 | xor t0, 0x1f|\clr | 40 | xor t0, 0x1f|\clr |
61 | mtc0 t0, CP0_STATUS | 41 | mtc0 t0, CP0_STATUS |
62 | .set noreorder | 42 | .set noreorder |
63 | sll zero,3 # ehb | 43 | sll zero,3 # ehb |
64 | #endif | ||
65 | .set pop | 44 | .set pop |
66 | .endm | 45 | .endm |
67 | 46 | ||
@@ -115,24 +94,6 @@ NESTED(kernel_entry, 16, sp) # kernel entry point | |||
115 | jr t0 | 94 | jr t0 |
116 | 0: | 95 | 0: |
117 | 96 | ||
118 | #ifdef CONFIG_MIPS_MT_SMTC | ||
119 | /* | ||
120 | * In SMTC kernel, "CLI" is thread-specific, in TCStatus. | ||
121 | * We still need to enable interrupts globally in Status, | ||
122 | * and clear EXL/ERL. | ||
123 | * | ||
124 | * TCContext is used to track interrupt levels under | ||
125 | * service in SMTC kernel. Clear for boot TC before | ||
126 | * allowing any interrupts. | ||
127 | */ | ||
128 | mtc0 zero, CP0_TCCONTEXT | ||
129 | |||
130 | mfc0 t0, CP0_STATUS | ||
131 | ori t0, t0, 0xff1f | ||
132 | xori t0, t0, 0x001e | ||
133 | mtc0 t0, CP0_STATUS | ||
134 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
135 | |||
136 | PTR_LA t0, __bss_start # clear .bss | 97 | PTR_LA t0, __bss_start # clear .bss |
137 | LONG_S zero, (t0) | 98 | LONG_S zero, (t0) |
138 | PTR_LA t1, __bss_stop - LONGSIZE | 99 | PTR_LA t1, __bss_stop - LONGSIZE |
@@ -164,25 +125,8 @@ NESTED(kernel_entry, 16, sp) # kernel entry point | |||
164 | * function after setting up the stack and gp registers. | 125 | * function after setting up the stack and gp registers. |
165 | */ | 126 | */ |
166 | NESTED(smp_bootstrap, 16, sp) | 127 | NESTED(smp_bootstrap, 16, sp) |
167 | #ifdef CONFIG_MIPS_MT_SMTC | ||
168 | /* | ||
169 | * Read-modify-writes of Status must be atomic, and this | ||
170 | * is one case where CLI is invoked without EXL being | ||
171 | * necessarily set. The CLI and setup_c0_status will | ||
172 | * in fact be redundant for all but the first TC of | ||
173 | * each VPE being booted. | ||
174 | */ | ||
175 | DMT 10 # dmt t2 /* t0, t1 are used by CLI and setup_c0_status() */ | ||
176 | jal mips_ihb | ||
177 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
178 | smp_slave_setup | 128 | smp_slave_setup |
179 | setup_c0_status_sec | 129 | setup_c0_status_sec |
180 | #ifdef CONFIG_MIPS_MT_SMTC | ||
181 | andi t2, t2, VPECONTROL_TE | ||
182 | beqz t2, 2f | ||
183 | EMT # emt | ||
184 | 2: | ||
185 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
186 | j start_secondary | 130 | j start_secondary |
187 | END(smp_bootstrap) | 131 | END(smp_bootstrap) |
188 | #endif /* CONFIG_SMP */ | 132 | #endif /* CONFIG_SMP */ |