]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[i386] Change semantics of __from_data16 and __from_text16
authorMichael Brown <mcb30@etherboot.org>
Tue, 1 Jul 2008 01:52:13 +0000 (18:52 -0700)
committerMichael Brown <mcb30@etherboot.org>
Tue, 1 Jul 2008 01:52:13 +0000 (18:52 -0700)
__from_data16 and __from_text16 now take a pointer to a
.data16/.text16 variable, and return the real-mode offset within the
appropriate segment.  This matches the use case for every occurrence
of these macros, and prevents potential future bugs such as that fixed
in commit d51d80f.  (The bug arose essentially because "&pointer" is
still syntactically valid.)

src/arch/i386/drivers/net/undiload.c
src/arch/i386/drivers/net/undinet.c
src/arch/i386/firmware/pcbios/memmap.c
src/arch/i386/include/libkir.h
src/arch/i386/include/librm.h
src/arch/i386/interface/pxe/pxe_call.c
src/interface/pxe/pxe_loader.c
src/interface/pxe/pxe_preboot.c
src/interface/pxe/pxe_undi.c

index a3284f802cc309bc6ead544638636e461fffb6d6..dbd9e7c20f92fc945715fc40ff98de1d16416db7 100644 (file)
@@ -93,8 +93,8 @@ int undi_load ( struct undi_device *undi, struct undi_rom *undirom ) {
                                           "lcall *%c2\n\t"
                                           "addw $4, %%sp\n\t" )
                               : "=a" ( exit )
-                              : "a" ( & __from_data16 ( undi_loader ) ),
-                                "p" ( & __from_data16 ( undi_loader_entry ) )
+                              : "a" ( __from_data16 ( &undi_loader ) ),
+                                "p" ( __from_data16 ( &undi_loader_entry ) )
                               : "ebx", "ecx", "edx", "esi", "edi", "ebp" );
 
        /* UNDI API calls may rudely change the status of A20 and not
index 09c29abaef0b778b36ccb72172b2d5b1bd44adc0..12b954c07a299375a224eba9ea5da85c131481e5 100644 (file)
@@ -176,9 +176,9 @@ static int undinet_call ( struct undi_nic *undinic, unsigned int function,
                                           "addw $6, %%sp\n\t" )
                               : "=a" ( exit ), "=b" ( discard_b ),
                                 "=D" ( discard_D )
-                              : "p" ( &__from_data16 ( undinet_entry_point )),
+                              : "p" ( __from_data16 ( &undinet_entry_point )),
                                 "b" ( function ),
-                                "D" ( &__from_data16 ( undinet_params ) )
+                                "D" ( __from_data16 ( &undinet_params ) )
                               : "ecx", "edx", "esi", "ebp" );
 
        /* UNDI API calls may rudely change the status of A20 and not
@@ -211,7 +211,7 @@ static int undinet_call ( struct undi_nic *undinic, unsigned int function,
        if ( rc != 0 ) {
                SEGOFF16_t rm_params = {
                        .segment = rm_ds,
-                       .offset = (intptr_t) &__from_data16 ( undinet_params ),
+                       .offset = __from_data16 ( &undinet_params ),
                };
 
                DBGC ( undinic, "UNDINIC %p %s failed: %s\n", undinic,
@@ -357,17 +357,14 @@ static int undinet_transmit ( struct net_device *netdev,
        /* Create PXENV_UNDI_TRANSMIT data structure */
        memset ( &undi_transmit, 0, sizeof ( undi_transmit ) );
        undi_transmit.DestAddr.segment = rm_ds;
-       undi_transmit.DestAddr.offset
-               = ( ( unsigned ) & __from_data16 ( undinet_tbd ) );
+       undi_transmit.DestAddr.offset = __from_data16 ( &undinet_tbd );
        undi_transmit.TBD.segment = rm_ds;
-       undi_transmit.TBD.offset
-               = ( ( unsigned ) & __from_data16 ( undinet_tbd ) );
+       undi_transmit.TBD.offset = __from_data16 ( &undinet_tbd );
 
        /* Create PXENV_UNDI_TBD data structure */
        undinet_tbd.ImmedLength = len;
        undinet_tbd.Xmit.segment = rm_ds;
