diff options
author | Michael Brown <mcb30@ipxe.org> | 2016-02-18 23:23:38 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2016-02-18 23:23:38 +0000 |
commit | 31b5c2e753dbcb3d5023bccc8e644d0bcb56b2ad (patch) | |
tree | 536967f3f34fba94970a31cbde3fe1d2cf657cce /src/arch/x86 | |
parent | 196f0f2551a4f82d2968c6e3a50aaa54a45ec779 (diff) | |
download | ipxe-31b5c2e753dbcb3d5023bccc8e644d0bcb56b2ad.tar.gz |
[librm] Provide an abstraction wrapper for prot_call
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch/x86')
-rw-r--r-- | src/arch/x86/core/dumpregs.c | 5 | ||||
-rw-r--r-- | src/arch/x86/include/librm.h | 23 | ||||
-rw-r--r-- | src/arch/x86/interface/pcbios/bios_console.c | 8 | ||||
-rw-r--r-- | src/arch/x86/interface/pcbios/bios_reboot.c | 2 | ||||
-rw-r--r-- | src/arch/x86/interface/pcbios/int13.c | 6 | ||||
-rw-r--r-- | src/arch/x86/interface/pxe/pxe_entry.S | 5 | ||||
-rw-r--r-- | src/arch/x86/prefix/dskprefix.S | 6 | ||||
-rw-r--r-- | src/arch/x86/prefix/exeprefix.S | 5 | ||||
-rw-r--r-- | src/arch/x86/prefix/hdprefix.S | 6 | ||||
-rw-r--r-- | src/arch/x86/prefix/libprefix.S | 5 | ||||
-rw-r--r-- | src/arch/x86/prefix/lkrnprefix.S | 5 | ||||
-rw-r--r-- | src/arch/x86/prefix/nbiprefix.S | 6 | ||||
-rw-r--r-- | src/arch/x86/prefix/pxeprefix.S | 4 | ||||
-rw-r--r-- | src/arch/x86/prefix/romprefix.S | 6 | ||||
-rw-r--r-- | src/arch/x86/prefix/undiloader.S | 5 | ||||
-rw-r--r-- | src/arch/x86/transitions/librm.S | 6 | ||||
-rw-r--r-- | src/arch/x86/transitions/librm_test.c | 12 |
17 files changed, 69 insertions, 46 deletions
diff --git a/src/arch/x86/core/dumpregs.c b/src/arch/x86/core/dumpregs.c index 9f0b08189..37d62a7b6 100644 --- a/src/arch/x86/core/dumpregs.c +++ b/src/arch/x86/core/dumpregs.c @@ -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" diff --git a/src/arch/x86/include/librm.h b/src/arch/x86/include/librm.h index 379e085a2..2786027a0 100644 --- a/src/arch/x86/include/librm.h +++ b/src/arch/x86/include/librm.h @@ -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; diff --git a/src/arch/x86/interface/pcbios/bios_console.c b/src/arch/x86/interface/pcbios/bios_console.c index 72d5b2093..c081a41e6 100644 --- a/src/arch/x86/interface/pcbios/bios_console.c +++ b/src/arch/x86/interface/pcbios/bios_console.c @@ -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 ), diff --git a/src/arch/x86/interface/pcbios/bios_reboot.c b/src/arch/x86/interface/pcbios/bios_reboot.c index 10a1ecb89..ed18dde0b 100644 --- a/src/arch/x86/interface/pcbios/bios_reboot.c +++ b/src/arch/x86/interface/pcbios/bios_reboot.c @@ -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 ); diff --git a/src/arch/x86/interface/pcbios/int13.c b/src/arch/x86/interface/pcbios/int13.c index 7fe247b5f..38880e4f0 100644 --- a/src/arch/x86/interface/pcbios/int13.c +++ b/src/arch/x86/interface/pcbios/int13.c @@ -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 ); } diff --git a/src/arch/x86/interface/pxe/pxe_entry.S b/src/arch/x86/interface/pxe/pxe_entry.S index 2ce1ced2b..663aa842e 100644 --- a/src/arch/x86/interface/pxe/pxe_entry.S +++ b/src/arch/x86/interface/pxe/pxe_entry.S @@ -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 diff --git a/src/arch/x86/prefix/dskprefix.S b/src/arch/x86/prefix/dskprefix.S index 041ec4c4c..0503f113d 100644 --- a/src/arch/x86/prefix/dskprefix.S +++ b/src/arch/x86/prefix/dskprefix.S @@ -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 diff --git a/src/arch/x86/prefix/exeprefix.S b/src/arch/x86/prefix/exeprefix.S index 9598122bc..c351456e2 100644 --- a/src/arch/x86/prefix/exeprefix.S +++ b/src/arch/x86/prefix/exeprefix.S @@ -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 diff --git a/src/arch/x86/prefix/hdprefix.S b/src/arch/x86/prefix/hdprefix.S index 6caf12fc0..24f5d3850 100644 --- a/src/arch/x86/prefix/hdprefix.S +++ b/src/arch/x86/prefix/hdprefix.S @@ -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 diff --git a/src/arch/x86/prefix/libprefix.S b/src/arch/x86/prefix/libprefix.S index 7eb1e501f..425f51484 100644 --- a/src/arch/x86/prefix/libprefix.S +++ b/src/arch/x86/prefix/libprefix.S @@ -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 diff --git a/src/arch/x86/prefix/lkrnprefix.S b/src/arch/x86/prefix/lkrnprefix.S index 41a5b4678..922181f0e 100644 --- a/src/arch/x86/prefix/lkrnprefix.S +++ b/src/arch/x86/prefix/lkrnprefix.S @@ -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 diff --git a/src/arch/x86/prefix/nbiprefix.S b/src/arch/x86/prefix/nbiprefix.S index c25c254e5..de38e4af6 100644 --- a/src/arch/x86/prefix/nbiprefix.S +++ b/src/arch/x86/prefix/nbiprefix.S @@ -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 diff --git a/src/arch/x86/prefix/pxeprefix.S b/src/arch/x86/prefix/pxeprefix.S index 2c6d7abb7..52ea18039 100644 --- a/src/arch/x86/prefix/pxeprefix.S +++ b/src/arch/x86/prefix/pxeprefix.S @@ -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 diff --git a/src/arch/x86/prefix/romprefix.S b/src/arch/x86/prefix/romprefix.S index 941e2ce6b..f4ca20677 100644 --- a/src/arch/x86/prefix/romprefix.S +++ b/src/arch/x86/prefix/romprefix.S @@ -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 diff --git a/src/arch/x86/prefix/undiloader.S b/src/arch/x86/prefix/undiloader.S index fb42637c8..530b48e8a 100644 --- a/src/arch/x86/prefix/undiloader.S +++ b/src/arch/x86/prefix/undiloader.S @@ -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 diff --git a/src/arch/x86/transitions/librm.S b/src/arch/x86/transitions/librm.S index 46c1ab979..49a30851a 100644 --- a/src/arch/x86/transitions/librm.S +++ b/src/arch/x86/transitions/librm.S @@ -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 diff --git a/src/arch/x86/transitions/librm_test.c b/src/arch/x86/transitions/librm_test.c index fc318ec7e..3f9ead218 100644 --- a/src/arch/x86/transitions/librm_test.c +++ b/src/arch/x86/transitions/librm_test.c @@ -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 ); } |