f00ec48fad
UP systems do not implement all the instructions that SMP systems have, so in order to boot a SMP kernel on a UP system, we need to rewrite parts of the kernel. Do this using an 'alternatives' scheme, where the kernel code and data is modified prior to initialization to replace the SMP instructions, thereby rendering the problematical code ineffectual. We use the linker to generate a list of 32-bit word locations and their replacement values, and run through these replacements when we detect a UP system. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
17 lines
373 B
C
17 lines
373 B
C
#ifndef ASMARM_SMP_MIDR_H
|
|
#define ASMARM_SMP_MIDR_H
|
|
|
|
#define hard_smp_processor_id() \
|
|
({ \
|
|
unsigned int cpunum; \
|
|
__asm__("\n" \
|
|
"1: mrc p15, 0, %0, c0, c0, 5\n" \
|
|
" .pushsection \".alt.smp.init\", \"a\"\n"\
|
|
" .long 1b\n" \
|
|
" mov %0, #0\n" \
|
|
" .popsection" \
|
|
: "=r" (cpunum)); \
|
|
cpunum &= 0x0F; \
|
|
})
|
|
|
|
#endif
|