VirtualBox

Changeset 52228 in vbox


Ignore:
Timestamp:
Jul 29, 2014 3:06:47 PM (10 years ago)
Author:
vboxsync
Message:

Devices/ipxe: work around gcc problem not allowing to specify "ebp" to be clobbered

Location:
trunk/src/VBox/Devices/PC/ipxe
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/ipxe/README.vbox

    r52227 r52228  
    1 These iPXE sources were taken from git.ipxe.org. The commit is
    2 a33298dcda4f9b6037e1c21f3d6f056dba77ab18 .
     1These iPXE sources were taken from git.ipxe.org.
     2
     3Initial commit: a33298dcda4f9b6037e1c21f3d6f056dba77ab18
     4
     5Manually applied 238050dfd46e3c4a87329da1d48b4d8dde5af8a1 and
     6cba22d36b77da53890bd65fdadd0e63925687af0 manually to make it
     7compile with recent gcc versions not allowing the ebp register
     8to be clobbered.
  • trunk/src/VBox/Devices/PC/ipxe/src/arch/i386/drivers/net/undiload.c

    r47928 r52228  
    9797        /* Call loader */
    9898        undi_loader_entry = undirom->loader_entry;
    99         __asm__ __volatile__ ( REAL_CODE ( "pushw %%ds\n\t"
     99        __asm__ __volatile__ ( REAL_CODE ( "pushl %%ebp\n\t" /* gcc bug */
     100                                           "pushw %%ds\n\t"
    100101                                           "pushw %%ax\n\t"
    101102                                           "lcall *undi_loader_entry\n\t"
    102                                            "addw $4, %%sp\n\t" )
     103                                           "popl %%ebp\n\t" /* discard */
     104                                           "popl %%ebp\n\t" /* gcc bug */ )
    103105                               : "=a" ( exit )
    104106                               : "a" ( __from_data16 ( &undi_loader ) )
    105                                : "ebx", "ecx", "edx", "esi", "edi", "ebp" );
     107                               : "ebx", "ecx", "edx", "esi", "edi" );
    106108
    107109        if ( exit != PXENV_EXIT_SUCCESS ) {
  • trunk/src/VBox/Devices/PC/ipxe/src/arch/i386/firmware/pcbios/bios_console.c

    r47928 r52228  
    167167
    168168        /* Print character with attribute */
    169         __asm__ __volatile__ ( REAL_CODE ( "sti\n\t"
     169        __asm__ __volatile__ ( REAL_CODE ( "pushl %%ebp\n\t" /* gcc bug */
     170                                           "sti\n\t"
    170171                                           /* Skip non-printable characters */
    171172                                           "cmpb $0x20, %%al\n\t"
     
    188189                                           "movb $0x0e, %%ah\n\t"
    189190                                           "int $0x10\n\t"
    190                                            "cli\n\t" )
     191                                           "cli\n\t"
     192                                           "popl %%ebp\n\t" /* gcc bug */ )
    191193                               : "=a" ( discard_a ), "=b" ( discard_b ),
    192194                                 "=c" ( discard_c )
    193                                : "a" ( character ), "b" ( bios_attr )
    194                                : "ebp" );
     195                               : "a" ( character ), "b" ( bios_attr ) );
    195196}
    196197
  • trunk/src/VBox/Devices/PC/ipxe/src/arch/i386/image/bootsector.c

    r47928 r52228  
    8080                                           "movw %%ax, %%cs:saved_ss\n\t"
    8181                                           "movw %%sp, %%cs:saved_sp\n\t"
    82                                            /* Jump to boot sector */
     82                                           /* Save frame pointer (gcc bug) */
     83                                           "movl %%ebp, %%cs:saved_ebp\n\t"
     84                                           /* Prepare jump to boot sector */
    8385                                           "pushw %%bx\n\t"
    8486                                           "pushw %%di\n\t"
     
    8688                                           "lret\n\t"
    8789                                           /* Preserved variables */
     90                                           "\nsaved_ebp: .long 0\n\t"
    8891                                           "\nsaved_ss: .word 0\n\t"
    8992                                           "\nsaved_sp: .word 0\n\t"
     
    9194                                           /* Boot failure return point */
    9295                                           "\nbootsector_exec_fail:\n\t"
     96                                           /* Restore frame pointer (gcc bug) */
     97                                           "movl %%cs:saved_ebp, %%ebp\n\t"
    9398                                           /* Restore stack pointer */
    9499                                           "movw %%cs:saved_ss, %%ax\n\t"
     
    101106                               : "b" ( segment ), "D" ( offset ),
    102107                                 "d" ( drive )
    103                                : "eax", "ecx", "esi", "ebp" );
     108                               : "eax", "ecx", "esi" );
    104109
    105110        DBG ( "Booted disk returned via INT 18 or 19\n" );
  • trunk/src/VBox/Devices/PC/ipxe/src/arch/i386/image/elfboot.c

    r47928 r52228  
    6060        /* Jump to OS with flat physical addressing */
    6161        DBGC ( image, "ELF %p starting execution at %lx\n", image, entry );
    62         __asm__ __volatile__ ( PHYS_CODE ( "call *%%edi\n\t" )
     62        __asm__ __volatile__ ( PHYS_CODE ( "pushl %%ebp\n\t" /* gcc bug */
     63                                           "call *%%edi\n\t"
     64                                           "popl %%ebp\n\t" /* gcc bug */ )
    6365                               : : "D" ( entry )
    64                                : "eax", "ebx", "ecx", "edx", "esi", "ebp",
    65                                  "memory" );
     66                               : "eax", "ebx", "ecx", "edx", "esi", "memory" );
    6667
    6768        DBGC ( image, "ELF %p returned\n", image );
  • trunk/src/VBox/Devices/PC/ipxe/src/arch/i386/image/nbi.c

    r47928 r52228  
    254254
    255255        __asm__ __volatile__ (
    256                 REAL_CODE ( "pushw %%ds\n\t"    /* far pointer to bootp data */
     256                REAL_CODE ( "pushl %%ebp\n\t"   /* gcc bug */
     257                            "pushw %%ds\n\t"    /* far pointer to bootp data */
    257258                            "pushw %%bx\n\t"
    258259                            "pushl %%esi\n\t"   /* location */
     
    264265                            "lret\n\t"
    265266                            "\n2:\n\t"
    266                             "addw $8,%%sp\n\t"  /* clean up stack */ )
     267                            "addw $8,%%sp\n\t"  /* clean up stack */
     268                            "popl %%ebp\n\t"    /* gcc bug */ )
    267269                : "=a" ( rc ), "=D" ( discard_D ), "=S" ( discard_S ),
    268270                  "=b" ( discard_b )
     
    270272                  "S" ( imgheader->location ),
    271273                  "b" ( __from_data16 ( basemem_packet ) )
    272                 : "ecx", "edx", "ebp" );
     274                : "ecx", "edx" );
    273275
    274276        return rc;
     
    290292        /* Jump to OS with flat physical addressing */
    291293        __asm__ __volatile__ (
    292                 PHYS_CODE ( "pushl %%ebx\n\t" /* bootp data */
     294                PHYS_CODE ( "pushl %%ebp\n\t" /* gcc bug */
     295                            "pushl %%ebx\n\t" /* bootp data */
    293296                            "pushl %%esi\n\t" /* imgheader */
    294297                            "pushl %%eax\n\t" /* loaderinfo */
    295298                            "call *%%edi\n\t"
    296                             "addl $12, %%esp\n\t" /* clean up stack */ )
     299                            "addl $12, %%esp\n\t" /* clean up stack */
     300                            "popl %%ebp\n\t" /* gcc bug */ )
    297301                : "=a" ( rc ), "=D" ( discard_D ), "=S" ( discard_S ),
    298302                  "=b" ( discard_b )
     
    302306                  "b" ( virt_to_phys ( basemem_packet ) ),
    303307                  "a" ( virt_to_phys ( &loaderinfo ) )
    304                 : "ecx", "edx", "ebp", "memory" );
     308                : "ecx", "edx", "memory" );
    305309
    306310        return rc;
  • trunk/src/VBox/Devices/PC/ipxe/src/arch/i386/interface/pxe/pxe_call.c

    r47928 r52228  
    265265
    266266        /* Far call to PXE NBP */
    267         __asm__ __volatile__ ( REAL_CODE ( "movw %%cx, %%es\n\t"
     267        __asm__ __volatile__ ( REAL_CODE ( "pushl %%ebp\n\t" /* gcc bug */
     268                                           "movw %%cx, %%es\n\t"
    268269                                           "pushw %%es\n\t"
    269270                                           "pushw %%di\n\t"
    270271                                           "sti\n\t"
    271272                                           "lcall $0, $0x7c00\n\t"
    272                                            "addw $4, %%sp\n\t" )
     273                                           "popl %%ebp\n\t" /* discard */
     274                                           "popl %%ebp\n\t" /* gcc bug */ )
    273275                               : "=a" ( rc ), "=b" ( discard_b ),
    274276                                 "=c" ( discard_c ), "=d" ( discard_d ),
     
    278280                                 "d" ( virt_to_phys ( &pxenv ) ),
    279281                                 "D" ( __from_text16 ( &ppxe ) )
    280                                : "esi", "ebp", "memory" );
     282                               : "esi", "memory" );
    281283
    282284        return rc;
  • trunk/src/VBox/Devices/PC/ipxe/src/arch/i386/interface/pxeparent/pxeparent.c

    r47928 r52228  
    137137         * work with both the !PXE and the PXENV+ entry points.
    138138         */
    139         __asm__ __volatile__ ( REAL_CODE ( "pushw %%es\n\t"
     139        __asm__ __volatile__ ( REAL_CODE ( "pushl %%ebp\n\t" /* gcc bug */
     140                                           "pushw %%es\n\t"
    140141                                           "pushw %%di\n\t"
    141142                                           "pushw %%bx\n\t"
    142143                                           "lcall *pxeparent_entry_point\n\t"
    143                                            "addw $6, %%sp\n\t" )
     144                                           "addw $6, %%sp\n\t"
     145                                           "popl %%ebp\n\t" /* gcc bug */ )
    144146                               : "=a" ( exit ), "=b" ( discard_b ),
    145147                                 "=D" ( discard_D )
    146148                               : "b" ( function ),
    147149                                 "D" ( __from_data16 ( &pxeparent_params ) )
    148                                : "ecx", "edx", "esi", "ebp" );
     150                               : "ecx", "edx", "esi" );
    149151
    150152        /* Determine return status code based on PXENV_EXIT and
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette