]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[acpi] Remove userptr_t from ACPI table parsing
authorMichael Brown <mcb30@ipxe.org>
Tue, 22 Apr 2025 13:13:45 +0000 (14:13 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 22 Apr 2025 13:21:06 +0000 (14:21 +0100)
Simplify the ACPI table parsing code by assuming that all table
content is fully accessible via pointer dereferences.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
14 files changed:
src/arch/x86/include/ipxe/rsdp.h
src/arch/x86/interface/pcbios/acpi_timer.c
src/arch/x86/interface/pcbios/acpipwr.c
src/arch/x86/interface/pcbios/rsdp.c
src/core/acpi.c
src/core/acpi_settings.c
src/core/acpimac.c
src/drivers/bus/ecam.c
src/include/ipxe/acpi.h
src/include/ipxe/efi/efi_acpi.h
src/include/ipxe/null_acpi.h
src/interface/efi/efi_acpi.c
src/interface/linux/linux_acpi.c
src/tests/acpi_test.c

index 14afcd774bc857030c7e3567962acea09e126c46..daaa43077706b2b027169ff53d10165d7e71c17f 100644 (file)
@@ -20,9 +20,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  *
  * @v signature                Requested table signature
  * @v index            Requested index of table with this signature
- * @ret table          Table, or UNULL if not found
+ * @ret table          Table, or NULL if not found
  */
-static inline __attribute__ (( always_inline )) userptr_t
+static inline __attribute__ (( always_inline )) const struct acpi_header *
 ACPI_INLINE ( rsdp, acpi_find ) ( uint32_t signature, unsigned int index ) {
 
        return acpi_find_via_rsdt ( signature, index );
index 2e4047e38ee0d2f61eff40b157859b3022213099..e1523578b19a2bd9ac35de47425c77d3ed01f11f 100644 (file)
@@ -102,20 +102,19 @@ static void acpi_udelay ( unsigned long usecs ) {
  * @ret rc             Return status code
  */
 static int acpi_timer_probe ( void ) {
-       struct acpi_fadt fadtab;
-       userptr_t fadt;
+       const struct acpi_fadt *fadt;
        unsigned int pm_tmr_blk;
 
        /* Locate FADT */
-       fadt = acpi_table ( FADT_SIGNATURE, 0 );
+       fadt = container_of ( acpi_table ( FADT_SIGNATURE, 0 ),
+                             struct acpi_fadt, acpi );
        if ( ! fadt ) {
                DBGC ( &acpi_timer, "ACPI could not find FADT\n" );
                return -ENOENT;
        }
 
        /* Read FADT */
-       copy_from_user ( &fadtab, fadt, 0, sizeof ( fadtab ) );
-       pm_tmr_blk = le32_to_cpu ( fadtab.pm_tmr_blk );
+       pm_tmr_blk = le32_to_cpu ( fadt->pm_tmr_blk );
        if ( ! pm_tmr_blk ) {
                DBGC ( &acpi_timer, "ACPI has no timer\n" );
                return -ENOENT;
index f08b4af252b6af49e8f4a57b9b0a85936c5897ec..bff53806b3bab501b6c1fdece12a8adb6b3b562f 100644 (file)
@@ -62,8 +62,8 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  * uglier hacks I have ever implemented, but it's still prettier than
  * the ACPI specification itself.
  */
-static int acpi_extract_sx ( userptr_t zsdt, size_t len, size_t offset,
-                            void *data ) {
+static int acpi_extract_sx ( const struct acpi_header *zsdt, size_t len,
+                            size_t offset, void *data ) {
        unsigned int *sx = data;
        uint8_t bytes[4];
        uint8_t *byte;
@@ -77,7 +77,8 @@ static int acpi_extract_sx ( userptr_t zsdt, size_t len, size_t offset,
        }
 
        /* Read first four bytes of value */
-       copy_from_user ( bytes, zsdt, offset, sizeof ( bytes ) );
+       memcpy ( bytes, ( ( ( const void * ) zsdt ) + offset ),
+                sizeof ( bytes ) );
        DBGC ( colour, "ACPI found \\_Sx containing %02x:%02x:%02x:%02x\n",
               bytes[0], bytes[1], bytes[2], bytes[3] );
 
@@ -111,8 +112,7 @@ static int acpi_extract_sx ( userptr_t zsdt, size_t len, size_t offset,
  * @ret rc             Return status code
  */
 int acpi_poweroff ( void ) {
-       struct acpi_fadt fadtab;
-       userptr_t fadt;
+       const struct acpi_fadt *fadt;
        unsigned int pm1a_cnt_blk;
        unsigned int pm1b_cnt_blk;
        unsigned int pm1a_cnt;
@@ -123,16 +123,16 @@ int acpi_poweroff ( void ) {
        int rc;
 
        /* Locate FADT */
-       fadt = acpi_table ( FADT_SIGNATURE, 0 );
+       fadt = container_of ( acpi_table ( FADT_SIGNATURE, 0 ),
+                             struct acpi_fadt, acpi );
        if ( ! fadt ) {
                DBGC ( colour, "ACPI could not find FADT\n" );
                return -ENOENT;
        }
 
        /* Read FADT */
-       copy_from_user ( &fadtab, fadt, 0, sizeof ( fadtab ) );
-       pm1a_cnt_blk = le32_to_cpu ( fadtab.pm1a_cnt_blk );
-       pm1b_cnt_blk = le32_to_cpu ( fadtab.pm1b_cnt_blk );
+       pm1a_cnt_blk = le32_to_cpu ( fadt->pm1a_cnt_blk );
+       pm1b_cnt_blk = le32_to_cpu ( fadt->pm1b_cnt_blk );
        pm1a_cnt = ( pm1a_cnt_blk + ACPI_PM1_CNT );
        pm1b_cnt = ( pm1b_cnt_blk + ACPI_PM1_CNT );
 
index c2534c7f6a17ae321468f9c5be4c52be3eb90dd3..6bcf19b18ec28bc85a4b99d538e6b933a91b0a7d 100644 (file)
@@ -53,50 +53,51 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  *
  * @v start            Start address to search
  * @v len              Length to search
- * @ret rsdt           ACPI root system description table, or UNULL
+ * @ret rsdt           ACPI root system description table, or NULL
  */
-static userptr_t rsdp_find_rsdt_range ( userptr_t start, size_t len ) {
+static const struct acpi_rsdt * rsdp_find_rsdt_range ( const void *start,
+                                                      size_t len ) {
        static const char signature[8] = RSDP_SIGNATURE;
-       struct acpi_rsdp rsdp;
-       userptr_t rsdt;
+       const struct acpi_rsdp *rsdp;
+       const struct acpi_rsdt *rsdt;
        size_t offset;
        uint8_t sum;
        unsigned int i;
 
        /* Search for RSDP */
-       for ( offset = 0 ; ( ( offset + sizeof ( rsdp ) ) < len ) ;
+       for ( offset = 0 ; ( ( offset + sizeof ( *rsdp ) ) < len ) ;
              offset += RSDP_STRIDE ) {
 
                /* Check signature and checksum */
-               copy_from_user ( &rsdp, start, offset, sizeof ( rsdp ) );
-               if ( memcmp ( rsdp.signature, signature,
+               rsdp = ( start + offset );
+               if ( memcmp ( rsdp->signature, signature,
                              sizeof ( signature ) ) != 0 )
                        continue;
-               for ( sum = 0, i = 0 ; i < sizeof ( rsdp ) ; i++ )
-                       sum += *( ( ( uint8_t * ) &rsdp ) + i );
+               for ( sum = 0, i = 0 ; i < sizeof ( *rsdp ) ; i++ )
+                       sum += *( ( ( uint8_t * ) rsdp ) + i );
                if ( sum != 0 )
                        continue;
 
                /* Extract RSDT */
-               rsdt = phys_to_virt ( le32_to_cpu ( rsdp.rsdt ) );
+               rsdt = phys_to_virt ( le32_to_cpu ( rsdp->rsdt ) );
                DBGC ( rsdt, "RSDT %#08lx found via RSDP %#08lx\n",
                       virt_to_phys ( rsdt ),
                       ( virt_to_phys ( start ) + offset ) );
                return rsdt;
        }
 
-       return UNULL;
+       return NULL;
 }
 
 /**
  * Locate ACPI root system description table
  *
- * @ret rsdt           ACPI root system description table, or UNULL
+ * @ret rsdt           ACPI root system description table, or NULL
  */
-static userptr_t rsdp_find_rsdt ( void ) {
-       static userptr_t rsdt;
+static const struct acpi_rsdt * rsdp_find_rsdt ( void ) {
+       static const struct acpi_rsdt *rsdt;
+       const void *ebda;
        uint16_t ebda_seg;
-       userptr_t ebda;
        size_t ebda_len;
 
        /* Return existing RSDT if already found */
@@ -119,7 +120,7 @@ static userptr_t rsdp_find_rsdt ( void ) {
        if ( rsdt )
                return rsdt;
 
-       return UNULL;
+       return NULL;
 }
 
 PROVIDE_ACPI ( rsdp, acpi_find_rsdt, rsdp_find_rsdt );
index d7da0ccc12e43171bda6ce612bf39063bb1a3ca2..6c5d1e079067d4ac664652e6ebf72993dd891d4e 100644 (file)
@@ -23,6 +23,7 @@
 
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
+#include <string.h>
 #include <errno.h>
 #include <byteswap.h>
 #include <ipxe/uaccess.h>
@@ -54,25 +55,17 @@ typeof ( acpi_find ) *acpi_finder __attribute__ (( weak )) = acpi_find;
 /**
  * Compute ACPI table checksum
  *
- * @v table            Any ACPI table
+ * @v acpi             Any ACPI table header
  * @ret checksum       0 if checksum is good
  */
-static uint8_t acpi_checksum ( userptr_t table ) {
-       struct acpi_header acpi;
+static uint8_t acpi_checksum ( const struct acpi_header *acpi ) {
+       const uint8_t *byte = ( ( const void * ) acpi );
+       size_t len = le32_to_cpu ( acpi->length );
        uint8_t sum = 0;
-       uint8_t data = 0;
-       unsigned int i;
-
-       /* Read table length */
-       copy_from_user ( &acpi.length, table,
-                        offsetof ( typeof ( acpi ), length ),
-                        sizeof ( acpi.length ) );
 
        /* Compute checksum */
-       for ( i = 0 ; i < le32_to_cpu ( acpi.length ) ; i++ ) {
-               copy_from_user ( &data, table, i, sizeof ( data ) );
-               sum += data;
-       }
+       while ( len-- )
+               sum += *(byte++);
 
        return sum;
 }
@@ -85,7 +78,7 @@ static uint8_t acpi_checksum ( userptr_t table ) {
 void acpi_fix_checksum ( struct acpi_header *acpi ) {
 
        /* Update checksum */
-       acpi->checksum -= acpi_checksum ( virt_to_user ( acpi ) );
+       acpi->checksum -= acpi_checksum ( acpi );
 }
 
 /**
@@ -93,9 +86,10 @@ void acpi_fix_checksum ( struct acpi_header *acpi ) {
  *
  * @v signature                Requested table signature
  * @v index            Requested index of table with this signature
- * @ret table          Table, or UNULL if not found
+ * @ret table          Table, or NULL if not found
  */
-userptr_t acpi_table ( uint32_t signature, unsigned int index ) {
+const struct acpi_header * acpi_table ( uint32_t signature,
+                                       unsigned int index ) {
 
        return ( *acpi_finder ) ( signature, index );
 }
@@ -105,14 +99,12 @@ userptr_t acpi_table ( uint32_t signature, unsigned int index ) {
  *
  * @v signature                Requested table signature
  * @v index            Requested index of table with this signature
- * @ret table          Table, or UNULL if not found
+ * @ret table          Table, or NULL if not found
  */
-userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index ) {
-       struct acpi_header acpi;
-       struct acpi_rsdt *rsdtab;
-       typeof ( rsdtab->entry[0] ) entry;
-       userptr_t rsdt;
-       userptr_t table;
+const struct acpi_header * acpi_find_via_rsdt ( uint32_t signature,
+                                               unsigned int index ) {
+       const struct acpi_rsdt *rsdt;
+       const struct acpi_header *table;
        size_t len;
        unsigned int count;
        unsigned int i;
@@ -121,45 +113,38 @@ userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index ) {
        rsdt = acpi_find_rsdt();
        if ( ! rsdt ) {
                DBG ( "RSDT not found\n" );
-               return UNULL;
+               return NULL;
        }
 
        /* Read RSDT header */
-       copy_from_user ( &acpi, rsdt, 0, sizeof ( acpi ) );
-       if ( acpi.signature != cpu_to_le32 ( RSDT_SIGNATURE ) ) {
+       if ( rsdt->acpi.signature != cpu_to_le32 ( RSDT_SIGNATURE ) ) {
                DBGC ( colour, "RSDT %#08lx has invalid signature:\n",
                       virt_to_phys ( rsdt ) );
-               DBGC_HDA ( colour, virt_to_phys ( rsdt ), &acpi,
-                          sizeof ( acpi ) );
-               return UNULL;
+               DBGC_HDA ( colour, virt_to_phys ( rsdt ), &rsdt->acpi,
+                          sizeof ( rsdt->acpi ) );
+               return NULL;
        }
-       len = le32_to_cpu ( acpi.length );
-       if ( len < sizeof ( rsdtab->acpi ) ) {
+       len = le32_to_cpu ( rsdt->acpi.length );
+       if ( len < sizeof ( rsdt->acpi ) ) {
                DBGC ( colour, "RSDT %#08lx has invalid length:\n",
                       virt_to_phys ( rsdt ) );
-               DBGC_HDA ( colour, virt_to_phys ( rsdt ), &acpi,
-                          sizeof ( acpi ) );
-               return UNULL;
+               DBGC_HDA ( colour, virt_to_phys ( rsdt ), &rsdt->acpi,
+                          sizeof ( rsdt->acpi ) );
+               return NULL;
        }
 
        /* Calculate number of entries */
-       count = ( ( len - sizeof ( rsdtab->acpi ) ) / sizeof ( entry ) );
+       count = ( ( len - sizeof ( rsdt->acpi ) ) /
+                 sizeof ( rsdt->entry[0] ) );
 
        /* Search through entries */
        for ( i = 0 ; i < count ; i++ ) {
 
-               /* Get table address */
-               copy_from_user ( &entry, rsdt,
-                                offsetof ( typeof ( *rsdtab ), entry[i] ),
-                                sizeof ( entry ) );
-
                /* Read table header */
-               table = phys_to_virt ( entry );
-               copy_from_user ( &acpi.signature, table, 0,
-                                sizeof ( acpi.signature ) );
+               table = phys_to_virt ( rsdt->entry[i] );
 
                /* Check table signature */
-               if ( acpi.signature != cpu_to_le32 ( signature ) )
+               if ( table->signature != cpu_to_le32 ( signature ) )
                        continue;
 
                /* Check index */
@@ -169,13 +154,13 @@ userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index ) {
                /* Check table integrity */
                if ( acpi_checksum ( table ) != 0 ) {
                        DBGC ( colour, "RSDT %#08lx found %s with bad "
-                              "checksum at %08lx\n", virt_to_phys ( rsdt ),
+                              "checksum at %#08lx\n", virt_to_phys ( rsdt ),
                               acpi_name ( signature ),
                               virt_to_phys ( table ) );
                        break;
                }
 
-               DBGC ( colour, "RSDT %#08lx found %s at %08lx\n",
+               DBGC ( colour, "RSDT %#08lx found %s at %#08lx\n",
                       virt_to_phys ( rsdt ), acpi_name ( signature ),
                       virt_to_phys ( table ) );
                return table;
@@ -183,7 +168,7 @@ userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index ) {
 
        DBGC ( colour, "RSDT %#08lx could not find %s\n",
               virt_to_phys ( rsdt ), acpi_name ( signature ) );
-       return UNULL;
+       return NULL;
 }
 
 /**
@@ -195,26 +180,27 @@ userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index ) {
  * @v extract          Extraction method
  * @ret rc             Return status code
  */
-static int acpi_zsdt ( userptr_t zsdt, uint32_t signature, void *data,
-                      int ( * extract ) ( userptr_t zsdt, size_t len,
-                                          size_t offset, void *data ) ) {
-       struct acpi_header acpi;
+static int acpi_zsdt ( const struct acpi_header *zsdt,
+                      uint32_t signature, void *data,
+                      int ( * extract ) ( const struct acpi_header *zsdt,
+                                          size_t len, size_t offset,
+                                          void *data ) ) {
        uint32_t buf;
        size_t offset;
        size_t len;
        int rc;
 
        /* Read table header */
-       copy_from_user ( &acpi, zsdt, 0, sizeof ( acpi ) );
-       len = le32_to_cpu ( acpi.length );
+       len = le32_to_cpu ( zsdt->length );
 
        /* Locate signature */
-       for ( offset = sizeof ( acpi ) ;
+       for ( offset = sizeof ( *zsdt ) ;
              ( ( offset + sizeof ( buf ) /* signature */ ) < len ) ;
              offset++ ) {
 
                /* Check signature */
-               copy_from_user ( &buf, zsdt, offset, sizeof ( buf ) );
+               memcpy ( &buf, ( ( ( const void * ) zsdt ) + offset ),
+                        sizeof ( buf ) );
                if ( buf != cpu_to_le32 ( signature ) )
                        continue;
                DBGC ( zsdt, "DSDT/SSDT %#08lx found %s at offset %#zx\n",
@@ -238,20 +224,20 @@ static int acpi_zsdt ( userptr_t zsdt, uint32_t signature, void *data,
  * @ret rc             Return status code
  */
 int acpi_extract ( uint32_t signature, void *data,
-                  int ( * extract ) ( userptr_t zsdt, size_t len,
-                                      size_t offset, void *data ) ) {
-       struct acpi_fadt fadtab;
-       userptr_t fadt;
-       userptr_t dsdt;
-       userptr_t ssdt;
+                  int ( * extract ) ( const struct acpi_header *zsdt,
+                                      size_t len, size_t offset,
+                                      void *data ) ) {
+       const struct acpi_fadt *fadt;
+       const struct acpi_header *dsdt;
+       const struct acpi_header *ssdt;
        unsigned int i;
        int rc;
 
        /* Try DSDT first */
-       fadt = acpi_table ( FADT_SIGNATURE, 0 );
+       fadt = container_of ( acpi_table ( FADT_SIGNATURE, 0 ),
+                             struct acpi_fadt, acpi );
        if ( fadt ) {
-               copy_from_user ( &fadtab, fadt, 0, sizeof ( fadtab ) );
-               dsdt = phys_to_virt ( fadtab.dsdt );
+               dsdt = phys_to_virt ( fadt->dsdt );
                if ( ( rc = acpi_zsdt ( dsdt, signature, data,
                                        extract ) ) == 0 )
                        return 0;
index b9e2b7f616d005ee70005dd1594e7e6b30de9210..cdee1f8656ae725120a454b6d4ad65dc76bf78a5 100644 (file)
@@ -64,14 +64,15 @@ static int acpi_settings_applies ( struct settings *settings __unused,
 static int acpi_settings_fetch ( struct settings *settings,
                                 struct setting *setting,
                                 void *data, size_t len ) {
-       struct acpi_header acpi;
+       const struct acpi_header *acpi;
+       const uint8_t *src;
+       uint8_t *dst;
        uint32_t tag_high;
        uint32_t tag_low;
        uint32_t tag_signature;
        unsigned int tag_index;
        size_t tag_offset;
        size_t tag_len;
-       userptr_t table;
        size_t offset;
        size_t max_len;
        int delta;
@@ -88,15 +89,12 @@ static int acpi_settings_fetch ( struct settings *settings,
               acpi_name ( tag_signature ), tag_index, tag_offset, tag_len );
 
        /* Locate ACPI table */
-       table = acpi_table ( tag_signature, tag_index );
-       if ( ! table )
+       acpi = acpi_table ( tag_signature, tag_index );
+       if ( ! acpi )
                return -ENOENT;
 
-       /* Read table header */
-       copy_from_user ( &acpi, table, 0, sizeof ( acpi ) );
-
        /* Calculate starting offset and maximum available length */
-       max_len = le32_to_cpu ( acpi.length );
+       max_len = le32_to_cpu ( acpi->length );
        if ( tag_offset > max_len )
                return -ENOENT;
        offset = tag_offset;
@@ -115,10 +113,11 @@ static int acpi_settings_fetch ( struct settings *settings,
        }
 
        /* Read data */
+       src = ( ( ( const void * ) acpi ) + offset );
+       dst = data;
        for ( i = 0 ; ( ( i < max_len ) && ( i < len ) ) ; i++ ) {
-               copy_from_user ( data, table, offset, 1 );
-               data++;
-               offset += delta;
+               *(dst++) = *src;
+               src += delta;
        }
 
        /* Set type if not already specified */
index e0074ba43d8be86b0348be5b88357b3ff32148a0..11ac3243e36bcc4f721c2e44d3f00efdb81cc68d 100644 (file)
@@ -142,8 +142,9 @@ static struct acpimac_extractor acpimac_rtxmac = {
  * string that appears shortly after an "AMAC" or "MACA" signature.
  * This should work for most implementations encountered in practice.
  */
-static int acpimac_extract ( userptr_t zsdt, size_t len, size_t offset,
-                            void *data, struct acpimac_extractor *extractor ){
+static int acpimac_extract ( const struct acpi_header *zsdt, size_t len,
+                            size_t offset, void *data,
+                            struct acpimac_extractor *extractor ) {
        size_t prefix_len = strlen ( extractor->prefix );
        uint8_t *hw_addr = data;
        size_t skip = 0;
@@ -161,8 +162,8 @@ static int acpimac_extract ( userptr_t zsdt, size_t len, size_t offset,
              skip++ ) {
 
                /* Read value */
-               copy_from_user ( buf, zsdt, ( offset + skip ),
-                                sizeof ( buf ) );
+               memcpy ( buf, ( ( ( const void * ) zsdt ) + offset + skip ),
+                        sizeof ( buf ) );
 
                /* Check for expected format */
                if ( memcmp ( buf, extractor->prefix, prefix_len ) != 0 )
@@ -203,8 +204,8 @@ static int acpimac_extract ( userptr_t zsdt, size_t len, size_t offset,
  * @v data             Data buffer
  * @ret rc             Return status code
  */
-static int acpimac_extract_auxmac ( userptr_t zsdt, size_t len, size_t offset,
-                                   void *data ) {
+static int acpimac_extract_auxmac ( const struct acpi_header *zsdt,
+                                   size_t len, size_t offset, void *data ) {
 
        return acpimac_extract ( zsdt, len, offset, data, &acpimac_auxmac );
 }
@@ -218,8 +219,8 @@ static int acpimac_extract_auxmac ( userptr_t zsdt, size_t len, size_t offset,
  * @v data             Data buffer
  * @ret rc             Return status code
  */
-static int acpimac_extract_rtxmac ( userptr_t zsdt, size_t len, size_t offset,
-                                   void *data ) {
+static int acpimac_extract_rtxmac ( const struct acpi_header *zsdt,
+                                   size_t len, size_t offset, void *data ) {
 
        return acpimac_extract ( zsdt, len, offset, data, &acpimac_rtxmac );
 }
index cde5952b80ed48d7acef545e3f446ba962fad472..58d513e88b97e63dad9ece60be04fbe43dd72550 100644 (file)
@@ -46,49 +46,43 @@ static struct ecam_mapping ecam;
  */
 static int ecam_find ( uint32_t busdevfn, struct pci_range *range,
                       struct ecam_allocation *alloc ) {
-       struct ecam_allocation tmp;
+       struct ecam_table *mcfg;
+       struct ecam_allocation *tmp;
        unsigned int best = 0;
-       unsigned int offset;
        unsigned int count;
        unsigned int index;
-       userptr_t mcfg;
-       uint32_t length;
+       unsigned int i;
        uint32_t start;
 
        /* Return empty range on error */
        range->count = 0;
 
        /* Locate MCFG table */
-       mcfg = acpi_table ( ECAM_SIGNATURE, 0 );
+       mcfg = container_of ( acpi_table ( ECAM_SIGNATURE, 0 ),
+                             struct ecam_table, acpi );
        if ( ! mcfg ) {
                DBGC ( &ecam, "ECAM found no MCFG table\n" );
                return -ENOTSUP;
        }
 
-       /* Get length of table */
-       copy_from_user ( &length, mcfg,
-                        offsetof ( struct ecam_table, acpi.length ),
-                        sizeof ( length ) );
-
        /* Iterate over allocations */
-       for ( offset = offsetof ( struct ecam_table, alloc ) ;
-             ( offset + sizeof ( tmp ) ) <= le32_to_cpu ( length ) ;
-             offset += sizeof ( tmp ) ) {
+       for ( i = 0 ; ( offsetof ( typeof ( *mcfg ), alloc[ i + 1 ] ) <=
+                       le32_to_cpu ( mcfg->acpi.length ) ) ; i++ ) {
 
                /* Read allocation */
-               copy_from_user ( &tmp, mcfg, offset, sizeof ( tmp ) );
+               tmp = &mcfg->alloc[i];
                DBGC2 ( &ecam, "ECAM %04x:[%02x-%02x] has base %08llx\n",
-                       le16_to_cpu ( tmp.segment ), tmp.start, tmp.end,
-                       ( ( unsigned long long ) le64_to_cpu ( tmp.base ) ) );
-               start = PCI_BUSDEVFN ( le16_to_cpu ( tmp.segment ),
-                                      tmp.start, 0, 0 );
-               count = PCI_BUSDEVFN ( 0, ( tmp.end - tmp.start + 1 ), 0, 0 );
+                       le16_to_cpu ( tmp->segment ), tmp->start, tmp->end,
+                       ( ( unsigned long long ) le64_to_cpu ( tmp->base ) ) );
+               start = PCI_BUSDEVFN ( le16_to_cpu ( tmp->segment ),
+                                      tmp->start, 0, 0 );
+               count = PCI_BUSDEVFN ( 0, ( tmp->end - tmp->start + 1 ), 0, 0 );
 
                /* Check for a matching or new closest allocation */
                index = ( busdevfn - start );
                if ( ( index < count ) || ( index > best ) ) {
                        if ( alloc )
-                               memcpy ( alloc, &tmp, sizeof ( *alloc ) );
+                               memcpy ( alloc, tmp, sizeof ( *alloc ) );
                        range->start = start;
                        range->count = count;
                        best = index;
index c346812389ad96fc44d472fe8863f3df6f0cabc5..40a44cffcc8b9e505d1633610f80bf8aa55a93ed 100644 (file)
@@ -14,7 +14,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #include <ipxe/refcnt.h>
 #include <ipxe/list.h>
 #include <ipxe/interface.h>
-#include <ipxe/uaccess.h>
 #include <ipxe/tables.h>
 #include <ipxe/api.h>
 #include <config/general.h>
@@ -355,7 +354,8 @@ struct acpi_model {
 #define PROVIDE_ACPI_INLINE( _subsys, _api_func ) \
        PROVIDE_SINGLE_API_INLINE ( ACPI_PREFIX_ ## _subsys, _api_func )
 
-extern userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index );
+extern const struct acpi_header * acpi_find_via_rsdt ( uint32_t signature,
+                                                      unsigned int index );
 
 /* Include all architecture-independent ACPI API headers */
 #include <ipxe/null_acpi.h>
@@ -368,31 +368,35 @@ extern userptr_t acpi_find_via_rsdt ( uint32_t signature, unsigned int index );
 /**
  * Locate ACPI root system description table
  *
- * @ret rsdt           ACPI root system description table, or UNULL
+ * @ret rsdt           ACPI root system description table, or NULL
  */
-userptr_t acpi_find_rsdt ( void );
+const struct acpi_rsdt * acpi_find_rsdt ( void );
 
 /**
  * Locate ACPI table
  *
  * @v signature                Requested table signature
  * @v index            Requested index of table with this signature
- * @ret table          Table, or UNULL if not found
+ * @ret table          Table, or NULL if not found
  */
-userptr_t acpi_find ( uint32_t signature, unsigned int index );
+const struct acpi_header * acpi_find ( uint32_t signature,
+                                      unsigned int index );
 
 extern struct acpi_descriptor *
 acpi_describe ( struct interface *interface );
 #define acpi_describe_TYPE( object_type )                              \
        typeof ( struct acpi_descriptor * ( object_type ) )
 
-extern userptr_t ( * acpi_finder ) ( uint32_t signature, unsigned int index );
+extern const struct acpi_header * ( * acpi_finder ) ( uint32_t signature,
+                                                     unsigned int index );
 
 extern void acpi_fix_checksum ( struct acpi_header *acpi );
-extern userptr_t acpi_table ( uint32_t signature, unsigned int index );
+extern const struct acpi_header * acpi_table ( uint32_t signature,
+                                              unsigned int index );
 extern int acpi_extract ( uint32_t signature, void *data,
-                         int ( * extract ) ( userptr_t zsdt, size_t len,
-                                             size_t offset, void *data ) );
+                         int ( * extract ) ( const struct acpi_header *zsdt,
+                                             size_t len, size_t offset,
+                                             void *data ) );
 extern void acpi_add ( struct acpi_descriptor *desc );
 extern void acpi_del ( struct acpi_descriptor *desc );
 extern int acpi_install ( int ( * install ) ( struct acpi_header *acpi ) );
index a698863a6a9b073648710ff6493bb3e5b45528d9..68f9c5be739c4bd597ac7532cb2b2a39f97f3c02 100644 (file)
@@ -20,9 +20,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  *
  * @v signature                Requested table signature
  * @v index            Requested index of table with this signature
- * @ret table          Table, or UNULL if not found
+ * @ret table          Table, or NULL if not found
  */
-static inline __attribute__ (( always_inline )) userptr_t
+static inline __attribute__ (( always_inline )) const struct acpi_header *
 ACPI_INLINE ( efi, acpi_find ) ( uint32_t signature, unsigned int index ) {
 
        return acpi_find_via_rsdt ( signature, index );
index cedb02839eb06f785b3c5debf0ae9de875192b5d..18f05996419601d9d62c5019f9e8deb11df683cd 100644 (file)
@@ -9,17 +9,19 @@
 
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
+#include <stddef.h>
+
 #ifdef ACPI_NULL
 #define ACPI_PREFIX_null
 #else
 #define ACPI_PREFIX_null __null_
 #endif
 
-static inline __attribute__ (( always_inline )) userptr_t
+static inline __attribute__ (( always_inline )) const struct acpi_header *
 ACPI_INLINE ( null, acpi_find ) ( uint32_t signature __unused,
                                  unsigned int index __unused ) {
 
-       return UNULL;
+       return NULL;
 }
 
 #endif /* _IPXE_NULL_ACPI_H */
index c1046c01afacd5981ba004596aebe1a095a1302a..a2021a4f6cc0958c12f2f4e03026fef04c3de919 100644 (file)
@@ -31,6 +31,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  */
 
 #include <ipxe/acpi.h>
+#include <ipxe/uaccess.h>
 #include <ipxe/efi/efi.h>
 #include <ipxe/efi/Guid/Acpi.h>
 #include <ipxe/efi/efi_acpi.h>
@@ -42,15 +43,15 @@ EFI_USE_TABLE ( ACPI_10_TABLE, &rsdp, 0 );
 /**
  * Locate ACPI root system description table
  *
- * @ret rsdt           ACPI root system description table, or UNULL
+ * @ret rsdt           ACPI root system description table, or NULL
  */
-static userptr_t efi_find_rsdt ( void ) {
+static const struct acpi_rsdt * efi_find_rsdt ( void ) {
 
        /* Locate RSDT via ACPI configuration table, if available */
        if ( rsdp )
                return phys_to_virt ( rsdp->RsdtAddress );
 
-       return UNULL;
+       return NULL;
 }
 
 PROVIDE_ACPI ( efi, acpi_find_rsdt, efi_find_rsdt );
index 846db2f1f68755264cef1022af3b935c59e7ee02..a2a8bf12e2b9f50157c2e4ec6169b03d59059012 100644 (file)
@@ -42,7 +42,7 @@ struct linux_acpi_table {
        /** Index */
        unsigned int index;
        /** Cached data */
-       userptr_t data;
+       void *data;
 };
 
 /** List of cached ACPI tables */
@@ -53,9 +53,10 @@ static LIST_HEAD ( linux_acpi_tables );
  *
  * @v signature                Requested table signature
  * @v index            Requested index of table with this signature
- * @ret table          Table, or UNULL if not found
+ * @ret table          Table, or NULL if not found
  */
-static userptr_t linux_acpi_find ( uint32_t signature, unsigned int index ) {
+static const struct acpi_header * linux_acpi_find ( uint32_t signature,
+                                                   unsigned int index ) {
        struct linux_acpi_table *table;
        struct acpi_header *header;
        union {
@@ -121,7 +122,7 @@ static userptr_t linux_acpi_find ( uint32_t signature, unsigned int index ) {
  err_read:
        free ( table );
  err_alloc:
-       return UNULL;
+       return NULL;
 }
 
 /**
index 1ca5befaf27f97cb2c34da29203501163d2d7b0e..6e8840217116713fb8b7cf79db21adb433c4d2d8 100644 (file)
@@ -32,6 +32,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 /* Forcibly enable assertions */
 #undef NDEBUG
 
+#include <string.h>
 #include <ipxe/acpi.h>
 #include <ipxe/acpimac.h>
 #include <ipxe/if_ether.h>
@@ -185,26 +186,27 @@ static struct acpi_test_tables *acpi_test_tables;
  *
  * @v signature                Requested table signature
  * @v index            Requested index of table with this signature
- * @ret table          Table, or UNULL if not found
+ * @ret table          Table, or NULL if not found
  */
-static userptr_t acpi_test_find ( uint32_t signature, unsigned int index ) {
+static const struct acpi_header * acpi_test_find ( uint32_t signature,
+                                                  unsigned int index ) {
        struct acpi_test_table *table;
        unsigned int i;
 
        /* Fail if no test tables are installed */
        if ( ! acpi_test_tables )
-               return UNULL;
+               return NULL;
 
        /* Scan through test tables */
        for ( i = 0 ; i < acpi_test_tables->count ; i++ ) {
                table = acpi_test_tables->table[i];
                if ( ( signature == le32_to_cpu ( table->signature.raw ) ) &&
                     ( index-- == 0 ) ) {
-                       return virt_to_user ( table->data );
+                       return table->data;
                }
        }
 
-       return UNULL;
+       return NULL;
 }
 
 /** Override ACPI table finder */