Revision 7df526e3 hw/mips_mipssim.c
b/hw/mips_mipssim.c | ||
---|---|---|
40 | 40 |
|
41 | 41 |
#define VIRT_TO_PHYS_ADDEND (-((int64_t)(int32_t)0x80000000)) |
42 | 42 |
|
43 |
static struct _loaderparams { |
|
44 |
int ram_size; |
|
45 |
const char *kernel_filename; |
|
46 |
const char *kernel_cmdline; |
|
47 |
const char *initrd_filename; |
|
48 |
} loaderparams; |
|
49 |
|
|
43 | 50 |
static void load_kernel (CPUState *env) |
44 | 51 |
{ |
45 | 52 |
int64_t entry, kernel_low, kernel_high; |
... | ... | |
47 | 54 |
long initrd_size; |
48 | 55 |
ram_addr_t initrd_offset; |
49 | 56 |
|
50 |
kernel_size = load_elf(env->kernel_filename, VIRT_TO_PHYS_ADDEND,
|
|
57 |
kernel_size = load_elf(loaderparams.kernel_filename, VIRT_TO_PHYS_ADDEND,
|
|
51 | 58 |
&entry, &kernel_low, &kernel_high); |
52 | 59 |
if (kernel_size >= 0) { |
53 | 60 |
if ((entry & ~0x7fffffffULL) == 0x80000000) |
... | ... | |
55 | 62 |
env->PC[env->current_tc] = entry; |
56 | 63 |
} else { |
57 | 64 |
fprintf(stderr, "qemu: could not load kernel '%s'\n", |
58 |
env->kernel_filename);
|
|
65 |
loaderparams.kernel_filename);
|
|
59 | 66 |
exit(1); |
60 | 67 |
} |
61 | 68 |
|
62 | 69 |
/* load initrd */ |
63 | 70 |
initrd_size = 0; |
64 | 71 |
initrd_offset = 0; |
65 |
if (env->initrd_filename) {
|
|
66 |
initrd_size = get_image_size (env->initrd_filename);
|
|
72 |
if (loaderparams.initrd_filename) {
|
|
73 |
initrd_size = get_image_size (loaderparams.initrd_filename);
|
|
67 | 74 |
if (initrd_size > 0) { |
68 | 75 |
initrd_offset = (kernel_high + ~TARGET_PAGE_MASK) & TARGET_PAGE_MASK; |
69 |
if (initrd_offset + initrd_size > env->ram_size) {
|
|
76 |
if (initrd_offset + initrd_size > loaderparams.ram_size) {
|
|
70 | 77 |
fprintf(stderr, |
71 | 78 |
"qemu: memory too small for initial ram disk '%s'\n", |
72 |
env->initrd_filename);
|
|
79 |
loaderparams.initrd_filename);
|
|
73 | 80 |
exit(1); |
74 | 81 |
} |
75 |
initrd_size = load_image(env->initrd_filename,
|
|
82 |
initrd_size = load_image(loaderparams.initrd_filename,
|
|
76 | 83 |
phys_ram_base + initrd_offset); |
77 | 84 |
} |
78 | 85 |
if (initrd_size == (target_ulong) -1) { |
79 | 86 |
fprintf(stderr, "qemu: could not load initial ram disk '%s'\n", |
80 |
env->initrd_filename);
|
|
87 |
loaderparams.initrd_filename);
|
|
81 | 88 |
exit(1); |
82 | 89 |
} |
83 | 90 |
} |
... | ... | |
89 | 96 |
cpu_reset(env); |
90 | 97 |
cpu_mips_register(env, NULL); |
91 | 98 |
|
92 |
if (env->kernel_filename)
|
|
99 |
if (loaderparams.kernel_filename)
|
|
93 | 100 |
load_kernel (env); |
94 | 101 |
} |
95 | 102 |
|
... | ... | |
144 | 151 |
} |
145 | 152 |
|
146 | 153 |
if (kernel_filename) { |
147 |
env->ram_size = ram_size;
|
|
148 |
env->kernel_filename = kernel_filename;
|
|
149 |
env->kernel_cmdline = kernel_cmdline;
|
|
150 |
env->initrd_filename = initrd_filename;
|
|
154 |
loaderparams.ram_size = ram_size;
|
|
155 |
loaderparams.kernel_filename = kernel_filename;
|
|
156 |
loaderparams.kernel_cmdline = kernel_cmdline;
|
|
157 |
loaderparams.initrd_filename = initrd_filename;
|
|
151 | 158 |
load_kernel(env); |
152 | 159 |
} |
153 | 160 |
|
Also available in: Unified diff