Unify mode16/32 compiler checks.
authorKevin O'Connor <kevin@koconnor.net>
Tue, 16 Jun 2009 03:03:05 +0000 (23:03 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Tue, 16 Jun 2009 03:03:05 +0000 (23:03 -0400)
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.

src/biosvar.h
src/farptr.h
src/smpdetect.c
src/types.h
src/util.c
src/util.h

index c0b46cc8a3dd98c9a81df8de3f98fe208a84b073..821aa3572992304b406fd504c27ff4b3dd4ed4c3 100644 (file)
@@ -248,9 +248,7 @@ static inline u16 get_ebda_seg() {
 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 @@ static inline u16 get_global_seg() {
 #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)
 
index a26cf08724e7c751d56ef62424567b39f5803268..4fc727bfeae0642c07d2f184439bb8007b414cc5 100644 (file)
@@ -157,6 +157,10 @@ static inline void outsl_fl(u16 port, void *ptr_fl, u16 count) {
     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 @@ static inline void outsl_fl(u16 port, void *ptr_fl, u16 count) {
 #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
index c54ec578dc84dd6b04d426989ed5f189fcea2cc4..8d17e0eea79066302b73d56354838b74c1a9b0a1 100644 (file)
@@ -64,6 +64,7 @@ ASM16(
 int
 smp_probe(void)
 {
+    ASSERT32();
     if (smp_cpus)
         return smp_cpus;
 
index aa9e12d07c7e07bba46f083889e6cb714595f71c..9f93e0b22186b512af4dda954e4d65bdfb63bf4a 100644 (file)
@@ -50,6 +50,7 @@ union u64_u32_u {
 # 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
index a44b35d4939f3ef8a47d981f33cd3f8fe9a4ff5b..1faca26053c5019a30dccafec130db6799db8938 100644 (file)
@@ -30,10 +30,7 @@ call16(struct bregs *callregs)
 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 @@ __call16_int(struct bregs *callregs, u16 offset)
 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(
index 23750cd4cc7453496d13fec0c54f74b271a23283..9790798f2ad83641e78445a2823cdfc6530c8bc8 100644 (file)
@@ -66,10 +66,7 @@ static inline u64 rdtscll(void)
 }
 
 #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"                                                  \