GRUB-1.98 changes
[grub2/jjazz.git] / commands / i386 / pc / acpi.c
blob88e4f55cf604557351b36872b19cd70babf1c149
1 /* acpi.c - get acpi tables. */
2 /*
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2009 Free Software Foundation, Inc.
6 * GRUB is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * GRUB is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
20 #include <grub/acpi.h>
21 #include <grub/misc.h>
23 struct grub_acpi_rsdp_v10 *
24 grub_machine_acpi_get_rsdpv1 (void)
26 int ebda_len;
27 grub_uint8_t *ebda, *ptr;
29 grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n");
30 ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4);
31 ebda_len = * (grub_uint16_t *) ebda;
32 if (! ebda_len)
33 return 0;
34 for (ptr = ebda; ptr < ebda + 0x400; ptr += 16)
35 if (grub_memcmp (ptr, "RSD PTR ", 8) == 0
36 && grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0
37 && ((struct grub_acpi_rsdp_v10 *) ptr)->revision == 0)
38 return (struct grub_acpi_rsdp_v10 *) ptr;
40 grub_dprintf ("acpi", "Looking for RSDP. Scanning BIOS\n");
41 for (ptr = (grub_uint8_t *) 0xe0000; ptr < (grub_uint8_t *) 0x100000;
42 ptr += 16)
43 if (grub_memcmp (ptr, "RSD PTR ", 8) == 0
44 && grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0
45 && ((struct grub_acpi_rsdp_v10 *) ptr)->revision == 0)
46 return (struct grub_acpi_rsdp_v10 *) ptr;
47 return 0;
50 struct grub_acpi_rsdp_v20 *
51 grub_machine_acpi_get_rsdpv2 (void)
53 int ebda_len;
54 grub_uint8_t *ebda, *ptr;
56 grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n");
57 ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4);
58 ebda_len = * (grub_uint16_t *) ebda;
59 if (! ebda_len)
60 return 0;
61 for (ptr = ebda; ptr < ebda + 0x400; ptr += 16)
62 if (grub_memcmp (ptr, "RSD PTR ", 8) == 0
63 && grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0
64 && ((struct grub_acpi_rsdp_v10 *) ptr)->revision != 0
65 && ((struct grub_acpi_rsdp_v20 *) ptr)->length < 1024
66 && grub_byte_checksum (ptr, ((struct grub_acpi_rsdp_v20 *) ptr)->length)
67 == 0)
68 return (struct grub_acpi_rsdp_v20 *) ptr;
70 grub_dprintf ("acpi", "Looking for RSDP. Scanning BIOS\n");
71 for (ptr = (grub_uint8_t *) 0xe0000; ptr < (grub_uint8_t *) 0x100000;
72 ptr += 16)
73 if (grub_memcmp (ptr, "RSD PTR ", 8) == 0
74 && grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0
75 && ((struct grub_acpi_rsdp_v10 *) ptr)->revision != 0
76 && ((struct grub_acpi_rsdp_v20 *) ptr)->length < 1024
77 && grub_byte_checksum (ptr, ((struct grub_acpi_rsdp_v20 *) ptr)->length)
78 == 0)
79 return (struct grub_acpi_rsdp_v20 *) ptr;
80 return 0;