david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[librm] Provide an abstraction wrapper for prot_call

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2016-02-18 23:23:38 +00:00
parent 196f0f2551
commit 31b5c2e753
20 changed files with 77 additions and 60 deletions

View 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

View 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 );
}

View 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"

View 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;

View 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 ),

View 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 );

View 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 );
}

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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 );
}

View 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