Unify mode16/32 compiler checks.
Add ASSERT16/ASSERT32 macros to farptr.h.
Use those macros in place of open-coded checks.
Add "noreturn" attribute to functions to reduce compiler warnings.
Add ASSERT32 to smp_probe() to eliminate 16bit assembler warnings.
diff --git a/src/biosvar.h b/src/biosvar.h
index c0b46cc..821aa35 100644
--- a/src/biosvar.h
+++ b/src/biosvar.h
@@ -248,9 +248,7 @@
static inline struct extended_bios_data_area_s *
get_ebda_ptr()
{
- extern void *__force_link_error__get_ebda_ptr_only_in_32bit();
- if (MODE16)
- return __force_link_error__get_ebda_ptr_only_in_32bit();
+ ASSERT32();
return MAKE_FLATPTR(get_ebda_seg(), 0);
}
#define GET_EBDA2(eseg, var) \
@@ -279,9 +277,7 @@
#define GET_GLOBAL(var) \
GET_VAR(GLOBAL_SEGREG, (var))
#define SET_GLOBAL(var, val) do { \
- extern void __force_link_error__set_global_only_in_32bit(); \
- if (MODE16) \
- __force_link_error__set_global_only_in_32bit(); \
+ ASSERT32(); \
(var) = (val); \
} while (0)
diff --git a/src/farptr.h b/src/farptr.h
index a26cf08..4fc727b 100644
--- a/src/farptr.h
+++ b/src/farptr.h
@@ -157,6 +157,10 @@
outsl(port, (u32*)FLATPTR_TO_OFFSET(ptr_fl), count);
}
+extern void __force_link_error__only_in_32bit() __attribute__ ((noreturn));
+#define ASSERT16() do { } while (0)
+#define ASSERT32() __force_link_error__only_in_32bit()
+
#else
// In 32-bit mode there is no need to mess with the segments.
@@ -178,6 +182,10 @@
#define outsw_fl(port, ptr_fl, count) outsw(port, ptr_fl, count)
#define outsl_fl(port, ptr_fl, count) outsl(port, ptr_fl, count)
+extern void __force_link_error__only_in_16bit() __attribute__ ((noreturn));
+#define ASSERT16() __force_link_error__only_in_16bit()
+#define ASSERT32() do { } while (0)
+
#endif
#endif // farptr.h
diff --git a/src/smpdetect.c b/src/smpdetect.c
index c54ec57..8d17e0e 100644
--- a/src/smpdetect.c
+++ b/src/smpdetect.c
@@ -64,6 +64,7 @@
int
smp_probe(void)
{
+ ASSERT32();
if (smp_cpus)
return smp_cpus;
diff --git a/src/types.h b/src/types.h
index aa9e12d..9f93e0b 100644
--- a/src/types.h
+++ b/src/types.h
@@ -50,6 +50,7 @@
# define VAR16FIXED(addr) __aligned(1) __VISIBLE __section(".fixedaddr." __stringify(addr))
// Designate top-level assembler as 16bit only.
# define ASM16(code) __ASM(code)
+// Designate top-level assembler as 32bit only.
# define ASM32(code)
#else
# define VISIBLE16
diff --git a/src/util.c b/src/util.c
index a44b35d..1faca26 100644
--- a/src/util.c
+++ b/src/util.c
@@ -30,10 +30,7 @@
inline void
call16big(struct bregs *callregs)
{
- extern void __force_link_error__call16big_only_in_32bit_mode();
- if (MODE16)
- __force_link_error__call16big_only_in_32bit_mode();
-
+ ASSERT32();
asm volatile(
"calll __call16big_from32"
: "+a" (callregs), "+m" (*callregs)
@@ -56,10 +53,7 @@
inline u32
stack_hop(u32 eax, u32 edx, u32 ecx, void *func)
{
- extern void __force_link_error__stack_hop_only_in_16bit_mode();
- if (!MODE16)
- __force_link_error__stack_hop_only_in_16bit_mode();
-
+ ASSERT16();
u16 ebda_seg = get_ebda_seg(), bkup_ss;
u32 bkup_esp;
asm volatile(
diff --git a/src/util.h b/src/util.h
index 23750cd..9790798 100644
--- a/src/util.h
+++ b/src/util.h
@@ -66,10 +66,7 @@
}
#define call16_simpint(nr, peax, pflags) do { \
- extern void __force_link_error__call16_simpint_only_in_16bit_mode(); \
- if (!MODE16) \
- __force_link_error__call16_simpint_only_in_16bit_mode(); \
- \
+ ASSERT16(); \
asm volatile( \
"stc\n" \
"int %2\n" \