Split out REAL_CODE() from REAL_EXEC(), preparatory to removing REAL_EXEC
authorMichael Brown <mcb30@etherboot.org>
Wed, 24 May 2006 09:51:04 +0000 (09:51 +0000)
committerMichael Brown <mcb30@etherboot.org>
Wed, 24 May 2006 09:51:04 +0000 (09:51 +0000)
completely.

src/arch/i386/include/libkir.h
src/arch/i386/include/librm.h

index d708297..0b2178e 100644 (file)
@@ -213,31 +213,32 @@ virt_to_user ( void * virtual ) {
 #define BASEMEM_PARAMETER_INIT BASEMEM_PARAMETER_INIT_LIBKIR
 #define BASEMEM_PARAMETER_DONE BASEMEM_PARAMETER_DONE_LIBKIR
 
+/* REAL_CODE: declare a fragment of code that executes in real mode */
+#define REAL_CODE( asm_code_str )      \
+       ".code16\n\t"                   \
+       "pushw %%gs\n\t"                \
+       "pushw %%fs\n\t"                \
+       "pushw %%es\n\t"                \
+       "pushw %%ds\n\t"                \
+       asm_code_str                    \
+       "popw %%ds\n\t"                 \
+       "popw %%es\n\t"                 \
+       "popw %%fs\n\t"                 \
+       "popw %%gs\n\t"                 \
+       ".code16gcc\n\t"
+
 /* REAL_EXEC: execute some inline assembly code in a way that matches
  * the interface of librm
  */
 #define OUT_CONSTRAINTS(...) __VA_ARGS__
 #define IN_CONSTRAINTS(...)  __VA_ARGS__
 #define CLOBBER(...) __VA_ARGS__
-#define REAL_EXEC( name, asm_code_str, num_out_constraints, out_constraints, \
-                  in_constraints, clobber )                                 \
-       __asm__ __volatile__ (                                               \
-               ".code16\n\t"                                                \
-               "pushw %%gs\n\t"                                             \
-               "pushw %%fs\n\t"                                             \
-               "pushw %%es\n\t"                                             \
-               "pushw %%ds\n\t"                                             \
-               "\n" #name ":\n\t"                                           \
-               asm_code_str                                                 \
-               "popw %%ds\n\t"                                              \
-               "popw %%es\n\t"                                              \
-               "popw %%fs\n\t"                                              \
-               "popw %%gs\n\t"                                              \
-               ".code16gcc\n\t"                                             \
-               : out_constraints                                            \
-               : in_constraints                                             \
-               : clobber                                                    \
-               );
+#define REAL_EXEC( name, asm_code_str, num_out_constraints,            \
+                  out_constraints, in_constraints, clobber ) do {      \
+       __asm__ __volatile__ (                                          \
+               REAL_CODE ( asm_code_str )                              \
+               : out_constraints : in_constraints : clobber );         \
+       } while ( 0 )
 
 #endif /* ASSEMBLY */
 
index d2a5659..b1b37b6 100644 (file)
@@ -177,6 +177,20 @@ extern void remove_from_rm_stack ( void *data, size_t size );
 #define BASEMEM_PARAMETER_INIT BASEMEM_PARAMETER_INIT_LIBRM
 #define BASEMEM_PARAMETER_DONE BASEMEM_PARAMETER_DONE_LIBRM
 
+/* REAL_CODE: declare a fragment of code that executes in real mode */
+#define REAL_CODE( asm_code_str )                      \
+       "pushl $1f\n\t"                                 \
+       "call real_call\n\t"                            \
+       "addl $4, %%esp\n\t"                            \
+       ".section \".text16\", \"ax\", @progbits\n\t"   \
+       ".code16\n\t"                                   \
+       ".arch i386\n\t"                                \
+       "\n1:\n\t"                                      \
+       asm_code_str "\n\t"                             \
+       "ret\n\t"                                       \
+       ".code32\n\t"                                   \
+       ".previous\n\t"
+
 /* REAL_EXEC: execute a fragment of code in real mode */
 #define OUT_CONSTRAINTS(...) __VA_ARGS__
 #define IN_CONSTRAINTS(...) __VA_ARGS__
@@ -184,18 +198,7 @@ extern void remove_from_rm_stack ( void *data, size_t size );
 #define REAL_EXEC( name, asm_code_str, num_out_constraints,            \
                   out_constraints, in_constraints, clobber ) do {      \
        __asm__ __volatile__ (                                          \
-               ".section \".text16\", \"ax\", @progbits\n\t"           \
-               ".code16\n\t"                                           \
-               ".arch i386\n\t"                                        \
-               #name ":\n\t"                                           \
-               asm_code_str "\n\t"                                     \
-               "ret\n\t"                                               \
-               ".size " #name ", . - " #name "\n\t"                    \
-               ".code32\n\t"                                           \
-               ".previous\n\t"                                         \
-               "pushl $" #name "\n\t"                                  \
-               "call real_call\n\t"                                    \
-               "addl $4, %%esp\n\t"                                    \
+               REAL_CODE ( asm_code_str )                              \
                : out_constraints : in_constraints : clobber );         \
        } while ( 0 )