-       undinet_tbd.Xmit.offset 
-               = ( ( unsigned ) & __from_data16 ( basemem_packet ) );
+       undinet_tbd.Xmit.offset = __from_data16 ( basemem_packet );
 
        /* Issue PXE API call */
        if ( ( rc = undinet_call ( undinic, PXENV_UNDI_TRANSMIT,
index b6a8ca3c7a490b511bb43e268bead15bec8686ed..97d4861dc6f8791c9d1d35e2fca1691f30d570a3 100644 (file)
@@ -147,7 +147,7 @@ static int meme820 ( struct memory_map *memmap ) {
                                         "=b" ( next ), "=D" ( discard_D ),
                                         "=c" ( discard_c ), "=d" ( discard_d )
                                       : "a" ( 0xe820 ), "b" ( next ),
-                                        "D" ( &__from_data16 ( e820buf ) ),
+                                        "D" ( __from_data16 ( &e820buf ) ),
                                         "c" ( sizeof ( e820buf ) ),
                                         "d" ( SMAP )
                                       : "memory" );
index 5f67a56d8d9ee7315d09f26cb418a4f1fcc6f65a..1f5b135049fb2ef7d46f152e4be3fd3b02584855 100644 (file)
@@ -19,8 +19,8 @@
 #define __text16_array( variable,array ) variable array
 #define __use_data16( variable ) variable
 #define __use_text16( variable ) variable
-#define __from_data16( variable ) variable
-#define __from_text16( variable ) variable
+#define __from_data16( pointer ) pointer
+#define __from_text16( pointer ) pointer
 
 /* Real-mode data and code segments */
 static inline __attribute__ (( always_inline )) unsigned int _rm_cs ( void ) {
index 31b509793e6dd763a54c3788d0579b9760d78bc5..413f0362e53dfa5ce61c0ea5250d2a0dedaea4f0 100644 (file)
@@ -51,13 +51,13 @@ extern char *text16;
        ( * ( ( typeof ( _text16_ ## variable ) * )                     \
              & ( text16 [ ( size_t ) & ( _text16_ ## variable ) ] ) ) )
 
-#define __from_data16( variable )                                      \
-       ( * ( ( typeof ( variable ) * )                                 \
-             ( ( ( void * ) &(variable) ) - ( ( void * ) data16 ) ) ) )
+#define __from_data16( pointer )                                       \
+       ( ( unsigned int )                                              \
+         ( ( ( void * ) (pointer) ) - ( ( void * ) data16 ) ) )
 
-#define __from_text16( variable )                                      \
-       ( * ( ( typeof ( variable ) * )                                 \
-             ( ( ( void * ) &(variable) ) - ( ( void * ) text16 ) ) ) )
+#define __from_text16( pointer )                                       \
+       ( ( unsigned int )                                              \
+         ( ( ( void * ) (pointer) ) - ( ( void * ) text16 ) ) )
 
 /* Variables in librm.S, present in the normal data segment */
 extern uint16_t __data16 ( rm_cs );
index 5b307d4098528044cc9613f153fe27e4c3f30019..3a5f4c75126850db87d20598a4d02de1e5ee0547 100644 (file)
@@ -441,8 +441,8 @@ int pxe_start_nbp ( void ) {
                                           "addw $4, %%sp\n\t" )
                               : "=a" ( rc ), "=b" ( discard_b ),
                                 "=c" ( discard_c )
-                              :  "a" ( & __from_text16 ( ppxe ) ),
-                                 "b" ( & __from_text16 ( pxenv ) ),
+                              :  "a" ( __from_text16 ( &ppxe ) ),
+                                 "b" ( __from_text16 ( &pxenv ) ),
                                  "c" ( rm_cs )
                               : "edx", "esi", "edi", "ebp", "memory" );
 
index 708d203a6e197b5fc3e14eb75bcc15b7bd74fbb0..f815bc252ada7c3b665e83050b48afcb477a3133 100644 (file)
@@ -42,11 +42,9 @@ PXENV_EXIT_t undi_loader ( struct s_UNDI_LOADER *undi_loader ) {
 
        /* Fill in UNDI loader structure */
        undi_loader->PXEptr.segment = rm_cs;
-       undi_loader->PXEptr.offset =
-               ( ( unsigned ) & __from_text16 ( ppxe ) );
+       undi_loader->PXEptr.offset = __from_text16 ( &ppxe );
        undi_loader->PXENVptr.segment = rm_cs;
-       undi_loader->PXENVptr.offset =
-               ( ( unsigned ) & __from_text16 ( pxenv ) );
+       undi_loader->PXENVptr.offset = __from_text16 ( &pxenv );
 
        undi_loader->Status = PXENV_STATUS_SUCCESS;
        return PXENV_EXIT_SUCCESS;
index 3574c7e32890efee3c71cd60061400e29178a6ac..b2914d366f904da74d6739724f7bf2f6c7a68bc2 100644 (file)
@@ -196,8 +196,7 @@ PXENV_EXIT_t pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO
                 * fill it in.
                 */
                get_cached_info->Buffer.segment = rm_ds;
-               get_cached_info->Buffer.offset =
-                       ( unsigned ) ( & __from_data16 ( *info ) );
+               get_cached_info->Buffer.offset = __from_data16 ( info );
                get_cached_info->BufferSize = sizeof ( *info );
                DBG ( " returning %04x:%04x+%04x['%x']",
                      get_cached_info->Buffer.segment,
index 76b55df9d9a907a958e2f47ac05cb8b227d0df11..26d1c7f5a2d26139a9d91d0a7243ebd8ac0d274a 100644 (file)
@@ -597,8 +597,7 @@ PXENV_EXIT_t pxenv_undi_isr ( struct s_PXENV_UNDI_ISR *undi_isr ) {
                undi_isr->FrameHeaderLength =
                        pxe_netdev->ll_protocol->ll_header_len;
                undi_isr->Frame.segment = rm_ds;
-               undi_isr->Frame.offset =
-                       ( ( unsigned ) & __from_data16 ( basemem_packet ) );
+               undi_isr->Frame.offset = __from_data16 ( basemem_packet );
                /* Probably ought to fill in packet type */
                undi_isr->ProtType = P_UNKNOWN;
                undi_isr->PktType = XMT_DESTADDR;