cpu/x86/smm: Fix explicit 'addr32' usage in clang builds
The addr32 prefix is required by binutils, because even when given an explicit address which is greater than 64KiB, it will throw a warning about truncation, and stupidly emit the opcode with a 16-bit addressing mode and the wrong address. However, in the case of LLVM, this doesn't happen, and is happy to just use 32-bit addressing whenever it may require it. This means that LLVM never really needs an explicit addr32 prefix to use 32-bit addressing in 16-bit mode. Change-Id: Ia160d3f7da6653ea24c8229dc26f265e5f15aabb Also-by: Damien Zammit <damien@zamaudio.com> Signed-off-by: Damien Zammit <damien@zamaudio.com> Reviewed-on: https://review.coreboot.org/21219 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
This commit is contained in:
parent
2ad1ddb390
commit
1104c278e3
|
@ -36,6 +36,9 @@
|
|||
#error "Southbridge needs SMM handler support."
|
||||
#endif
|
||||
|
||||
// ADDR32() macro
|
||||
#include <compiler.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_SMM_TSEG)
|
||||
#error "Don't use this file with TSEG."
|
||||
|
||||
|
@ -112,7 +115,7 @@ smm_relocation_start:
|
|||
*/
|
||||
|
||||
mov $0x38000 + 0x7efc, %ebx
|
||||
addr32 mov (%ebx), %al
|
||||
ADDR32(mov) (%ebx), %al
|
||||
cmp $0x64, %al
|
||||
je 1f
|
||||
|
||||
|
@ -124,7 +127,7 @@ smm_relocation_start:
|
|||
smm_relocate:
|
||||
/* Get this CPU's LAPIC ID */
|
||||
movl $LAPIC_ID, %esi
|
||||
addr32 movl (%esi), %ecx
|
||||
ADDR32(movl) (%esi), %ecx
|
||||
shr $24, %ecx
|
||||
|
||||
/* calculate offset by multiplying the
|
||||
|
@ -136,7 +139,7 @@ smm_relocate:
|
|||
movl $0xa0000, %eax
|
||||
subl %edx, %eax /* subtract offset, see above */
|
||||
|
||||
addr32 movl %eax, (%ebx)
|
||||
ADDR32(movl) %eax, (%ebx)
|
||||
|
||||
/* The next section of code is potentially southbridge specific */
|
||||
|
||||
|
|
|
@ -26,4 +26,10 @@
|
|||
#define __always_unused __attribute__((unused))
|
||||
#define __must_check __attribute__((warn_unused_result))
|
||||
|
||||
#if IS_ENABLED(CONFIG_COMPILER_LLVM_CLANG)
|
||||
#define ADDR32(opcode) opcode
|
||||
#else
|
||||
#define ADDR32(opcode) addr32 opcode
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue