Commit b37837317fb3177755c592591d7f53826c6afae5
1 parent
5fe141fd
use generic ELF loader
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1832 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
13 additions
and
427 deletions
hw/elf_ops.h deleted
100644 → 0
1 | -#ifdef BSWAP_NEEDED | ||
2 | -static void glue(bswap_ehdr, SZ)(struct elfhdr *ehdr) | ||
3 | -{ | ||
4 | - bswap16s(&ehdr->e_type); /* Object file type */ | ||
5 | - bswap16s(&ehdr->e_machine); /* Architecture */ | ||
6 | - bswap32s(&ehdr->e_version); /* Object file version */ | ||
7 | - bswapSZs(&ehdr->e_entry); /* Entry point virtual address */ | ||
8 | - bswapSZs(&ehdr->e_phoff); /* Program header table file offset */ | ||
9 | - bswapSZs(&ehdr->e_shoff); /* Section header table file offset */ | ||
10 | - bswap32s(&ehdr->e_flags); /* Processor-specific flags */ | ||
11 | - bswap16s(&ehdr->e_ehsize); /* ELF header size in bytes */ | ||
12 | - bswap16s(&ehdr->e_phentsize); /* Program header table entry size */ | ||
13 | - bswap16s(&ehdr->e_phnum); /* Program header table entry count */ | ||
14 | - bswap16s(&ehdr->e_shentsize); /* Section header table entry size */ | ||
15 | - bswap16s(&ehdr->e_shnum); /* Section header table entry count */ | ||
16 | - bswap16s(&ehdr->e_shstrndx); /* Section header string table index */ | ||
17 | -} | ||
18 | - | ||
19 | -static void glue(bswap_phdr, SZ)(struct elf_phdr *phdr) | ||
20 | -{ | ||
21 | - bswap32s(&phdr->p_type); /* Segment type */ | ||
22 | - bswapSZs(&phdr->p_offset); /* Segment file offset */ | ||
23 | - bswapSZs(&phdr->p_vaddr); /* Segment virtual address */ | ||
24 | - bswapSZs(&phdr->p_paddr); /* Segment physical address */ | ||
25 | - bswapSZs(&phdr->p_filesz); /* Segment size in file */ | ||
26 | - bswapSZs(&phdr->p_memsz); /* Segment size in memory */ | ||
27 | - bswap32s(&phdr->p_flags); /* Segment flags */ | ||
28 | - bswapSZs(&phdr->p_align); /* Segment alignment */ | ||
29 | -} | ||
30 | - | ||
31 | -static void glue(bswap_shdr, SZ)(struct elf_shdr *shdr) | ||
32 | -{ | ||
33 | - bswap32s(&shdr->sh_name); | ||
34 | - bswap32s(&shdr->sh_type); | ||
35 | - bswapSZs(&shdr->sh_flags); | ||
36 | - bswapSZs(&shdr->sh_addr); | ||
37 | - bswapSZs(&shdr->sh_offset); | ||
38 | - bswapSZs(&shdr->sh_size); | ||
39 | - bswap32s(&shdr->sh_link); | ||
40 | - bswap32s(&shdr->sh_info); | ||
41 | - bswapSZs(&shdr->sh_addralign); | ||
42 | - bswapSZs(&shdr->sh_entsize); | ||
43 | -} | ||
44 | - | ||
45 | -static void glue(bswap_sym, SZ)(struct elf_sym *sym) | ||
46 | -{ | ||
47 | - bswap32s(&sym->st_name); | ||
48 | - bswapSZs(&sym->st_value); | ||
49 | - bswapSZs(&sym->st_size); | ||
50 | - bswap16s(&sym->st_shndx); | ||
51 | -} | ||
52 | -#endif | ||
53 | - | ||
54 | -static int glue(find_phdr, SZ)(struct elfhdr *ehdr, int fd, struct elf_phdr *phdr, elf_word type) | ||
55 | -{ | ||
56 | - int i, retval; | ||
57 | - | ||
58 | - retval = lseek(fd, ehdr->e_phoff, SEEK_SET); | ||
59 | - if (retval < 0) | ||
60 | - return -1; | ||
61 | - | ||
62 | - for (i = 0; i < ehdr->e_phnum; i++) { | ||
63 | - retval = read(fd, phdr, sizeof(*phdr)); | ||
64 | - if (retval < 0) | ||
65 | - return -1; | ||
66 | - glue(bswap_phdr, SZ)(phdr); | ||
67 | - if (phdr->p_type == type) | ||
68 | - return 0; | ||
69 | - } | ||
70 | - return -1; | ||
71 | -} | ||
72 | - | ||
73 | -static void * glue(find_shdr, SZ)(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, elf_word type) | ||
74 | -{ | ||
75 | - int i, retval; | ||
76 | - | ||
77 | - retval = lseek(fd, ehdr->e_shoff, SEEK_SET); | ||
78 | - if (retval < 0) | ||
79 | - return NULL; | ||
80 | - | ||
81 | - for (i = 0; i < ehdr->e_shnum; i++) { | ||
82 | - retval = read(fd, shdr, sizeof(*shdr)); | ||
83 | - if (retval < 0) | ||
84 | - return NULL; | ||
85 | - glue(bswap_shdr, SZ)(shdr); | ||
86 | - if (shdr->sh_type == type) | ||
87 | - return qemu_malloc(shdr->sh_size); | ||
88 | - } | ||
89 | - return NULL; | ||
90 | -} | ||
91 | - | ||
92 | -static void * glue(find_strtab, SZ)(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, struct elf_shdr *symtab) | ||
93 | -{ | ||
94 | - int retval; | ||
95 | - | ||
96 | - retval = lseek(fd, ehdr->e_shoff + sizeof(struct elf_shdr) * symtab->sh_link, SEEK_SET); | ||
97 | - if (retval < 0) | ||
98 | - return NULL; | ||
99 | - | ||
100 | - retval = read(fd, shdr, sizeof(*shdr)); | ||
101 | - if (retval < 0) | ||
102 | - return NULL; | ||
103 | - glue(bswap_shdr, SZ)(shdr); | ||
104 | - if (shdr->sh_type == SHT_STRTAB) | ||
105 | - return qemu_malloc(shdr->sh_size);; | ||
106 | - return NULL; | ||
107 | -} | ||
108 | - | ||
109 | -static int glue(read_program, SZ)(int fd, struct elf_phdr *phdr, void *dst, elf_word entry) | ||
110 | -{ | ||
111 | - int retval; | ||
112 | - retval = lseek(fd, phdr->p_offset + entry - phdr->p_vaddr, SEEK_SET); | ||
113 | - if (retval < 0) | ||
114 | - return -1; | ||
115 | - return read(fd, dst, phdr->p_filesz); | ||
116 | -} | ||
117 | - | ||
118 | -static int glue(read_section, SZ)(int fd, struct elf_shdr *s, void *dst) | ||
119 | -{ | ||
120 | - int retval; | ||
121 | - | ||
122 | - retval = lseek(fd, s->sh_offset, SEEK_SET); | ||
123 | - if (retval < 0) | ||
124 | - return -1; | ||
125 | - retval = read(fd, dst, s->sh_size); | ||
126 | - if (retval < 0) | ||
127 | - return -1; | ||
128 | - return 0; | ||
129 | -} | ||
130 | - | ||
131 | -static void * glue(process_section, SZ)(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, elf_word type) | ||
132 | -{ | ||
133 | - void *dst; | ||
134 | - | ||
135 | - dst = glue(find_shdr, SZ)(ehdr, fd, shdr, type); | ||
136 | - if (!dst) | ||
137 | - goto error; | ||
138 | - | ||
139 | - if (glue(read_section, SZ)(fd, shdr, dst)) | ||
140 | - goto error; | ||
141 | - return dst; | ||
142 | - error: | ||
143 | - qemu_free(dst); | ||
144 | - return NULL; | ||
145 | -} | ||
146 | - | ||
147 | -static void * glue(process_strtab, SZ)(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, struct elf_shdr *symtab) | ||
148 | -{ | ||
149 | - void *dst; | ||
150 | - | ||
151 | - dst = glue(find_strtab, SZ)(ehdr, fd, shdr, symtab); | ||
152 | - if (!dst) | ||
153 | - goto error; | ||
154 | - | ||
155 | - if (glue(read_section, SZ)(fd, shdr, dst)) | ||
156 | - goto error; | ||
157 | - return dst; | ||
158 | - error: | ||
159 | - qemu_free(dst); | ||
160 | - return NULL; | ||
161 | -} | ||
162 | - | ||
163 | -static void glue(load_symbols, SZ)(struct elfhdr *ehdr, int fd) | ||
164 | -{ | ||
165 | - struct elf_shdr symtab, strtab; | ||
166 | - struct elf_sym *syms; | ||
167 | -#if (SZ == 64) | ||
168 | - struct elf32_sym *syms32; | ||
169 | -#endif | ||
170 | - struct syminfo *s; | ||
171 | - int nsyms, i; | ||
172 | - char *str; | ||
173 | - | ||
174 | - /* Symbol table */ | ||
175 | - syms = glue(process_section, SZ)(ehdr, fd, &symtab, SHT_SYMTAB); | ||
176 | - if (!syms) | ||
177 | - return; | ||
178 | - | ||
179 | - nsyms = symtab.sh_size / sizeof(struct elf_sym); | ||
180 | -#if (SZ == 64) | ||
181 | - syms32 = qemu_mallocz(nsyms * sizeof(struct elf32_sym)); | ||
182 | -#endif | ||
183 | - for (i = 0; i < nsyms; i++) { | ||
184 | - glue(bswap_sym, SZ)(&syms[i]); | ||
185 | -#if (SZ == 64) | ||
186 | - syms32[i].st_name = syms[i].st_name; | ||
187 | - syms32[i].st_info = syms[i].st_info; | ||
188 | - syms32[i].st_other = syms[i].st_other; | ||
189 | - syms32[i].st_shndx = syms[i].st_shndx; | ||
190 | - syms32[i].st_value = syms[i].st_value & 0xffffffff; | ||
191 | - syms32[i].st_size = syms[i].st_size & 0xffffffff; | ||
192 | -#endif | ||
193 | - } | ||
194 | - /* String table */ | ||
195 | - str = glue(process_strtab, SZ)(ehdr, fd, &strtab, &symtab); | ||
196 | - if (!str) | ||
197 | - goto error_freesyms; | ||
198 | - | ||
199 | - /* Commit */ | ||
200 | - s = qemu_mallocz(sizeof(*s)); | ||
201 | -#if (SZ == 64) | ||
202 | - s->disas_symtab = syms32; | ||
203 | - qemu_free(syms); | ||
204 | -#else | ||
205 | - s->disas_symtab = syms; | ||
206 | -#endif | ||
207 | - s->disas_num_syms = nsyms; | ||
208 | - s->disas_strtab = str; | ||
209 | - s->next = syminfos; | ||
210 | - syminfos = s; | ||
211 | - return; | ||
212 | - error_freesyms: | ||
213 | -#if (SZ == 64) | ||
214 | - qemu_free(syms32); | ||
215 | -#endif | ||
216 | - qemu_free(syms); | ||
217 | - return; | ||
218 | -} |
hw/magic-load.c deleted
100644 → 0
1 | -#include "vl.h" | ||
2 | -#include "disas.h" | ||
3 | -#include "exec-all.h" | ||
4 | - | ||
5 | -struct exec | ||
6 | -{ | ||
7 | - uint32_t a_info; /* Use macros N_MAGIC, etc for access */ | ||
8 | - uint32_t a_text; /* length of text, in bytes */ | ||
9 | - uint32_t a_data; /* length of data, in bytes */ | ||
10 | - uint32_t a_bss; /* length of uninitialized data area, in bytes */ | ||
11 | - uint32_t a_syms; /* length of symbol table data in file, in bytes */ | ||
12 | - uint32_t a_entry; /* start address */ | ||
13 | - uint32_t a_trsize; /* length of relocation info for text, in bytes */ | ||
14 | - uint32_t a_drsize; /* length of relocation info for data, in bytes */ | ||
15 | -}; | ||
16 | - | ||
17 | -#ifdef BSWAP_NEEDED | ||
18 | -static void bswap_ahdr(struct exec *e) | ||
19 | -{ | ||
20 | - bswap32s(&e->a_info); | ||
21 | - bswap32s(&e->a_text); | ||
22 | - bswap32s(&e->a_data); | ||
23 | - bswap32s(&e->a_bss); | ||
24 | - bswap32s(&e->a_syms); | ||
25 | - bswap32s(&e->a_entry); | ||
26 | - bswap32s(&e->a_trsize); | ||
27 | - bswap32s(&e->a_drsize); | ||
28 | -} | ||
29 | -#else | ||
30 | -#define bswap_ahdr(x) do { } while (0) | ||
31 | -#endif | ||
32 | - | ||
33 | -#define N_MAGIC(exec) ((exec).a_info & 0xffff) | ||
34 | -#define OMAGIC 0407 | ||
35 | -#define NMAGIC 0410 | ||
36 | -#define ZMAGIC 0413 | ||
37 | -#define QMAGIC 0314 | ||
38 | -#define _N_HDROFF(x) (1024 - sizeof (struct exec)) | ||
39 | -#define N_TXTOFF(x) \ | ||
40 | - (N_MAGIC(x) == ZMAGIC ? _N_HDROFF((x)) + sizeof (struct exec) : \ | ||
41 | - (N_MAGIC(x) == QMAGIC ? 0 : sizeof (struct exec))) | ||
42 | -#define N_TXTADDR(x) (N_MAGIC(x) == QMAGIC ? TARGET_PAGE_SIZE : 0) | ||
43 | -#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text) | ||
44 | -#define _N_SEGMENT_ROUND(x) (((x) + TARGET_PAGE_SIZE - 1) & ~(TARGET_PAGE_SIZE - 1)) | ||
45 | - | ||
46 | -#define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text) | ||
47 | - | ||
48 | -#define N_DATADDR(x) \ | ||
49 | - (N_MAGIC(x)==OMAGIC? (_N_TXTENDADDR(x)) \ | ||
50 | - : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x)))) | ||
51 | - | ||
52 | - | ||
53 | -#define ELF_CLASS ELFCLASS32 | ||
54 | -#define ELF_DATA ELFDATA2MSB | ||
55 | -#define ELF_ARCH EM_SPARC | ||
56 | - | ||
57 | -#include "elf.h" | ||
58 | - | ||
59 | -#ifndef BSWAP_NEEDED | ||
60 | -#define bswap_ehdr32(e) do { } while (0) | ||
61 | -#define bswap_phdr32(e) do { } while (0) | ||
62 | -#define bswap_shdr32(e) do { } while (0) | ||
63 | -#define bswap_sym32(e) do { } while (0) | ||
64 | -#ifdef TARGET_SPARC64 | ||
65 | -#define bswap_ehdr64(e) do { } while (0) | ||
66 | -#define bswap_phdr64(e) do { } while (0) | ||
67 | -#define bswap_shdr64(e) do { } while (0) | ||
68 | -#define bswap_sym64(e) do { } while (0) | ||
69 | -#endif | ||
70 | -#endif | ||
71 | - | ||
72 | -#define SZ 32 | ||
73 | -#define elf_word uint32_t | ||
74 | -#define bswapSZs bswap32s | ||
75 | -#include "elf_ops.h" | ||
76 | - | ||
77 | -#ifdef TARGET_SPARC64 | ||
78 | -#undef elfhdr | ||
79 | -#undef elf_phdr | ||
80 | -#undef elf_shdr | ||
81 | -#undef elf_sym | ||
82 | -#undef elf_note | ||
83 | -#undef elf_word | ||
84 | -#undef bswapSZs | ||
85 | -#undef SZ | ||
86 | -#define elfhdr elf64_hdr | ||
87 | -#define elf_phdr elf64_phdr | ||
88 | -#define elf_note elf64_note | ||
89 | -#define elf_shdr elf64_shdr | ||
90 | -#define elf_sym elf64_sym | ||
91 | -#define elf_word uint64_t | ||
92 | -#define bswapSZs bswap64s | ||
93 | -#define SZ 64 | ||
94 | -#include "elf_ops.h" | ||
95 | -#endif | ||
96 | - | ||
97 | -int load_elf(const char *filename, uint8_t *addr) | ||
98 | -{ | ||
99 | - struct elf32_hdr ehdr; | ||
100 | - int retval, fd; | ||
101 | - Elf32_Half machine; | ||
102 | - | ||
103 | - fd = open(filename, O_RDONLY | O_BINARY); | ||
104 | - if (fd < 0) | ||
105 | - goto error; | ||
106 | - | ||
107 | - retval = read(fd, &ehdr, sizeof(ehdr)); | ||
108 | - if (retval < 0) | ||
109 | - goto error; | ||
110 | - | ||
111 | - if (ehdr.e_ident[0] != 0x7f || ehdr.e_ident[1] != 'E' | ||
112 | - || ehdr.e_ident[2] != 'L' || ehdr.e_ident[3] != 'F') | ||
113 | - goto error; | ||
114 | - machine = tswap16(ehdr.e_machine); | ||
115 | - if (machine == EM_SPARC || machine == EM_SPARC32PLUS) { | ||
116 | - struct elf32_phdr phdr; | ||
117 | - | ||
118 | - bswap_ehdr32(&ehdr); | ||
119 | - | ||
120 | - if (find_phdr32(&ehdr, fd, &phdr, PT_LOAD)) | ||
121 | - goto error; | ||
122 | - retval = read_program32(fd, &phdr, addr, ehdr.e_entry); | ||
123 | - if (retval < 0) | ||
124 | - goto error; | ||
125 | - load_symbols32(&ehdr, fd); | ||
126 | - } | ||
127 | -#ifdef TARGET_SPARC64 | ||
128 | - else if (machine == EM_SPARCV9) { | ||
129 | - struct elf64_hdr ehdr64; | ||
130 | - struct elf64_phdr phdr; | ||
131 | - | ||
132 | - lseek(fd, 0, SEEK_SET); | ||
133 | - | ||
134 | - retval = read(fd, &ehdr64, sizeof(ehdr64)); | ||
135 | - if (retval < 0) | ||
136 | - goto error; | ||
137 | - | ||
138 | - bswap_ehdr64(&ehdr64); | ||
139 | - | ||
140 | - if (find_phdr64(&ehdr64, fd, &phdr, PT_LOAD)) | ||
141 | - goto error; | ||
142 | - retval = read_program64(fd, &phdr, phys_ram_base + ehdr64.e_entry, ehdr64.e_entry); | ||
143 | - if (retval < 0) | ||
144 | - goto error; | ||
145 | - load_symbols64(&ehdr64, fd); | ||
146 | - } | ||
147 | -#endif | ||
148 | - | ||
149 | - close(fd); | ||
150 | - return retval; | ||
151 | - error: | ||
152 | - close(fd); | ||
153 | - return -1; | ||
154 | -} | ||
155 | - | ||
156 | -int load_aout(const char *filename, uint8_t *addr) | ||
157 | -{ | ||
158 | - int fd, size, ret; | ||
159 | - struct exec e; | ||
160 | - uint32_t magic; | ||
161 | - | ||
162 | - fd = open(filename, O_RDONLY | O_BINARY); | ||
163 | - if (fd < 0) | ||
164 | - return -1; | ||
165 | - | ||
166 | - size = read(fd, &e, sizeof(e)); | ||
167 | - if (size < 0) | ||
168 | - goto fail; | ||
169 | - | ||
170 | - bswap_ahdr(&e); | ||
171 | - | ||
172 | - magic = N_MAGIC(e); | ||
173 | - switch (magic) { | ||
174 | - case ZMAGIC: | ||
175 | - case QMAGIC: | ||
176 | - case OMAGIC: | ||
177 | - lseek(fd, N_TXTOFF(e), SEEK_SET); | ||
178 | - size = read(fd, addr, e.a_text + e.a_data); | ||
179 | - if (size < 0) | ||
180 | - goto fail; | ||
181 | - break; | ||
182 | - case NMAGIC: | ||
183 | - lseek(fd, N_TXTOFF(e), SEEK_SET); | ||
184 | - size = read(fd, addr, e.a_text); | ||
185 | - if (size < 0) | ||
186 | - goto fail; | ||
187 | - ret = read(fd, addr + N_DATADDR(e), e.a_data); | ||
188 | - if (ret < 0) | ||
189 | - goto fail; | ||
190 | - size += ret; | ||
191 | - break; | ||
192 | - default: | ||
193 | - goto fail; | ||
194 | - } | ||
195 | - close(fd); | ||
196 | - return size; | ||
197 | - fail: | ||
198 | - close(fd); | ||
199 | - return -1; | ||
200 | -} | ||
201 | - |
hw/sun4m.c
@@ -26,6 +26,7 @@ | @@ -26,6 +26,7 @@ | ||
26 | #define KERNEL_LOAD_ADDR 0x00004000 | 26 | #define KERNEL_LOAD_ADDR 0x00004000 |
27 | #define CMDLINE_ADDR 0x007ff000 | 27 | #define CMDLINE_ADDR 0x007ff000 |
28 | #define INITRD_LOAD_ADDR 0x00800000 | 28 | #define INITRD_LOAD_ADDR 0x00800000 |
29 | +#define PROM_SIZE_MAX (256 * 1024) | ||
29 | #define PROM_ADDR 0xffd00000 | 30 | #define PROM_ADDR 0xffd00000 |
30 | #define PROM_FILENAMEB "proll.bin" | 31 | #define PROM_FILENAMEB "proll.bin" |
31 | #define PROM_FILENAMEE "proll.elf" | 32 | #define PROM_FILENAMEE "proll.elf" |
@@ -263,9 +264,12 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device, | @@ -263,9 +264,12 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device, | ||
263 | slavio_misc = slavio_misc_init(PHYS_JJ_SLAVIO, PHYS_JJ_ME_IRQ); | 264 | slavio_misc = slavio_misc_init(PHYS_JJ_SLAVIO, PHYS_JJ_ME_IRQ); |
264 | 265 | ||
265 | prom_offset = ram_size + vram_size; | 266 | prom_offset = ram_size + vram_size; |
267 | + cpu_register_physical_memory(PROM_ADDR, | ||
268 | + (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK, | ||
269 | + prom_offset | IO_MEM_ROM); | ||
266 | 270 | ||
267 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEE); | 271 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEE); |
268 | - ret = load_elf(buf, phys_ram_base + prom_offset); | 272 | + ret = load_elf(buf, 0); |
269 | if (ret < 0) { | 273 | if (ret < 0) { |
270 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEB); | 274 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEB); |
271 | ret = load_image(buf, phys_ram_base + prom_offset); | 275 | ret = load_image(buf, phys_ram_base + prom_offset); |
@@ -275,12 +279,10 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device, | @@ -275,12 +279,10 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device, | ||
275 | buf); | 279 | buf); |
276 | exit(1); | 280 | exit(1); |
277 | } | 281 | } |
278 | - cpu_register_physical_memory(PROM_ADDR, (ret + TARGET_PAGE_SIZE) & TARGET_PAGE_MASK, | ||
279 | - prom_offset | IO_MEM_ROM); | ||
280 | 282 | ||
281 | kernel_size = 0; | 283 | kernel_size = 0; |
282 | if (linux_boot) { | 284 | if (linux_boot) { |
283 | - kernel_size = load_elf(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR); | 285 | + kernel_size = load_elf(kernel_filename, -0xf0000000); |
284 | if (kernel_size < 0) | 286 | if (kernel_size < 0) |
285 | kernel_size = load_aout(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR); | 287 | kernel_size = load_aout(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR); |
286 | if (kernel_size < 0) | 288 | if (kernel_size < 0) |
hw/sun4u.c
@@ -27,6 +27,7 @@ | @@ -27,6 +27,7 @@ | ||
27 | #define KERNEL_LOAD_ADDR 0x00404000 | 27 | #define KERNEL_LOAD_ADDR 0x00404000 |
28 | #define CMDLINE_ADDR 0x003ff000 | 28 | #define CMDLINE_ADDR 0x003ff000 |
29 | #define INITRD_LOAD_ADDR 0x00300000 | 29 | #define INITRD_LOAD_ADDR 0x00300000 |
30 | +#define PROM_SIZE_MAX (256 * 1024) | ||
30 | #define PROM_ADDR 0x1fff0000000ULL | 31 | #define PROM_ADDR 0x1fff0000000ULL |
31 | #define APB_SPECIAL_BASE 0x1fe00000000ULL | 32 | #define APB_SPECIAL_BASE 0x1fe00000000ULL |
32 | #define APB_MEM_BASE 0x1ff00000000ULL | 33 | #define APB_MEM_BASE 0x1ff00000000ULL |
@@ -277,9 +278,12 @@ static void sun4u_init(int ram_size, int vga_ram_size, int boot_device, | @@ -277,9 +278,12 @@ static void sun4u_init(int ram_size, int vga_ram_size, int boot_device, | ||
277 | cpu_register_physical_memory(0, ram_size, 0); | 278 | cpu_register_physical_memory(0, ram_size, 0); |
278 | 279 | ||
279 | prom_offset = ram_size + vga_ram_size; | 280 | prom_offset = ram_size + vga_ram_size; |
281 | + cpu_register_physical_memory(PROM_ADDR, | ||
282 | + (PROM_SIZE_MAX + TARGET_PAGE_SIZE) & TARGET_PAGE_MASK, | ||
283 | + prom_offset | IO_MEM_ROM); | ||
280 | 284 | ||
281 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEE); | 285 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEE); |
282 | - ret = load_elf(buf, phys_ram_base + prom_offset); | 286 | + ret = load_elf(buf, 0); |
283 | if (ret < 0) { | 287 | if (ret < 0) { |
284 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEB); | 288 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEB); |
285 | ret = load_image(buf, phys_ram_base + prom_offset); | 289 | ret = load_image(buf, phys_ram_base + prom_offset); |
@@ -289,13 +293,12 @@ static void sun4u_init(int ram_size, int vga_ram_size, int boot_device, | @@ -289,13 +293,12 @@ static void sun4u_init(int ram_size, int vga_ram_size, int boot_device, | ||
289 | buf); | 293 | buf); |
290 | exit(1); | 294 | exit(1); |
291 | } | 295 | } |
292 | - cpu_register_physical_memory(PROM_ADDR, (ret + TARGET_PAGE_SIZE) & TARGET_PAGE_MASK, | ||
293 | - prom_offset | IO_MEM_ROM); | ||
294 | 296 | ||
295 | kernel_size = 0; | 297 | kernel_size = 0; |
296 | initrd_size = 0; | 298 | initrd_size = 0; |
297 | if (linux_boot) { | 299 | if (linux_boot) { |
298 | - kernel_size = load_elf(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR); | 300 | + /* XXX: put correct offset */ |
301 | + kernel_size = load_elf(kernel_filename, 0); | ||
299 | if (kernel_size < 0) | 302 | if (kernel_size < 0) |
300 | kernel_size = load_aout(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR); | 303 | kernel_size = load_aout(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR); |
301 | if (kernel_size < 0) | 304 | if (kernel_size < 0) |