rsdp.c revision 76d05dc695b06c4e987bb8078f78032441e1430c
176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- * 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright 2009-2011 Erwan Velu - All Rights Reserved 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Permission is hereby granted, free of charge, to any person 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * obtaining a copy of this software and associated documentation 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * files (the "Software"), to deal in the Software without 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * restriction, including without limitation the rights to use, 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * copy, modify, merge, publish, distribute, sublicense, and/or 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * sell copies of the Software, and to permit persons to whom 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the Software is furnished to do so, subject to the following 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * conditions: 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The above copyright notice and this permission notice shall 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * be included in all copies or substantial portions of the Software. 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * OTHER DEALINGS IN THE SOFTWARE. 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdio.h> 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdlib.h> 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h> 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <memory.h> 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <dprintf.h> 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "acpi/acpi.h" 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint search_rsdp(s_acpi * acpi) 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Let's seach for RSDT table */ 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t *q; 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Let's start for the base address */ 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (q = (uint8_t *)RSDP_MIN_ADDRESS; q < (uint8_t *)RSDP_MAX_ADDRESS; q+=16 ) { 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Searching for RSDP with "RSD PTR" signature */ 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (memcmp(q, RSDP, sizeof(RSDP)-1) == 0) { 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman s_rsdp *r = &acpi->rsdp; 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman r->valid = true; 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman r->address = q; 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cp_str_struct(r->signature); 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cp_struct(&r->checksum); 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cp_str_struct(r->oem_id); 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cp_struct(&r->revision); 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cp_struct(&r->rsdt_address); 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cp_struct(&r->length); 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cp_struct(&r->xsdt_address); 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cp_struct(&r->extended_checksum); 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman q += 3; /* reserved field */ 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman acpi->rsdt.address = r->rsdt_address; 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman acpi->xsdt.address = r->xsdt_address; 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DEBUG_PRINT(("RSDT should be at %p\n",r->rsdt_address)); 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DEBUG_PRINT(("XSDT should be at %p\n",r->xsdt_address)); 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return RSDP_TABLE_FOUND; 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -RSDP_TABLE_FOUND; 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid print_rsdp(s_acpi * acpi) 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman s_rsdp *r = &acpi->rsdp; 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!r->valid) 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf("RSDP Table @ 0x%p\n", r->address); 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf(" signature : %s\n", r->signature); 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf(" checksum : %u\n", r->checksum); 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf(" oem id : %s\n", r->oem_id); 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf(" revision : %u\n", r->revision); 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf(" RDST address : %p\n", r->rsdt_address); 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf(" length : %u\n", r->length); 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf(" XSDT address : %p\n", r->xsdt_address); 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf(" extended checksum : %u\n", r->extended_checksum); 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 83