1 /* Support for ELF Boot Proposal as a boot image */
3 #include "arch/common/elf_boot.h"
4 #include "libopenbios/sys_info.h"
6 #include "libopenbios/ipchecksum.h"
7 #include "openbios-version.h"
11 /* ELF image notes provide information to the loader who boots us */
13 /* This compiles and generates correct PT_NOTE segment for me.
14 * If it doesn't, use assembly version below. */
16 struct elf_image_note
{
18 char name0
[sizeof(ELF_NOTE_BOOT
)];
19 char prog_name
[sizeof(PROGRAM_NAME
)];
22 char name1
[sizeof(ELF_NOTE_BOOT
)];
23 char version
[sizeof(OPENBIOS_VERSION_STR
)];
26 char name2
[sizeof(ELF_NOTE_BOOT
)];
27 unsigned short checksum
;
30 const struct elf_image_note elf_image_notes
31 __attribute__ ((section (".note.ELFBoot"))) =
34 .n_namesz
= sizeof(ELF_NOTE_BOOT
),
35 .n_descsz
= sizeof(PROGRAM_NAME
),
36 .n_type
= EIN_PROGRAM_NAME
,
38 .name0
= ELF_NOTE_BOOT
,
39 .prog_name
= PROGRAM_NAME
,
42 .n_namesz
= sizeof(ELF_NOTE_BOOT
),
43 .n_descsz
= sizeof(OPENBIOS_VERSION_STR
),
44 .n_type
= EIN_PROGRAM_VERSION
,
46 .name1
= ELF_NOTE_BOOT
,
47 .version
= OPENBIOS_VERSION_STR
,
50 .n_namesz
= sizeof(ELF_NOTE_BOOT
),
51 .n_descsz
= sizeof(unsigned short),
52 .n_type
= EIN_PROGRAM_CHECKSUM
,
54 .name2
= ELF_NOTE_BOOT
,
55 .checksum
= 0, /* to be computed by external tool */
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
;
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.
68 .section
".note.ELFBoot", "a"
76 3: .asciz PROGRAM_NAME
82 .int EIN_PROGRAM_VERSION
85 3: .asciz OPENBIOS_VERSION_STR
91 .int EIN_PROGRAM_CHECKSUM
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
)
103 Elf_Bhdr
*hdr
= NULL
;
108 if (info
->boot_type
== ELF_BHDR_MAGIC
)
109 hdr
= phys_to_virt(info
->boot_data
);
111 hdr
= phys_to_virt(info
->boot_arg
);
113 if (hdr
->b_signature
!= ELF_BHDR_MAGIC
)
116 if (ipchksum(hdr
, hdr
->b_size
) != 0) {
117 printf("Broken ELF boot notes\n");
121 addr
= (char *) (hdr
+ 1);
122 end
= addr
+ hdr
->b_size
;
124 nhdr
= (Elf_Nhdr
*) addr
;
125 addr
+= sizeof(Elf_Nhdr
);
126 addr
+= (nhdr
->n_namesz
+ 3) & ~3;
128 addr
+= (nhdr
->n_descsz
+ 3) & ~3;
130 if (nhdr
->n_namesz
== 0) {
132 switch (nhdr
->n_type
) {
133 case EBN_FIRMWARE_TYPE
:
134 info
->firmware
= strdup(desc
);
136 case EBN_BOOTLOADER_NAME
:
137 debug("Bootloader: %s\n", desc
);
139 case EBN_BOOTLOADER_VERSION
:
140 debug("Version: %s\n", desc
);
142 case EBN_COMMAND_LINE
:
143 info
->command_line
= strdup(desc
);
145 case EBN_LOADED_IMAGE
:
146 debug("Image name: %s\n", desc
);