diff options
author | H. Peter Anvin <hpa@linux.intel.com> | 2012-05-08 14:22:37 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2012-05-08 14:48:03 -0400 |
commit | e5684ec438a094bec0f7d5c52652c0901b48b613 (patch) | |
tree | 8cc3cf787a582977ff08ed578907d6df7dbc7e6e /arch/x86/realmode/rm/realmode.h | |
parent | 968ff9ee56f1e3ed4ff4a6d10185865dc77d8f7e (diff) |
x86, realmode: Replace open-coded ljmpw with a macro
We cannot code an ljmpw to the real-mode segment directly, because gas
refuses to assemble an ljmp with a symbolic segment. Instead of
open-coding it everywhere, define a macro and use it for this case.
This is specifically an ljmpw from a 16-bit segment. This is okay, as
one should never enter real mode from a 32-bit segment: if one do, the
CPU ends up in a bizarre (and useless) mode sometimes called "unreal
mode" where segments behave like real mode but the default address and
operand sizes is 32 bits.
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Link: http://lkml.kernel.org/r/1336501366-28617-15-git-send-email-jarkko.sakkinen@intel.com
Diffstat (limited to 'arch/x86/realmode/rm/realmode.h')
-rw-r--r-- | arch/x86/realmode/rm/realmode.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/x86/realmode/rm/realmode.h b/arch/x86/realmode/rm/realmode.h new file mode 100644 index 000000000000..15ab6335f843 --- /dev/null +++ b/arch/x86/realmode/rm/realmode.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef ARCH_X86_REALMODE_RM_REALMODE_H | ||
2 | #define ARCH_X86_REALMODE_RM_REALMODE_H | ||
3 | |||
4 | #ifdef __ASSEMBLY__ | ||
5 | |||
6 | /* | ||
7 | * 16-bit ljmpw to the real_mode_seg | ||
8 | * | ||
9 | * This must be open-coded since gas will choke on using a | ||
10 | * relocatable symbol for the segment portion. | ||
11 | */ | ||
12 | #define LJMPW_RM(to) .byte 0xea ; .word (to), real_mode_seg | ||
13 | |||
14 | #endif /* __ASSEMBLY__ */ | ||
15 | |||
16 | #endif /* ARCH_X86_REALMODE_RM_REALMODE_H */ | ||