Changeset bf05c74 in mainline for kernel/genarch/src/acpi/acpi.c


Ignore:
Timestamp:
2018-10-24T17:59:50Z (5 years ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5c38838, 889cdb1
Parents:
cfdeedc
Message:

Fix kernel ubsan

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/acpi/acpi.c

    rcfdeedc rbf05c74  
    4343#include <mm/km.h>
    4444#include <log.h>
     45#include <mem.h>
    4546
    4647#define RSDP_SIGNATURE      "RSD PTR "
     
    170171}
    171172
     173static uint8_t *search_rsdp(uint8_t *base, size_t len)
     174{
     175        for (size_t i = 0; i < len; i += 16) {
     176                if (memcmp(&base[i], RSDP_SIGNATURE, sizeof(RSDP_SIGNATURE)) == 0 &&
     177                    rsdp_check(&base[i]))
     178                        return &base[i];
     179        }
     180
     181        return NULL;
     182}
     183
    172184void acpi_init(void)
    173185{
    174         uint8_t *addr[2] = { NULL, (uint8_t *) PA2KA(0xe0000) };
    175         unsigned int i;
    176         unsigned int j;
    177         unsigned int length[2] = { 1024, 128 * 1024 };
    178         uint64_t *sig = (uint64_t *) RSDP_SIGNATURE;
    179 
    180186        /*
    181187         * Find Root System Description Pointer
     
    184190         */
    185191
    186         addr[0] = (uint8_t *) PA2KA(ebda);
    187         for (i = (ebda ? 0 : 1); i < 2; i++) {
    188                 for (j = 0; j < length[i]; j += 16) {
    189                         if ((*((uint64_t *) &addr[i][j]) == *sig) &&
    190                             (rsdp_check(&addr[i][j]))) {
    191                                 acpi_rsdp = (struct acpi_rsdp *) &addr[i][j];
    192                                 goto rsdp_found;
    193                         }
    194                 }
    195         }
    196 
    197         return;
    198 
    199 rsdp_found:
     192        uint8_t *rsdp = NULL;
     193
     194        if (ebda)
     195                rsdp = search_rsdp((uint8_t *) PA2KA(ebda), 1024);
     196
     197        if (!rsdp)
     198                rsdp = search_rsdp((uint8_t *) PA2KA(0xe0000), 128 * 1024);
     199
     200        if (!rsdp)
     201                return;
     202
     203        acpi_rsdp = (struct acpi_rsdp *) rsdp;
     204
    200205        LOG("%p: ACPI Root System Description Pointer", acpi_rsdp);
    201206
Note: See TracChangeset for help on using the changeset viewer.