]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[librm] Provide an abstraction wrapper for prot_call
authorMichael Brown <mcb30@ipxe.org>
Thu, 18 Feb 2016 23:23:38 +0000 (23:23 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 18 Feb 2016 23:23:38 +0000 (23:23 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
20 files changed:
src/arch/i386/include/bits/compiler.h
src/arch/i386/interface/syslinux/comboot_call.c
src/arch/x86/core/dumpregs.c
src/arch/x86/include/librm.h
src/arch/x86/interface/pcbios/bios_console.c
src/arch/x86/interface/pcbios/bios_reboot.c
src/arch/x86/interface/pcbios/int13.c
src/arch/x86/interface/pxe/pxe_entry.S
src/arch/x86/prefix/dskprefix.S
src/arch/x86/prefix/exeprefix.S
src/arch/x86/prefix/hdprefix.S
src/arch/x86/prefix/libprefix.S
src/arch/x86/prefix/lkrnprefix.S
src/arch/x86/prefix/nbiprefix.S
src/arch/x86/prefix/pxeprefix.S
src/arch/x86/prefix/romprefix.S
src/arch/x86/prefix/undiloader.S
src/arch/x86/transitions/librm.S
src/arch/x86/transitions/librm_test.c
src/arch/x86_64/include/bits/compiler.h

index 87201135f78cfe10a21ec91aa73c05df7a7e87b5..7c4a09396beb91dc71324e8be98a94f256c3137c 100644 (file)
@@ -9,7 +9,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #ifndef ASSEMBLY
 
 /** Declare a function with standard calling conventions */
-#define __asmcall __attribute__ (( cdecl, regparm(0) ))
+#define __asmcall __attribute__ (( used, cdecl, regparm(0) ))
 
 /**
  * Declare a function with libgcc implicit linkage
index 277ec447508a001a56694aeb446197b13973385e..565977811d1d08f76c06a88e6098d4d05653deac 100644 (file)
@@ -660,34 +660,28 @@ void hook_comboot_interrupts ( ) {
 
        __asm__ __volatile__ (
                TEXT16_CODE ( "\nint20_wrapper:\n\t"
-                             "pushl %0\n\t"
-                             "call prot_call\n\t"
+                             VIRT_CALL ( int20 )
                              "clc\n\t"
                              "call patch_cf\n\t"
-                             "iret\n\t" )
-                         : : "i" ( int20 ) );
+                             "iret\n\t" ) );
 
        hook_bios_interrupt ( 0x20, ( intptr_t ) int20_wrapper, &int20_vector );
 
        __asm__ __volatile__ (
                TEXT16_CODE ( "\nint21_wrapper:\n\t"
-                             "pushl %0\n\t"
-                             "call prot_call\n\t"
+                             VIRT_CALL ( int21 )
                              "clc\n\t"
                              "call patch_cf\n\t"
-                             "iret\n\t" )
-                         : : "i" ( int21 ) );
+                             "iret\n\t" ) );
 
        hook_bios_interrupt ( 0x21, ( intptr_t ) int21_wrapper, &int21_vector );
 
        __asm__  __volatile__ (
                TEXT16_CODE ( "\nint22_wrapper:\n\t"
-                             "pushl %0\n\t"
-                             "call prot_call\n\t"
+                             VIRT_CALL ( int22 )
                              "clc\n\t"
                              "call patch_cf\n\t"
-                             "iret\n\t" )
-                         : : "i" ( int22) );
+                             "iret\n\t" ) );
 
        hook_bios_interrupt ( 0x22, ( intptr_t ) int22_wrapper, &int22_vector );
 }
index 9f0b081898cfe25ed20b841f4e754dd291faa67f..37d62a7b6702fc1582f96331a178e1fa9d6842ad 100644 (file)
@@ -6,9 +6,8 @@ void __asmcall _dump_regs ( struct i386_all_regs *ix86 ) {
        __asm__ __volatile__ (
                TEXT16_CODE ( ".globl dump_regs\n\t"
                              "\ndump_regs:\n\t"
-                             "pushl $_dump_regs\n\t"
-                             "call prot_call\n\t"
-                             "ret\n\t" ) : : );
+                             VIRT_CALL ( _dump_regs )
+                             "ret\n\t" ) );
 
        printf ( "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n"
                 "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n"
index 379e085a2a51214185de9b5ed9e62b34e306ff04..2786027a00545d4184faaf63c96a08d2f6255ad0 100644 (file)
@@ -19,7 +19,19 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #define LONG_DS 0x40
 #endif
 
-#ifndef ASSEMBLY
+#ifdef ASSEMBLY
+
+/**
+ * Call C function from real-mode code
+ *
+ * @v function         C function
+ */
+.macro virtcall function
+       pushl   $\function
+       call    prot_call
+.endm
+
+#else /* ASSEMBLY */
 
 #ifdef UACCESS_LIBRM
 #define UACCESS_PREFIX_librm
@@ -27,6 +39,15 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #define UACCESS_PREFIX_librm __librm_
 #endif
 
+/**
+ * Call C function from real-mode code
+ *
+ * @v function         C function
+ */
+#define VIRT_CALL( function )                                          \
+       "pushl $( " #function " )\n\t"                                  \
+       "call prot_call\n\t"
+
 /* Variables in librm.S */
 extern unsigned long virt_offset;
 
index 72d5b209324cc9b5fbf22092ce5fbd4794672515..c081a41e6fb440324cb8887ff758ce06106aa6d7 100644 (file)
@@ -531,14 +531,12 @@ static void bios_inject_startup ( void ) {
        __asm__ __volatile__ (
                TEXT16_CODE ( "\nint16_wrapper:\n\t"
                              "pushfw\n\t"
-                             "cmpb $0, %%cs:bios_inject_lock\n\t"
+                             "cmpb $0, %cs:bios_inject_lock\n\t"
                              "jnz 1f\n\t"
-                             "pushl %0\n\t"
-                             "call prot_call\n\t"
+                             VIRT_CALL ( bios_inject )
                              "\n1:\n\t"
                              "popfw\n\t"
-                             "ljmp *%%cs:int16_vector\n\t" )
-               : : "i" ( bios_inject ) );
+                             "ljmp *%cs:int16_vector\n\t" ) );
 
        /* Hook INT 16 */
        hook_bios_interrupt ( 0x16, ( ( intptr_t ) int16_wrapper ),
index 10a1ecb896e8d6290b299eb76357d6b8b56a588f..ed18dde0ba6431bed6adf0c23c509d90c516d75b 100644 (file)
@@ -46,7 +46,7 @@ static void bios_reboot ( int warm ) {
        put_real ( flag, BDA_SEG, BDA_REBOOT );
 
        /* Jump to system reset vector */
-       __asm__ __volatile__ ( REAL_CODE ( "ljmp $0xf000, $0xfff0" ) : : );
+       __asm__ __volatile__ ( REAL_CODE ( "ljmp $0xf000, $0xfff0" ) );
 }
 
 PROVIDE_REBOOT ( pcbios, reboot, bios_reboot );
index 7fe247b5fbdb926db6fad68e9ba48985ffc3bff3..38880e4f0b985589ae5e62b2c141d5ca3d61adc4 100644 (file)
@@ -1480,8 +1480,7 @@ static void int13_hook_vector ( void ) {
                             /* Clear OF, set CF, call int13() */
                             "orb $0, %%al\n\t" 
                             "stc\n\t"
-                            "pushl %0\n\t"
-                            "call prot_call\n\t"
+                            VIRT_CALL ( int13 )
                             /* Chain if OF not set */
                             "jo 1f\n\t"
                             "pushfw\n\t"
@@ -1512,8 +1511,7 @@ static void int13_hook_vector ( void ) {
                             "\n3:\n\t"
                             "movw %%bp, %%sp\n\t"
                             "popw %%bp\n\t"
-                            "iret\n\t" )
-              : : "i" ( int13 ) );
+                            "iret\n\t" ) : : );
 
        hook_bios_interrupt ( 0x13, ( intptr_t ) int13_wrapper, &int13_vector );
 }
