Revision 7df526e3 hw/mips_r4k.c
b/hw/mips_r4k.c | ||
---|---|---|
36 | 36 |
|
37 | 37 |
/*i8254 PIT is attached to the IRQ0 at PIC i8259 */ |
38 | 38 |
|
39 |
static struct _loaderparams { |
|
40 |
int ram_size; |
|
41 |
const char *kernel_filename; |
|
42 |
const char *kernel_cmdline; |
|
43 |
const char *initrd_filename; |
|
44 |
} loaderparams; |
|
45 |
|
|
39 | 46 |
static void mips_qemu_writel (void *opaque, target_phys_addr_t addr, |
40 | 47 |
uint32_t val) |
41 | 48 |
{ |
... | ... | |
64 | 71 |
|
65 | 72 |
static int mips_qemu_iomemtype = 0; |
66 | 73 |
|
67 |
static void load_kernel (CPUState *env, int ram_size, |
|
68 |
const char *kernel_filename, |
|
69 |
const char *kernel_cmdline, |
|
70 |
const char *initrd_filename) |
|
74 |
static void load_kernel (CPUState *env) |
|
71 | 75 |
{ |
72 | 76 |
int64_t entry, kernel_low, kernel_high; |
73 | 77 |
long kernel_size, initrd_size; |
74 | 78 |
ram_addr_t initrd_offset; |
75 | 79 |
|
76 |
kernel_size = load_elf(kernel_filename, VIRT_TO_PHYS_ADDEND, |
|
80 |
kernel_size = load_elf(loaderparams.kernel_filename, VIRT_TO_PHYS_ADDEND,
|
|
77 | 81 |
&entry, &kernel_low, &kernel_high); |
78 | 82 |
if (kernel_size >= 0) { |
79 | 83 |
if ((entry & ~0x7fffffffULL) == 0x80000000) |
... | ... | |
81 | 85 |
env->PC[env->current_tc] = entry; |
82 | 86 |
} else { |
83 | 87 |
fprintf(stderr, "qemu: could not load kernel '%s'\n", |
84 |
kernel_filename); |
|
88 |
loaderparams.kernel_filename);
|
|
85 | 89 |
exit(1); |
86 | 90 |
} |
87 | 91 |
|
88 | 92 |
/* load initrd */ |
89 | 93 |
initrd_size = 0; |
90 | 94 |
initrd_offset = 0; |
91 |
if (initrd_filename) { |
|
92 |
initrd_size = get_image_size (initrd_filename); |
|
95 |
if (loaderparams.initrd_filename) {
|
|
96 |
initrd_size = get_image_size (loaderparams.initrd_filename);
|
|
93 | 97 |
if (initrd_size > 0) { |
94 | 98 |
initrd_offset = (kernel_high + ~TARGET_PAGE_MASK) & TARGET_PAGE_MASK; |
95 | 99 |
if (initrd_offset + initrd_size > ram_size) { |
96 | 100 |
fprintf(stderr, |
97 | 101 |
"qemu: memory too small for initial ram disk '%s'\n", |
98 |
initrd_filename); |
|
102 |
loaderparams.initrd_filename);
|
|
99 | 103 |
exit(1); |
100 | 104 |
} |
101 |
initrd_size = load_image(initrd_filename, |
|
105 |
initrd_size = load_image(loaderparams.initrd_filename,
|
|
102 | 106 |
phys_ram_base + initrd_offset); |
103 | 107 |
} |
104 | 108 |
if (initrd_size == (target_ulong) -1) { |
105 | 109 |
fprintf(stderr, "qemu: could not load initial ram disk '%s'\n", |
106 |
initrd_filename); |
|
110 |
loaderparams.initrd_filename);
|
|
107 | 111 |
exit(1); |
108 | 112 |
} |
109 | 113 |
} |
... | ... | |
115 | 119 |
"rd_start=0x" TARGET_FMT_lx " rd_size=%li ", |
116 | 120 |
PHYS_TO_VIRT((uint32_t)initrd_offset), |
117 | 121 |
initrd_size); |
118 |
strcpy (phys_ram_base + (16 << 20) - 256 + ret, kernel_cmdline); |
|
122 |
strcpy (phys_ram_base + (16 << 20) - 256 + ret, |
|
123 |
loaderparams.kernel_cmdline); |
|
119 | 124 |
} |
120 | 125 |
else { |
121 |
strcpy (phys_ram_base + (16 << 20) - 256, kernel_cmdline); |
|
126 |
strcpy (phys_ram_base + (16 << 20) - 256, |
|
127 |
loaderparams.kernel_cmdline); |
|
122 | 128 |
} |
123 | 129 |
|
124 | 130 |
*(int32_t *)(phys_ram_base + (16 << 20) - 260) = tswap32 (0x12345678); |
... | ... | |
131 | 137 |
cpu_reset(env); |
132 | 138 |
cpu_mips_register(env, NULL); |
133 | 139 |
|
134 |
if (env->kernel_filename) |
|
135 |
load_kernel (env, env->ram_size, env->kernel_filename, |
|
136 |
env->kernel_cmdline, env->initrd_filename); |
|
140 |
if (loaderparams.kernel_filename) |
|
141 |
load_kernel (env); |
|
137 | 142 |
} |
138 | 143 |
|
139 | 144 |
static |
... | ... | |
194 | 199 |
} |
195 | 200 |
|
196 | 201 |
if (kernel_filename) { |
197 |
load_kernel (env, ram_size, kernel_filename, kernel_cmdline, |
|
198 |
initrd_filename); |
|
199 |
env->ram_size = ram_size; |
|
200 |
env->kernel_filename = kernel_filename; |
|
201 |
env->kernel_cmdline = kernel_cmdline; |
|
202 |
env->initrd_filename = initrd_filename; |
|
202 |
loaderparams.ram_size = ram_size; |
|
203 |
loaderparams.kernel_filename = kernel_filename; |
|
204 |
loaderparams.kernel_cmdline = kernel_cmdline; |
|
205 |
loaderparams.initrd_filename = initrd_filename; |
|
206 |
load_kernel (env); |
|
203 | 207 |
} |
204 | 208 |
|
205 | 209 |
/* Init CPU internal devices */ |
Also available in: Unified diff