mirror of https://github.com/ipxe/ipxe.git
[librm] Provide an abstraction wrapper for prot_call
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/45/head
parent
196f0f2551
commit
31b5c2e753
|
@ -9,7 +9,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
#ifndef ASSEMBLY
|
#ifndef ASSEMBLY
|
||||||
|
|
||||||
/** Declare a function with standard calling conventions */
|
/** 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
|
* Declare a function with libgcc implicit linkage
|
||||||
|
|
|
@ -660,34 +660,28 @@ void hook_comboot_interrupts ( ) {
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
TEXT16_CODE ( "\nint20_wrapper:\n\t"
|
TEXT16_CODE ( "\nint20_wrapper:\n\t"
|
||||||
"pushl %0\n\t"
|
VIRT_CALL ( int20 )
|
||||||
"call prot_call\n\t"
|
|
||||||
"clc\n\t"
|
"clc\n\t"
|
||||||
"call patch_cf\n\t"
|
"call patch_cf\n\t"
|
||||||
"iret\n\t" )
|
"iret\n\t" ) );
|
||||||
: : "i" ( int20 ) );
|
|
||||||
|
|
||||||
hook_bios_interrupt ( 0x20, ( intptr_t ) int20_wrapper, &int20_vector );
|
hook_bios_interrupt ( 0x20, ( intptr_t ) int20_wrapper, &int20_vector );
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
TEXT16_CODE ( "\nint21_wrapper:\n\t"
|
TEXT16_CODE ( "\nint21_wrapper:\n\t"
|
||||||
"pushl %0\n\t"
|
VIRT_CALL ( int21 )
|
||||||
"call prot_call\n\t"
|
|
||||||
"clc\n\t"
|
"clc\n\t"
|
||||||
"call patch_cf\n\t"
|
"call patch_cf\n\t"
|
||||||
"iret\n\t" )
|
"iret\n\t" ) );
|
||||||
: : "i" ( int21 ) );
|
|
||||||
|
|
||||||
hook_bios_interrupt ( 0x21, ( intptr_t ) int21_wrapper, &int21_vector );
|
hook_bios_interrupt ( 0x21, ( intptr_t ) int21_wrapper, &int21_vector );
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
TEXT16_CODE ( "\nint22_wrapper:\n\t"
|
TEXT16_CODE ( "\nint22_wrapper:\n\t"
|
||||||
"pushl %0\n\t"
|
VIRT_CALL ( int22 )
|
||||||
"call prot_call\n\t"
|
|
||||||
"clc\n\t"
|
"clc\n\t"
|
||||||
"call patch_cf\n\t"
|
"call patch_cf\n\t"
|
||||||
"iret\n\t" )
|
"iret\n\t" ) );
|
||||||
: : "i" ( int22) );
|
|
||||||
|
|
||||||
hook_bios_interrupt ( 0x22, ( intptr_t ) int22_wrapper, &int22_vector );
|
hook_bios_interrupt ( 0x22, ( intptr_t ) int22_wrapper, &int22_vector );
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,9 +6,8 @@ void __asmcall _dump_regs ( struct i386_all_regs *ix86 ) {
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
TEXT16_CODE ( ".globl dump_regs\n\t"
|
TEXT16_CODE ( ".globl dump_regs\n\t"
|
||||||
"\ndump_regs:\n\t"
|
"\ndump_regs:\n\t"
|
||||||
"pushl $_dump_regs\n\t"
|
VIRT_CALL ( _dump_regs )
|
||||||
"call prot_call\n\t"
|
"ret\n\t" ) );
|
||||||
"ret\n\t" ) : : );
|
|
||||||
|
|
||||||
printf ( "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n"
|
printf ( "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n"
|
||||||
"ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n"
|
"ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n"
|
||||||
|
|
|
@ -19,7 +19,19 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
#define LONG_DS 0x40
|
#define LONG_DS 0x40
|
||||||
#endif
|
#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
|
#ifdef UACCESS_LIBRM
|
||||||
#define UACCESS_PREFIX_librm
|
#define UACCESS_PREFIX_librm
|
||||||
|
@ -27,6 +39,15 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
#define UACCESS_PREFIX_librm __librm_
|
#define UACCESS_PREFIX_librm __librm_
|
||||||
#endif
|
#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 */
|
/* Variables in librm.S */
|
||||||
extern unsigned long virt_offset;
|
extern unsigned long virt_offset;
|
||||||
|
|
||||||
|
|
|
@ -531,14 +531,12 @@ static void bios_inject_startup ( void ) {
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
TEXT16_CODE ( "\nint16_wrapper:\n\t"
|
TEXT16_CODE ( "\nint16_wrapper:\n\t"
|
||||||
"pushfw\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"
|
"jnz 1f\n\t"
|
||||||
"pushl %0\n\t"
|
VIRT_CALL ( bios_inject )
|
||||||
"call prot_call\n\t"
|
|
||||||
"\n1:\n\t"
|
"\n1:\n\t"
|
||||||
"popfw\n\t"
|
"popfw\n\t"
|
||||||
"ljmp *%%cs:int16_vector\n\t" )
|
"ljmp *%cs:int16_vector\n\t" ) );
|
||||||
: : "i" ( bios_inject ) );
|
|
||||||
|
|
||||||
/* Hook INT 16 */
|
/* Hook INT 16 */
|
||||||
hook_bios_interrupt ( 0x16, ( ( intptr_t ) int16_wrapper ),
|
hook_bios_interrupt ( 0x16, ( ( intptr_t ) int16_wrapper ),
|
||||||
|
|
|
@ -46,7 +46,7 @@ static void bios_reboot ( int warm ) {
|
||||||
put_real ( flag, BDA_SEG, BDA_REBOOT );
|
put_real ( flag, BDA_SEG, BDA_REBOOT );
|
||||||
|
|
||||||
/* Jump to system reset vector */
|
/* 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 );
|
PROVIDE_REBOOT ( pcbios, reboot, bios_reboot );
|
||||||
|
|
|
@ -1480,8 +1480,7 @@ static void int13_hook_vector ( void ) {
|
||||||
/* Clear OF, set CF, call int13() */
|
/* Clear OF, set CF, call int13() */
|
||||||
"orb $0, %%al\n\t"
|
"orb $0, %%al\n\t"
|
||||||
"stc\n\t"
|
"stc\n\t"
|
||||||
"pushl %0\n\t"
|
VIRT_CALL ( int13 )
|
||||||
"call prot_call\n\t"
|
|
||||||
/* Chain if OF not set */
|
/* Chain if OF not set */
|
||||||
"jo 1f\n\t"
|
"jo 1f\n\t"
|
||||||
"pushfw\n\t"
|
"pushfw\n\t"
|
||||||
|
@ -1512,8 +1511,7 @@ static void int13_hook_vector ( void ) {
|
||||||
"\n3:\n\t"
|
"\n3:\n\t"
|
||||||
"movw %%bp, %%sp\n\t"
|
"movw %%bp, %%sp\n\t"
|
||||||
"popw %%bp\n\t"
|
"popw %%bp\n\t"
|
||||||
"iret\n\t" )
|
"iret\n\t" ) : : );
|
||||||
: : "i" ( int13 ) );
|
|
||||||
|
|
||||||
hook_bios_interrupt ( 0x13, ( intptr_t ) int13_wrapper, &int13_vector );
|
hook_bios_interrupt ( 0x13, ( intptr_t ) int13_wrapper, &int13_vector );
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||||
|
|
||||||
|
#include <librm.h>
|
||||||
|
|
||||||
.arch i386
|
.arch i386
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -120,8 +122,7 @@ pxenv_null_entry:
|
||||||
.section ".text16", "ax", @progbits
|
.section ".text16", "ax", @progbits
|
||||||
.code16
|
.code16
|
||||||
pxenv_entry:
|
pxenv_entry:
|
||||||
pushl $pxe_api_call
|
virtcall pxe_api_call
|
||||||
call prot_call
|
|
||||||
lret
|
lret
|
||||||
.size pxenv_entry, . - pxenv_entry
|
.size pxenv_entry, . - pxenv_entry
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
|
|
||||||
FILE_LICENCE ( GPL2_ONLY )
|
FILE_LICENCE ( GPL2_ONLY )
|
||||||
|
|
||||||
|
#include <librm.h>
|
||||||
|
|
||||||
.equ BOOTSEG, 0x07C0 /* original address of boot-sector */
|
.equ BOOTSEG, 0x07C0 /* original address of boot-sector */
|
||||||
|
|
||||||
.equ SYSSEG, 0x1000 /* system loaded at SYSSEG<<4 */
|
.equ SYSSEG, 0x1000 /* system loaded at SYSSEG<<4 */
|
||||||
|
@ -370,8 +372,8 @@ start_runtime:
|
||||||
lret
|
lret
|
||||||
.section ".text16", "awx", @progbits
|
.section ".text16", "awx", @progbits
|
||||||
1:
|
1:
|
||||||
pushl $main
|
/* Run iPXE */
|
||||||
call prot_call
|
virtcall main
|
||||||
|
|
||||||
/* Uninstall iPXE */
|
/* Uninstall iPXE */
|
||||||
call uninstall
|
call uninstall
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||||
|
|
||||||
|
#include <librm.h>
|
||||||
|
|
||||||
/* Initial temporary stack size */
|
/* Initial temporary stack size */
|
||||||
#define EXE_STACK_SIZE 0x400
|
#define EXE_STACK_SIZE 0x400
|
||||||
|
|
||||||
|
@ -148,8 +150,7 @@ _exe_start:
|
||||||
movl %esi, cmdline_phys
|
movl %esi, cmdline_phys
|
||||||
|
|
||||||
/* Run iPXE */
|
/* Run iPXE */
|
||||||
pushl $main
|
virtcall main
|
||||||
call prot_call
|
|
||||||
|
|
||||||
/* Uninstall iPXE */
|
/* Uninstall iPXE */
|
||||||
call uninstall
|
call uninstall
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||||
|
|
||||||
|
#include <librm.h>
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.arch i386
|
.arch i386
|
||||||
.section ".prefix", "awx", @progbits
|
.section ".prefix", "awx", @progbits
|
||||||
|
@ -99,8 +101,8 @@ start_image:
|
||||||
lret
|
lret
|
||||||
.section ".text16", "awx", @progbits
|
.section ".text16", "awx", @progbits
|
||||||
1:
|
1:
|
||||||
pushl $main
|
/* Run iPXE */
|
||||||
call prot_call
|
virtcall main
|
||||||
|
|
||||||
/* Uninstall iPXE */
|
/* Uninstall iPXE */
|
||||||
call uninstall
|
call uninstall
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||||
|
|
||||||
|
#include <librm.h>
|
||||||
|
|
||||||
.arch i386
|
.arch i386
|
||||||
|
|
||||||
/* Image compression enabled */
|
/* Image compression enabled */
|
||||||
|
@ -887,8 +889,7 @@ payload_death_message:
|
||||||
* ready for the copy to the new location.
|
* ready for the copy to the new location.
|
||||||
*/
|
*/
|
||||||
progress " relocate\n"
|
progress " relocate\n"
|
||||||
pushl $relocate
|
virtcall relocate
|
||||||
call prot_call
|
|
||||||
|
|
||||||
/* Jump back to .prefix segment */
|
/* Jump back to .prefix segment */
|
||||||
pushw $1f
|
pushw $1f
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||||
|
|
||||||
|
#include <librm.h>
|
||||||
|
|
||||||
#define BZI_LOAD_HIGH_ADDR 0x100000
|
#define BZI_LOAD_HIGH_ADDR 0x100000
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
@ -197,8 +199,7 @@ no_cmd_line:
|
||||||
movl %ecx, initrd_len
|
movl %ecx, initrd_len
|
||||||
|
|
||||||
/* Run iPXE */
|
/* Run iPXE */
|
||||||
pushl $main
|
virtcall main
|
||||||
call prot_call
|
|
||||||
|
|
||||||
/* Uninstall iPXE */
|
/* Uninstall iPXE */
|
||||||
call uninstall
|
call uninstall
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||||
|
|
||||||
|
#include <librm.h>
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.arch i386
|
.arch i386
|
||||||
.code16
|
.code16
|
||||||
|
@ -66,8 +68,8 @@ _nbi_start:
|
||||||
lret
|
lret
|
||||||
.section ".text16", "awx", @progbits
|
.section ".text16", "awx", @progbits
|
||||||
1:
|
1:
|
||||||
pushl $main
|
/* Run iPXE */
|
||||||
call prot_call
|
virtcall main
|
||||||
|
|
||||||
/* Uninstall iPXE */
|
/* Uninstall iPXE */
|
||||||
call uninstall
|
call uninstall
|
||||||
|
|
|
@ -16,6 +16,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||||
.org 0
|
.org 0
|
||||||
.code16
|
.code16
|
||||||
|
|
||||||
|
#include <librm.h>
|
||||||
#include <undi.h>
|
#include <undi.h>
|
||||||
|
|
||||||
#define STACK_MAGIC ( 'L' + ( 'R' << 8 ) + ( 'E' << 16 ) + ( 'T' << 24 ) )
|
#define STACK_MAGIC ( 'L' + ( 'R' << 8 ) + ( 'E' << 16 ) + ( 'T' << 24 ) )
|
||||||
|
@ -820,8 +821,7 @@ run_ipxe:
|
||||||
movl %ecx, cached_dhcpack_phys
|
movl %ecx, cached_dhcpack_phys
|
||||||
|
|
||||||
/* Run main program */
|
/* Run main program */
|
||||||
pushl $main
|
virtcall main
|
||||||
call prot_call
|
|
||||||
|
|
||||||
/* Uninstall iPXE */
|
/* Uninstall iPXE */
|
||||||
call uninstall
|
call uninstall
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||||
|
|
||||||
|
#include <librm.h>
|
||||||
#include <config/general.h>
|
#include <config/general.h>
|
||||||
#include <config/branding.h>
|
#include <config/branding.h>
|
||||||
|
|
||||||
|
@ -806,9 +807,8 @@ exec: /* Set %ds = %cs */
|
||||||
#endif /* AUTOBOOT_ROM_FILTER */
|
#endif /* AUTOBOOT_ROM_FILTER */
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
/* Call main() */
|
/* Run iPXE */
|
||||||
pushl $main
|
virtcall main
|
||||||
call prot_call
|
|
||||||
|
|
||||||
/* Set up flat real mode for return to BIOS */
|
/* Set up flat real mode for return to BIOS */
|
||||||
call flatten_real_mode
|
call flatten_real_mode
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
||||||
|
|
||||||
|
#include <librm.h>
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.code16
|
.code16
|
||||||
.arch i386
|
.arch i386
|
||||||
|
@ -45,8 +47,7 @@ undiloader:
|
||||||
.section ".text16", "ax", @progbits
|
.section ".text16", "ax", @progbits
|
||||||
1:
|
1:
|
||||||
/* Call UNDI loader C code */
|
/* Call UNDI loader C code */
|
||||||
pushl $pxe_loader_call
|
virtcall pxe_loader_call
|
||||||
call prot_call
|
|
||||||
|
|
||||||
1: /* Restore registers and return */
|
1: /* Restore registers and return */
|
||||||
popw %bx
|
popw %bx
|
||||||
|
|
|
@ -131,8 +131,7 @@ init_librm:
|
||||||
addl $gdt, gdt_base
|
addl $gdt, gdt_base
|
||||||
|
|
||||||
/* Initialise IDT */
|
/* Initialise IDT */
|
||||||
pushl $init_idt
|
virtcall init_idt
|
||||||
call prot_call
|
|
||||||
|
|
||||||
/* Restore registers */
|
/* Restore registers */
|
||||||
negl %edi
|
negl %edi
|
||||||
|
@ -554,8 +553,7 @@ flatten_real_mode:
|
||||||
movb $0x8f, real_cs + 6
|
movb $0x8f, real_cs + 6
|
||||||
movb $0x8f, real_ds + 6
|
movb $0x8f, real_ds + 6
|
||||||
/* Call dummy protected-mode function */
|
/* Call dummy protected-mode function */
|
||||||
pushl $flatten_dummy
|
virtcall flatten_dummy
|
||||||
call prot_call
|
|
||||||
/* Restore GDT */
|
/* Restore GDT */
|
||||||
movb $0x00, real_cs + 6
|
movb $0x00, real_cs + 6
|
||||||
movb $0x00, real_ds + 6
|
movb $0x00, real_ds + 6
|
||||||
|
|
|
@ -56,9 +56,9 @@ static struct profiler real_call_profiler __profiler = { .name = "real_call" };
|
||||||
static struct profiler prot_call_profiler __profiler = { .name = "prot_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 */
|
/* Do nothing */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ static void librm_test_exec ( void ) {
|
||||||
/* Profile complete real-mode call cycle */
|
/* Profile complete real-mode call cycle */
|
||||||
for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
|
for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
|
||||||
profile_start ( &real_call_profiler );
|
profile_start ( &real_call_profiler );
|
||||||
__asm__ __volatile__ ( REAL_CODE ( "" ) : : );
|
__asm__ __volatile__ ( REAL_CODE ( "" ) );
|
||||||
profile_stop ( &real_call_profiler );
|
profile_stop ( &real_call_profiler );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,12 +105,10 @@ static void librm_test_exec ( void ) {
|
||||||
for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
|
for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
|
||||||
__asm__ __volatile__ ( REAL_CODE ( "rdtsc\n\t"
|
__asm__ __volatile__ ( REAL_CODE ( "rdtsc\n\t"
|
||||||
"movl %k0, %k2\n\t"
|
"movl %k0, %k2\n\t"
|
||||||
"pushl %k3\n\t"
|
VIRT_CALL ( librm_test_call )
|
||||||
"call prot_call\n\t"
|
|
||||||
"rdtsc\n\t" )
|
"rdtsc\n\t" )
|
||||||
: "=a" ( stopped ), "=d" ( discard_d ),
|
: "=a" ( stopped ), "=d" ( discard_d ),
|
||||||
"=R" ( started )
|
"=R" ( started ) : );
|
||||||
: "i" ( librm_test_prot_call ) );
|
|
||||||
profile_start_at ( &prot_call_profiler, started );
|
profile_start_at ( &prot_call_profiler, started );
|
||||||
profile_stop_at ( &prot_call_profiler, stopped );
|
profile_stop_at ( &prot_call_profiler, stopped );
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#ifndef ASSEMBLY
|
#ifndef ASSEMBLY
|
||||||
|
|
||||||
/** Declare a function with standard calling conventions */
|
/** 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 */
|
/** Declare a function with libgcc implicit linkage */
|
||||||
#define __libgcc
|
#define __libgcc
|
||||||
|
|
Loading…
Reference in New Issue