index 2ce1ced2b26c127bbafb5c12e0f4cf1902218377..663aa842e06932ae7bcf3dc5c2e0677a182eccda 100644 (file)
@@ -24,6 +24,8 @@
 
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
 
+#include <librm.h>
+
        .arch i386
 
 /****************************************************************************
@@ -120,8 +122,7 @@ pxenv_null_entry:
        .section ".text16", "ax", @progbits
        .code16
 pxenv_entry:
-       pushl   $pxe_api_call
-       call    prot_call
+       virtcall pxe_api_call
        lret
        .size   pxenv_entry, . - pxenv_entry
 
index 041ec4c4cf124030d0b3649ca110b85dad0ebe32..0503f113d0c574ddc83dc0d03aa1415f16db2dbf 100644 (file)
@@ -18,6 +18,8 @@
 
 FILE_LICENCE ( GPL2_ONLY )
 
+#include <librm.h>
+
 .equ   BOOTSEG, 0x07C0                 /* original address of boot-sector */
 
 .equ   SYSSEG, 0x1000                  /* system loaded at SYSSEG<<4 */
@@ -370,8 +372,8 @@ start_runtime:
        lret
        .section ".text16", "awx", @progbits
 1:
-       pushl   $main
-       call    prot_call
+       /* Run iPXE */
+       virtcall main
 
        /* Uninstall iPXE */
        call    uninstall
