sparc32: Implement hard_smp_processor_id() via instruction patching.
This is the last non-trivial user of btfixup. Like sparc64, use a special patch section to resolve the various implementations of how to read the current CPU's ID when we don't have current_thread_info()->cpu necessarily available. Signed-off-by: David S. Miller <davem@davemloft.net> Tested-by: Sam Ravnborg <sam@ravnborg.org>
This commit is contained in:
parent
5d83d66635
commit
c68e5d39a5
10 changed files with 99 additions and 175 deletions
|
|
@ -59,12 +59,9 @@ void smp_bogo(struct seq_file *);
|
|||
void smp_info(struct seq_file *);
|
||||
|
||||
BTFIXUPDEF_CALL(void, smp_cross_call, smpfunc_t, cpumask_t, unsigned long, unsigned long, unsigned long, unsigned long)
|
||||
BTFIXUPDEF_CALL(int, __hard_smp_processor_id, void)
|
||||
BTFIXUPDEF_CALL(void, smp_ipi_resched, int);
|
||||
BTFIXUPDEF_CALL(void, smp_ipi_single, int);
|
||||
BTFIXUPDEF_CALL(void, smp_ipi_mask_one, int);
|
||||
BTFIXUPDEF_BLACKBOX(hard_smp_processor_id)
|
||||
BTFIXUPDEF_BLACKBOX(load_current)
|
||||
|
||||
#define smp_cross_call(func,mask,arg1,arg2,arg3,arg4) BTFIXUP_CALL(smp_cross_call)(func,mask,arg1,arg2,arg3,arg4)
|
||||
|
||||
|
|
@ -117,45 +114,7 @@ extern inline int hard_smpleon_processor_id(void)
|
|||
return cpuid;
|
||||
}
|
||||
|
||||
#ifndef MODULE
|
||||
static inline int hard_smp_processor_id(void)
|
||||
{
|
||||
int cpuid;
|
||||
|
||||
/* Black box - sun4m
|
||||
__asm__ __volatile__("rd %%tbr, %0\n\t"
|
||||
"srl %0, 12, %0\n\t"
|
||||
"and %0, 3, %0\n\t" :
|
||||
"=&r" (cpuid));
|
||||
- sun4d
|
||||
__asm__ __volatile__("lda [%g0] ASI_M_VIKING_TMP1, %0\n\t"
|
||||
"nop; nop" :
|
||||
"=&r" (cpuid));
|
||||
- leon
|
||||
__asm__ __volatile__( "rd %asr17, %0\n\t"
|
||||
"srl %0, 0x1c, %0\n\t"
|
||||
"nop\n\t" :
|
||||
"=&r" (cpuid));
|
||||
See btfixup.h and btfixupprep.c to understand how a blackbox works.
|
||||
*/
|
||||
__asm__ __volatile__("sethi %%hi(___b_hard_smp_processor_id), %0\n\t"
|
||||
"sethi %%hi(boot_cpu_id), %0\n\t"
|
||||
"ldub [%0 + %%lo(boot_cpu_id)], %0\n\t" :
|
||||
"=&r" (cpuid));
|
||||
return cpuid;
|
||||
}
|
||||
#else
|
||||
static inline int hard_smp_processor_id(void)
|
||||
{
|
||||
int cpuid;
|
||||
|
||||
__asm__ __volatile__("mov %%o7, %%g1\n\t"
|
||||
"call ___f___hard_smp_processor_id\n\t"
|
||||
" nop\n\t"
|
||||
"mov %%g2, %0\n\t" : "=r"(cpuid) : : "g1", "g2");
|
||||
return cpuid;
|
||||
}
|
||||
#endif
|
||||
extern int hard_smp_processor_id(void);
|
||||
|
||||
#define raw_smp_processor_id() (current_thread_info()->cpu)
|
||||
|
||||
|
|
|
|||
|
|
@ -103,37 +103,24 @@
|
|||
st %scratch, [%cur_reg + TI_W_SAVED];
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/* Results of LOAD_CURRENT() after BTFIXUP for SUN4M, SUN4D & LEON (comments) */
|
||||
#define LOAD_CURRENT4M(dest_reg, idreg) \
|
||||
rd %tbr, %idreg; \
|
||||
sethi %hi(current_set), %dest_reg; \
|
||||
srl %idreg, 10, %idreg; \
|
||||
or %dest_reg, %lo(current_set), %dest_reg; \
|
||||
and %idreg, 0xc, %idreg; \
|
||||
ld [%idreg + %dest_reg], %dest_reg;
|
||||
|
||||
#define LOAD_CURRENT4D(dest_reg, idreg) \
|
||||
lda [%g0] ASI_M_VIKING_TMP1, %idreg; \
|
||||
sethi %hi(C_LABEL(current_set)), %dest_reg; \
|
||||
sll %idreg, 2, %idreg; \
|
||||
or %dest_reg, %lo(C_LABEL(current_set)), %dest_reg; \
|
||||
ld [%idreg + %dest_reg], %dest_reg;
|
||||
|
||||
#define LOAD_CURRENT_LEON(dest_reg, idreg) \
|
||||
rd %asr17, %idreg; \
|
||||
sethi %hi(current_set), %dest_reg; \
|
||||
srl %idreg, 0x1c, %idreg; \
|
||||
or %dest_reg, %lo(current_set), %dest_reg; \
|
||||
sll %idreg, 0x2, %idreg; \
|
||||
ld [%idreg + %dest_reg], %dest_reg;
|
||||
|
||||
/* Blackbox - take care with this... - check smp4m and smp4d before changing this. */
|
||||
#define LOAD_CURRENT(dest_reg, idreg) \
|
||||
sethi %hi(___b_load_current), %idreg; \
|
||||
sethi %hi(current_set), %dest_reg; \
|
||||
sethi %hi(boot_cpu_id4), %idreg; \
|
||||
or %dest_reg, %lo(current_set), %dest_reg; \
|
||||
ldub [%idreg + %lo(boot_cpu_id4)], %idreg; \
|
||||
#define LOAD_CURRENT(dest_reg, idreg) \
|
||||
661: rd %tbr, %idreg; \
|
||||
srl %idreg, 10, %idreg; \
|
||||
and %idreg, 0xc, %idreg; \
|
||||
.section .cpuid_patch, "ax"; \
|
||||
/* Instruction location. */ \
|
||||
.word 661b; \
|
||||
/* SUN4D implementation. */ \
|
||||
lda [%g0] ASI_M_VIKING_TMP1, %idreg; \
|
||||
sll %idreg, 2, %idreg; \
|
||||
nop; \
|
||||
/* LEON implementation. */ \
|
||||
rd %asr17, %idreg; \
|
||||
srl %idreg, 0x1c, %idreg; \
|
||||
sll %idreg, 0x02, %idreg; \
|
||||
.previous; \
|
||||
sethi %hi(current_set), %dest_reg; \
|
||||
or %dest_reg, %lo(current_set), %dest_reg;\
|
||||
ld [%idreg + %dest_reg], %dest_reg;
|
||||
#else
|
||||
#define LOAD_CURRENT(dest_reg, idreg) \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue