Revision 7df526e3

b/hw/mips_malta.c
59 59

  
60 60
static PITState *pit;
61 61

  
62
static struct _loaderparams {
63
    int ram_size;
64
    const char *kernel_filename;
65
    const char *kernel_cmdline;
66
    const char *initrd_filename;
67
} loaderparams;
68

  
62 69
/* Malta FPGA */
63 70
static void malta_fpga_update_display(void *opaque)
64 71
{
......
534 541
    stl_raw(p++, 0x34a50000 | (ENVP_ADDR & 0xffff));               /* ori a1, a1, low(ENVP_ADDR) */
535 542
    stl_raw(p++, 0x3c060000 | (((ENVP_ADDR + 8) >> 16) & 0xffff)); /* lui a2, high(ENVP_ADDR + 8) */
536 543
    stl_raw(p++, 0x34c60000 | ((ENVP_ADDR + 8) & 0xffff));         /* ori a2, a2, low(ENVP_ADDR + 8) */
537
    stl_raw(p++, 0x3c070000 | (env->ram_size >> 16));              /* lui a3, high(env->ram_size) */
538
    stl_raw(p++, 0x34e70000 | (env->ram_size & 0xffff));           /* ori a3, a3, low(env->ram_size) */
544
    stl_raw(p++, 0x3c070000 | (loaderparams.ram_size >> 16));     /* lui a3, high(ram_size) */
545
    stl_raw(p++, 0x34e70000 | (loaderparams.ram_size & 0xffff));  /* ori a3, a3, low(ram_size) */
539 546

  
540 547
    /* Load BAR registers as done by YAMON */
541 548
    stl_raw(p++, 0x3c09b400);                                      /* lui t1, 0xb400 */
......
675 682
    long initrd_size;
676 683
    ram_addr_t initrd_offset;
677 684

  
678
    if (load_elf(env->kernel_filename, VIRT_TO_PHYS_ADDEND,
685
    if (load_elf(loaderparams.kernel_filename, VIRT_TO_PHYS_ADDEND,
679 686
                 &kernel_entry, &kernel_low, &kernel_high) < 0) {
680 687
        fprintf(stderr, "qemu: could not load kernel '%s'\n",
681
                env->kernel_filename);
688
                loaderparams.kernel_filename);
682 689
        exit(1);
683 690
    }
684 691

  
685 692
    /* load initrd */
686 693
    initrd_size = 0;
687 694
    initrd_offset = 0;
688
    if (env->initrd_filename) {
689
        initrd_size = get_image_size (env->initrd_filename);
695
    if (loaderparams.initrd_filename) {
696
        initrd_size = get_image_size (loaderparams.initrd_filename);
690 697
        if (initrd_size > 0) {
691 698
            initrd_offset = (kernel_high + ~TARGET_PAGE_MASK) & TARGET_PAGE_MASK;
692
            if (initrd_offset + initrd_size > env->ram_size) {
699
            if (initrd_offset + initrd_size > ram_size) {
693 700
                fprintf(stderr,
694 701
                        "qemu: memory too small for initial ram disk '%s'\n",
695
                        env->initrd_filename);
702
                        loaderparams.initrd_filename);
696 703
                exit(1);
697 704
            }
698
            initrd_size = load_image(env->initrd_filename,
705
            initrd_size = load_image(loaderparams.initrd_filename,
699 706
                                     phys_ram_base + initrd_offset);
700 707
        }
701 708
        if (initrd_size == (target_ulong) -1) {
702 709
            fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
703
                    env->initrd_filename);
710
                    loaderparams.initrd_filename);
704 711
            exit(1);
705 712
        }
706 713
    }
707 714

  
708 715
    /* Store command line.  */
709
    prom_set(index++, env->kernel_filename);
716
    prom_set(index++, loaderparams.kernel_filename);
710 717
    if (initrd_size > 0)
711 718
        prom_set(index++, "rd_start=0x" TARGET_FMT_lx " rd_size=%li %s",
712 719
                 PHYS_TO_VIRT(initrd_offset), initrd_size,
713
                 env->kernel_cmdline);
720
                 loaderparams.kernel_cmdline);
714 721
    else
715
        prom_set(index++, env->kernel_cmdline);
722
        prom_set(index++, loaderparams.kernel_cmdline);
716 723

  
717 724
    /* Setup minimum environment variables */
718 725
    prom_set(index++, "memsize");
719
    prom_set(index++, "%i", env->ram_size);
726
    prom_set(index++, "%i", loaderparams.ram_size);
720 727
    prom_set(index++, "modetty0");
721 728
    prom_set(index++, "38400n8r");
722 729
    prom_set(index++, NULL);
......
733 740
    /* The bootload does not need to be rewritten as it is located in a
734 741
       read only location. The kernel location and the arguments table
735 742
       location does not change. */
736
    if (env->kernel_filename) {
743
    if (loaderparams.kernel_filename) {
737 744
        env->CP0_Status &= ~((1 << CP0St_BEV) | (1 << CP0St_ERL));
738 745
        load_kernel (env);
739 746
    }
......
818 825
    /* If a kernel image has been specified, write a small bootloader
819 826
       to the flash location. */
820 827
    if (kernel_filename) {
821
        env->ram_size = ram_size;
822
        env->kernel_filename = kernel_filename;
823
        env->kernel_cmdline = kernel_cmdline;
824
        env->initrd_filename = initrd_filename;
828
        loaderparams.ram_size = ram_size;
829
        loaderparams.kernel_filename = kernel_filename;
830
        loaderparams.kernel_cmdline = kernel_cmdline;
831
        loaderparams.initrd_filename = initrd_filename;
825 832
        kernel_entry = load_kernel(env);
826 833
        env->CP0_Status &= ~((1 << CP0St_BEV) | (1 << CP0St_ERL));
827 834
        write_bootloader(env, bios_offset, kernel_entry);
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

  
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 */
b/target-mips/cpu.h
456 456

  
457 457
    CPU_COMMON
458 458

  
459
    int ram_size;
460
    const char *kernel_filename;
461
    const char *kernel_cmdline;
462
    const char *initrd_filename;
463

  
464 459
    mips_def_t *cpu_model;
465 460
#ifndef CONFIG_USER_ONLY
466 461
    void *irq[8];

Also available in: Unified diff