index 9598122bc2b7e52ded362e35b46396e2c03cbd41..c351456e2ebedba7eb5a024e2fbf6c32c4a98a47 100644 (file)
@@ -24,6 +24,8 @@
 
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
 
+#include <librm.h>
+
 /* Initial temporary stack size */
 #define EXE_STACK_SIZE 0x400
 
@@ -148,8 +150,7 @@ _exe_start:
        movl    %esi, cmdline_phys
 
        /* Run iPXE */
-       pushl   $main
-       call    prot_call
+       virtcall main
 
        /* Uninstall iPXE */
        call    uninstall
index 6caf12fc05c7afc0211ddc41e1d0691fd68ddd3a..24f5d3850cae894f6d062006f2de245014bc450d 100644 (file)
@@ -1,5 +1,7 @@
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
 
+#include <librm.h>
+
        .text
        .arch i386
        .section ".prefix", "awx", @progbits
@@ -99,8 +101,8 @@ start_image:
        lret
        .section ".text16", "awx", @progbits
 1:
-       pushl   $main
-       call    prot_call
+       /* Run iPXE */
+       virtcall main
 
        /* Uninstall iPXE */
        call    uninstall
index 7eb1e501f1d30260fb4f95f435bcdec53430d592..425f5148469b28f60951c85e376f28b4dd3bd264 100644 (file)
@@ -24,6 +24,8 @@
 
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
 
+#include <librm.h>
+
        .arch i386
 
 /* Image compression enabled */
@@ -887,8 +889,7 @@ payload_death_message:
         * ready for the copy to the new location.
         */
        progress "  relocate\n"
-       pushl   $relocate
-       call    prot_call
+       virtcall relocate
 
        /* Jump back to .prefix segment */
        pushw   $1f
index 41a5b46786655e8a58bfefe4aeed84c11b92fef4..922181f0e9918ffef66126c0167fda86fc9d89c8 100644 (file)
@@ -1,5 +1,7 @@
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
 
+#include <librm.h>
+
 #define BZI_LOAD_HIGH_ADDR 0x100000
 
        .text
@@ -197,8 +199,7 @@ no_cmd_line:
        movl    %ecx, initrd_len
 
        /* Run iPXE */
-       pushl   $main
-       call    prot_call
+       virtcall main
 
        /* Uninstall iPXE */
        call    uninstall
index c25c254e5a1f8be2a1a387cd3361143ec882afc1..de38e4af6e1b87b9615b85e63fb602122e2723c0 100644 (file)
@@ -1,5 +1,7 @@
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
 
+#include <librm.h>
+
        .text
        .arch i386
        .code16
@@ -66,8 +68,8 @@ _nbi_start:
        lret
        .section ".text16", "awx", @progbits
 1:
-       pushl   $main
-       call    prot_call
+       /* Run iPXE */
+       virtcall main
 
        /* Uninstall iPXE */
        call    uninstall
index 2c6d7abb7f39572447a88381b650149040526988..52ea18039279791bddc5a90d680cbeaa8810658c 100644 (file)
@@ -16,6 +16,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
        .org 0
        .code16
 
+#include <librm.h>
 #include <undi.h>
 
 #define STACK_MAGIC ( 'L' + ( 'R' << 8 ) + ( 'E' << 16 ) + ( 'T' << 24 ) )
@@ -820,8 +821,7 @@ run_ipxe:
        movl    %ecx, cached_dhcpack_phys
 
        /* Run main program */
-       pushl   $main
-       call    prot_call
+       virtcall main
 
        /* Uninstall iPXE */
        call    uninstall
