Commit f94d9a8e authored by Ralf Baechle's avatar Ralf Baechle

MIPS: Idle: Do address fiddlery in helper functions.

Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent bdc92d74
...@@ -8,4 +8,15 @@ extern asmlinkage void r4k_wait(void); ...@@ -8,4 +8,15 @@ extern asmlinkage void r4k_wait(void);
extern void r4k_wait_irqoff(void); extern void r4k_wait_irqoff(void);
extern void __pastwait(void); extern void __pastwait(void);
static inline int using_rollback_handler(void)
{
return cpu_wait == r4k_wait;
}
static inline int address_is_in_r4k_wait_irqoff(unsigned long addr)
{
return addr >= (unsigned long)r4k_wait_irqoff &&
addr < (unsigned long)__pastwait;
}
#endif /* __ASM_IDLE_H */ #endif /* __ASM_IDLE_H */
...@@ -914,8 +914,7 @@ void smtc_send_ipi(int cpu, int type, unsigned int action) ...@@ -914,8 +914,7 @@ void smtc_send_ipi(int cpu, int type, unsigned int action)
*/ */
if (cpu_wait == r4k_wait_irqoff) { if (cpu_wait == r4k_wait_irqoff) {
tcrestart = read_tc_c0_tcrestart(); tcrestart = read_tc_c0_tcrestart();
if (tcrestart >= (unsigned long)r4k_wait_irqoff if (address_is_in_r4k_wait_irqoff(tcrestart)) {
&& tcrestart < (unsigned long)__pastwait) {
write_tc_c0_tcrestart(__pastwait); write_tc_c0_tcrestart(__pastwait);
tcstatus &= ~TCSTATUS_IXMT; tcstatus &= ~TCSTATUS_IXMT;
write_tc_c0_tcstatus(tcstatus); write_tc_c0_tcstatus(tcstatus);
......
...@@ -1542,7 +1542,7 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) ...@@ -1542,7 +1542,7 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs)
extern char except_vec_vi, except_vec_vi_lui; extern char except_vec_vi, except_vec_vi_lui;
extern char except_vec_vi_ori, except_vec_vi_end; extern char except_vec_vi_ori, except_vec_vi_end;
extern char rollback_except_vec_vi; extern char rollback_except_vec_vi;
char *vec_start = (cpu_wait == r4k_wait) ? char *vec_start = using_rollback_handler() ?
&rollback_except_vec_vi : &except_vec_vi; &rollback_except_vec_vi : &except_vec_vi;
#ifdef CONFIG_MIPS_MT_SMTC #ifdef CONFIG_MIPS_MT_SMTC
/* /*
...@@ -1812,10 +1812,8 @@ void __init trap_init(void) ...@@ -1812,10 +1812,8 @@ void __init trap_init(void)
extern char except_vec4; extern char except_vec4;
extern char except_vec3_r4000; extern char except_vec3_r4000;
unsigned long i; unsigned long i;
int rollback;
check_wait(); check_wait();
rollback = (cpu_wait == r4k_wait);
#if defined(CONFIG_KGDB) #if defined(CONFIG_KGDB)
if (kgdb_early_setup) if (kgdb_early_setup)
...@@ -1892,7 +1890,8 @@ void __init trap_init(void) ...@@ -1892,7 +1890,8 @@ void __init trap_init(void)
if (board_be_init) if (board_be_init)
board_be_init(); board_be_init();
set_except_vector(0, rollback ? rollback_handle_int : handle_int); set_except_vector(0, using_rollback_handler() ? rollback_handle_int
: handle_int);
set_except_vector(1, handle_tlbm); set_except_vector(1, handle_tlbm);
set_except_vector(2, handle_tlbl); set_except_vector(2, handle_tlbl);
set_except_vector(3, handle_tlbs); set_except_vector(3, handle_tlbs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment