Annotation of qemu/roms/openbios/libopenbios/elf_info.c, revision 1.1.1.1

1.1       root        1: /* Support for ELF Boot Proposal as a boot image */
                      2: #include "config.h"
                      3: #include "arch/common/elf_boot.h"
                      4: #include "libopenbios/sys_info.h"
                      5: #include "asm/io.h"
                      6: #include "libopenbios/ipchecksum.h"
                      7: #include "openbios-version.h"
                      8: #define printf printk
                      9: #define debug  printk
                     10: 
                     11: /* ELF image notes provide information to the loader who boots us */
                     12: 
                     13: /* This compiles and generates correct PT_NOTE segment for me.
                     14:  * If it doesn't, use assembly version below. */
                     15: 
                     16: struct elf_image_note {
                     17:     Elf_Nhdr hdr0;
                     18:     char name0[sizeof(ELF_NOTE_BOOT)];
                     19:     char prog_name[sizeof(PROGRAM_NAME)];
                     20: 
                     21:     Elf_Nhdr hdr1;
                     22:     char name1[sizeof(ELF_NOTE_BOOT)];
                     23:     char version[sizeof(OPENBIOS_VERSION_STR)];
                     24: 
                     25:     Elf_Nhdr hdr2;
                     26:     char name2[sizeof(ELF_NOTE_BOOT)];
                     27:     unsigned short checksum;
                     28: };
                     29: 
                     30: const struct elf_image_note elf_image_notes
                     31:        __attribute__ ((section (".note.ELFBoot"))) =
                     32: {
                     33:     .hdr0 = {
                     34:        .n_namesz = sizeof(ELF_NOTE_BOOT),
                     35:        .n_descsz = sizeof(PROGRAM_NAME),
                     36:        .n_type = EIN_PROGRAM_NAME,
                     37:     },
                     38:     .name0 = ELF_NOTE_BOOT,
                     39:     .prog_name = PROGRAM_NAME,
                     40: 
                     41:     .hdr1 = {
                     42:        .n_namesz = sizeof(ELF_NOTE_BOOT),
                     43:         .n_descsz = sizeof(OPENBIOS_VERSION_STR),
                     44:        .n_type = EIN_PROGRAM_VERSION,
                     45:     },
                     46:     .name1 = ELF_NOTE_BOOT,
                     47:     .version = OPENBIOS_VERSION_STR,
                     48: 
                     49:     .hdr2 = {
                     50:        .n_namesz = sizeof(ELF_NOTE_BOOT),
                     51:        .n_descsz = sizeof(unsigned short),
                     52:        .n_type = EIN_PROGRAM_CHECKSUM,
                     53:     },
                     54:     .name2 = ELF_NOTE_BOOT,
                     55:     .checksum = 0, /* to be computed by external tool */
                     56: };
                     57: 
                     58: /* This is refered by other files */
                     59: const char *program_name = elf_image_notes.prog_name;
                     60: const char *program_version = elf_image_notes.version;
                     61: 
                     62: #if 0
                     63: 
                     64:        /* This tells the linker to make a PT_NOTE segment.
                     65:         * If the section is named just ".note", it will be
                     66:         * mixed up with useless .version notes generated by GCC.
                     67:         */
                     68:        .section ".note.ELFBoot", "a"
                     69: 
                     70:        .align 4
                     71:        .int 2f - 1f
                     72:        .int 4f - 3f
                     73:        .int EIN_PROGRAM_NAME
                     74: 1:     .asciz "ELFBoot"
                     75: 2:     .align 4
                     76: 3:     .asciz PROGRAM_NAME
                     77: 4:
                     78: 
                     79:        .align 4
                     80:        .int 2f - 1f
                     81:        .int 4f - 3f
                     82:        .int EIN_PROGRAM_VERSION
                     83: 1:     .asciz "ELFBoot"
                     84: 2:     .align 4
                     85: 3:      .asciz OPENBIOS_VERSION_STR
                     86: 4:
                     87: 
                     88:        .align 4
                     89:        .int 2f - 1f
                     90:        .int 4f - 3f
                     91:        .int EIN_PROGRAM_CHECKSUM
                     92: 1:     .asciz "ELFBoot"
                     93: 2:     .align 4
                     94: 3:     .short 0
                     95: 4:
                     96: #endif
                     97: 
                     98: /* Collect information from the ELF bootloader
                     99:  * Note that we have to copy them to our own memory,
                    100:  * otherwise they might be overwritten afterward. */
                    101: void collect_elfboot_info(struct sys_info *info)
                    102: {
                    103:     Elf_Bhdr *hdr = NULL;
                    104:     char *addr, *end;
                    105:     Elf_Nhdr *nhdr;
                    106:     char *desc;
                    107: 
                    108:     if (info->boot_type == ELF_BHDR_MAGIC)
                    109:        hdr = phys_to_virt(info->boot_data);
                    110:     else
                    111:        hdr = phys_to_virt(info->boot_arg);
                    112: 
                    113:     if (hdr->b_signature != ELF_BHDR_MAGIC)
                    114:        return;
                    115: 
                    116:     if (ipchksum(hdr, hdr->b_size) != 0) {
                    117:        printf("Broken ELF boot notes\n");
                    118:        return;
                    119:     }
                    120: 
                    121:     addr = (char *) (hdr + 1);
                    122:     end = addr + hdr->b_size;
                    123:     while (addr <  end) {
                    124:        nhdr = (Elf_Nhdr *) addr;
                    125:        addr += sizeof(Elf_Nhdr);
                    126:        addr += (nhdr->n_namesz + 3) & ~3;
                    127:        desc = addr;
                    128:        addr += (nhdr->n_descsz + 3) & ~3;
                    129: 
                    130:        if (nhdr->n_namesz == 0) {
                    131:            /* Standard notes */
                    132:            switch (nhdr->n_type) {
                    133:            case EBN_FIRMWARE_TYPE:
                    134:                info->firmware = strdup(desc);
                    135:                break;
                    136:            case EBN_BOOTLOADER_NAME:
                    137:                debug("Bootloader: %s\n", desc);
                    138:                break;
                    139:            case EBN_BOOTLOADER_VERSION:
                    140:                debug("Version: %s\n", desc);
                    141:                break;
                    142:            case EBN_COMMAND_LINE:
                    143:                info->command_line = strdup(desc);
                    144:                break;
                    145:            case EBN_LOADED_IMAGE:
                    146:                debug("Image name: %s\n", desc);
                    147:                break;
                    148:            }
                    149:        }
                    150:     }
                    151: }

unix.superglobalmegacorp.com

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