index 941e2ce6bb5c98efe761302ccee7dc9e0a4bb376..f4ca206772bdd3a89191f61a0c819c615753d0ae 100644 (file)
@@ -8,6 +8,7 @@
 
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
 
+#include <librm.h>
 #include <config/general.h>
 #include <config/branding.h>
 
@@ -806,9 +807,8 @@ exec:       /* Set %ds = %cs */
 #endif /* AUTOBOOT_ROM_FILTER */
 .endif
 
-       /* Call main() */
-       pushl   $main
-       call    prot_call
+       /* Run iPXE */
+       virtcall main
 
        /* Set up flat real mode for return to BIOS */
        call    flatten_real_mode
index fb42637c88185450cdcfeb1c968bcf1a21af46b1..530b48e8a3dff1b4df575607fe3b2f58f813324a 100644 (file)
@@ -1,5 +1,7 @@
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
 
+#include <librm.h>
+
        .text
        .code16
        .arch i386
@@ -45,8 +47,7 @@ undiloader:
        .section ".text16", "ax", @progbits
 1:
        /* Call UNDI loader C code */
-       pushl   $pxe_loader_call
-       call    prot_call
+       virtcall pxe_loader_call
 
 1:     /* Restore registers and return */
        popw    %bx
index 46c1ab979dc8fbcdc3903a8b115e15c4783b858a..49a30851a7390f180fc6bdbeb357b6267b7203c1 100644 (file)
@@ -131,8 +131,7 @@ init_librm:
        addl    $gdt, gdt_base
 
        /* Initialise IDT */
-       pushl   $init_idt
-       call    prot_call
+       virtcall init_idt
 
        /* Restore registers */
        negl    %edi
@@ -554,8 +553,7 @@ flatten_real_mode:
        movb    $0x8f, real_cs + 6
        movb    $0x8f, real_ds + 6
        /* Call dummy protected-mode function */
-       pushl   $flatten_dummy
-       call    prot_call
+       virtcall flatten_dummy
        /* Restore GDT */
        movb    $0x00, real_cs + 6
        movb    $0x00, real_ds + 6
index fc318ec7e0dc06d19adc663f0fde1a1fc4044e85..3f9ead21800ebedd40b5f4d5e941648183961507 100644 (file)
@@ -56,9 +56,9 @@ static struct profiler real_call_profiler __profiler = { .name = "real_call" };
 static struct profiler prot_call_profiler __profiler = { .name = "prot_call" };
 
 /**
- * Dummy protected-mode function
+ * Dummy function for profiling tests
  */
-static void librm_test_prot_call ( void ) {
+static __asmcall void librm_test_call ( struct i386_all_regs *ix86 __unused ) {
        /* Do nothing */
 }
 
@@ -97,7 +97,7 @@ static void librm_test_exec ( void ) {
        /* Profile complete real-mode call cycle */
        for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
                profile_start ( &real_call_profiler );
-               __asm__ __volatile__ ( REAL_CODE ( "" ) : : );
+               __asm__ __volatile__ ( REAL_CODE ( "" ) );
                profile_stop ( &real_call_profiler );
        }
 
@@ -105,12 +105,10 @@ static void librm_test_exec ( void ) {
        for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
                __asm__ __volatile__ ( REAL_CODE ( "rdtsc\n\t"
                                                   "movl %k0, %k2\n\t"
-                                                  "pushl %k3\n\t"
-                                                  "call prot_call\n\t"
+                                                  VIRT_CALL ( librm_test_call )
                                                   "rdtsc\n\t" )
                                       : "=a" ( stopped ), "=d" ( discard_d ),
-                                        "=R" ( started )
-                                      : "i" ( librm_test_prot_call ) );
+                                        "=R" ( started ) : );
                profile_start_at ( &prot_call_profiler, started );
                profile_stop_at ( &prot_call_profiler, stopped );
        }
index f70b2e517b2acbdb1acecfae40d2cab861f3dda6..98c560e7d2c726a1c323b3d7efe27f8d99926f9f 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef ASSEMBLY
 
 /** Declare a function with standard calling conventions */
-#define __asmcall __attribute__ (( regparm(0) ))
+#define __asmcall __attribute__ (( used, regparm(0) ))
 
 /** Declare a function with libgcc implicit linkage */
 #define __libgcc