2 * As we have seek, this implementation can be straightforward.
3 * 2003-07 by SONE Takeshi
7 #include "kernel/kernel.h"
10 #define CONFIG_SPARC64_PAGE_SIZE_8KB
13 /* NextStep bootloader on SPARC32 expects the a.out header directly
14 below load-base (0x4000) */
16 #define AOUT_HEADER_COPY
19 #include "libopenbios/sys_info.h"
20 #include "libopenbios/bindings.h"
21 #include "libopenbios/aout_load.h"
22 #include "libc/diskio.h"
26 #define addr_fixup(addr) ((addr) & 0x00ffffff)
28 static char *image_name, *image_version;
32 check_mem_ranges(struct sys_info *info,
38 unsigned long prog_start, prog_end;
41 prog_start = virt_to_phys(&_start);
42 prog_end = virt_to_phys(&_end);
46 if (start < prog_start && end > prog_start)
48 if (start < prog_end && end > prog_end)
51 for (j = 0; j < info->n_memranges; j++) {
52 if (mem[j].base <= start && mem[j].base + mem[j].size >= end)
55 if (j >= info->n_memranges)
60 printf("%s occupies [%#lx-%#lx]\n", program_name, prog_start, prog_end);
63 printf("A.out file [%#lx-%#lx] doesn't fit into memory\n", start, end - 1);
68 is_aout(struct exec *ehdr)
70 return ((ehdr->a_info & 0xffff) == OMAGIC
71 || (ehdr->a_info & 0xffff) == NMAGIC
72 || (ehdr->a_info & 0xffff) == ZMAGIC
73 || (ehdr->a_info & 0xffff) == QMAGIC);
77 aout_load(struct sys_info *info, ihandle_t dev)
81 unsigned long start, size;
84 image_name = image_version = NULL;
86 /* Mark the saved-program-state as invalid */
87 feval("0 state-valid !");
94 for (offset = 0; offset < 16 * 512; offset += 512) {
96 if (read_io(fd, &ehdr, sizeof ehdr) != sizeof ehdr) {
97 debug("Can't read a.out header\n");
98 retval = LOADER_NOT_SUPPORT;
105 if (!is_aout(&ehdr)) {
106 debug("Not a bootable a.out image\n");
107 retval = LOADER_NOT_SUPPORT;
111 if (ehdr.a_text == 0x30800007)
114 if (N_MAGIC(ehdr) == NMAGIC) {
115 size = addr_fixup(N_DATADDR(ehdr)) + addr_fixup(ehdr.a_data);
117 size = addr_fixup(ehdr.a_text) + addr_fixup(ehdr.a_data);
124 start = POP(); // N_TXTADDR(ehdr);
126 if (!check_mem_ranges(info, start, size))
129 printf("Loading a.out %s...\n", image_name ? image_name : "image");
131 seek_io(fd, offset + N_TXTOFF(ehdr));
133 if (N_MAGIC(ehdr) == NMAGIC) {
134 if ((size_t)read_io(fd, (void *)start, ehdr.a_text) != ehdr.a_text) {
135 printf("Can't read program text segment (size 0x" FMT_aout_ehdr ")\n", ehdr.a_text);
138 if ((size_t)read_io(fd, (void *)(start + N_DATADDR(ehdr)), ehdr.a_data) != ehdr.a_data) {
139 printf("Can't read program data segment (size 0x" FMT_aout_ehdr ")\n", ehdr.a_data);
143 if ((size_t)read_io(fd, (void *)start, size) != size) {
144 printf("Can't read program (size 0x" FMT_sizet ")\n", size);
149 debug("Loaded %lu bytes\n", size);
150 debug("entry point is %#lx\n", start);
152 #ifdef AOUT_HEADER_COPY
153 // Copy the a.out header just before start
154 memcpy((char *)(start - 0x20), &ehdr, 0x20);
157 // Initialise saved-program-state
158 PUSH(addr_fixup(start));
159 feval("saved-program-state >sps.entry !");
161 feval("saved-program-state >sps.file-size !");
162 feval("aout saved-program-state >sps.file-type !");
164 feval("-1 state-valid !");
172 aout_init_program(void)
174 // Currently not implemented
175 feval("0 state-valid !");