Annotation of qemu/roms/seabios/src/biostables.c, revision 1.1.1.1

1.1       root        1: // Coreboot interface support.
                      2: //
                      3: // Copyright (C) 2008,2009  Kevin O'Connor <[email protected]>
                      4: //
                      5: // This file may be distributed under the terms of the GNU LGPLv3 license.
                      6: 
                      7: #include "config.h" // CONFIG_*
                      8: #include "util.h" // dprintf
                      9: #include "pci.h" // struct pir_header
                     10: #include "acpi.h" // struct rsdp_descriptor
                     11: #include "mptable.h" // MPTABLE_SIGNATURE
                     12: #include "smbios.h" // struct smbios_entry_point
                     13: 
                     14: void
                     15: copy_pir(void *pos)
                     16: {
                     17:     struct pir_header *p = pos;
                     18:     if (p->signature != PIR_SIGNATURE)
                     19:         return;
                     20:     if (PirOffset)
                     21:         return;
                     22:     if (p->size < sizeof(*p))
                     23:         return;
                     24:     if (checksum(pos, p->size) != 0)
                     25:         return;
                     26:     void *newpos = malloc_fseg(p->size);
                     27:     if (!newpos) {
                     28:         warn_noalloc();
                     29:         return;
                     30:     }
                     31:     dprintf(1, "Copying PIR from %p to %p\n", pos, newpos);
                     32:     memcpy(newpos, pos, p->size);
                     33:     PirOffset = (u32)newpos - BUILD_BIOS_ADDR;
                     34: }
                     35: 
                     36: void
                     37: copy_mptable(void *pos)
                     38: {
                     39:     struct mptable_floating_s *p = pos;
                     40:     if (p->signature != MPTABLE_SIGNATURE)
                     41:         return;
                     42:     if (!p->physaddr)
                     43:         return;
                     44:     if (checksum(pos, sizeof(*p)) != 0)
                     45:         return;
                     46:     u32 length = p->length * 16;
                     47:     u16 mpclength = ((struct mptable_config_s *)p->physaddr)->length;
                     48:     struct mptable_floating_s *newpos = malloc_fseg(length + mpclength);
                     49:     if (!newpos) {
                     50:         warn_noalloc();
                     51:         return;
                     52:     }
                     53:     dprintf(1, "Copying MPTABLE from %p/%x to %p\n", pos, p->physaddr, newpos);
                     54:     memcpy(newpos, pos, length);
                     55:     newpos->physaddr = (u32)newpos + length;
                     56:     newpos->checksum -= checksum(newpos, sizeof(*newpos));
                     57:     memcpy((void*)newpos + length, (void*)p->physaddr, mpclength);
                     58: }
                     59: 
                     60: void
                     61: copy_acpi_rsdp(void *pos)
                     62: {
                     63:     if (RsdpAddr)
                     64:         return;
                     65:     struct rsdp_descriptor *p = pos;
                     66:     if (p->signature != RSDP_SIGNATURE)
                     67:         return;
                     68:     u32 length = 20;
                     69:     if (checksum(pos, length) != 0)
                     70:         return;
                     71:     if (p->revision > 1) {
                     72:         length = p->length;
                     73:         if (checksum(pos, length) != 0)
                     74:             return;
                     75:     }
                     76:     void *newpos = malloc_fseg(length);
                     77:     if (!newpos) {
                     78:         warn_noalloc();
                     79:         return;
                     80:     }
                     81:     dprintf(1, "Copying ACPI RSDP from %p to %p\n", pos, newpos);
                     82:     memcpy(newpos, pos, length);
                     83:     RsdpAddr = newpos;
                     84: }
                     85: 
                     86: void
                     87: copy_smbios(void *pos)
                     88: {
                     89:     struct smbios_entry_point *p = pos;
                     90:     if (memcmp(p->anchor_string, "_SM_", 4))
                     91:         return;
                     92:     if (checksum(pos, 0x10) != 0)
                     93:         return;
                     94:     if (memcmp(p->intermediate_anchor_string, "_DMI_", 5))
                     95:         return;
                     96:     if (checksum(pos+0x10, p->length-0x10) != 0)
                     97:         return;
                     98:     struct smbios_entry_point *newpos = malloc_fseg(p->length);
                     99:     if (!newpos) {
                    100:         warn_noalloc();
                    101:         return;
                    102:     }
                    103:     dprintf(1, "Copying SMBIOS entry point from %p to %p\n", pos, newpos);
                    104:     memcpy(newpos, pos, p->length);
                    105: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.