Commit 2b8f2d4165de7095b58927138458b8d30775891e

Authored by balrog
1 parent 59c0149b

Optionally setup old style linux bootparams for -kernel, by Juergen Lock.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3089 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 3 changed files with 89 additions and 1 deletions
hw/arm_boot.c
... ... @@ -76,6 +76,77 @@ static void set_kernel_args(uint32_t ram_size, int initrd_size,
76 76 stl_raw(p++, 0);
77 77 }
78 78  
  79 +static void set_kernel_args_old(uint32_t ram_size, int initrd_size,
  80 + const char *kernel_cmdline,
  81 + target_phys_addr_t loader_start)
  82 +{
  83 + uint32_t *p;
  84 + unsigned char *s;
  85 +
  86 + /* see linux/include/asm-arm/setup.h */
  87 + p = (uint32_t *)(phys_ram_base + KERNEL_ARGS_ADDR);
  88 + /* page_size */
  89 + stl_raw(p++, 4096);
  90 + /* nr_pages */
  91 + stl_raw(p++, ram_size / 4096);
  92 + /* ramdisk_size */
  93 + stl_raw(p++, 0);
  94 +#define FLAG_READONLY 1
  95 +#define FLAG_RDLOAD 4
  96 +#define FLAG_RDPROMPT 8
  97 + /* flags */
  98 + stl_raw(p++, FLAG_READONLY | FLAG_RDLOAD | FLAG_RDPROMPT);
  99 + /* rootdev */
  100 + stl_raw(p++, (31 << 8) | 0); /* /dev/mtdblock0 */
  101 + /* video_num_cols */
  102 + stl_raw(p++, 0);
  103 + /* video_num_rows */
  104 + stl_raw(p++, 0);
  105 + /* video_x */
  106 + stl_raw(p++, 0);
  107 + /* video_y */
  108 + stl_raw(p++, 0);
  109 + /* memc_control_reg */
  110 + stl_raw(p++, 0);
  111 + /* unsigned char sounddefault */
  112 + /* unsigned char adfsdrives */
  113 + /* unsigned char bytes_per_char_h */
  114 + /* unsigned char bytes_per_char_v */
  115 + stl_raw(p++, 0);
  116 + /* pages_in_bank[4] */
  117 + stl_raw(p++, 0);
  118 + stl_raw(p++, 0);
  119 + stl_raw(p++, 0);
  120 + stl_raw(p++, 0);
  121 + /* pages_in_vram */
  122 + stl_raw(p++, 0);
  123 + /* initrd_start */
  124 + if (initrd_size)
  125 + stl_raw(p++, loader_start + INITRD_LOAD_ADDR);
  126 + else
  127 + stl_raw(p++, 0);
  128 + /* initrd_size */
  129 + stl_raw(p++, initrd_size);
  130 + /* rd_start */
  131 + stl_raw(p++, 0);
  132 + /* system_rev */
  133 + stl_raw(p++, 0);
  134 + /* system_serial_low */
  135 + stl_raw(p++, 0);
  136 + /* system_serial_high */
  137 + stl_raw(p++, 0);
  138 + /* mem_fclk_21285 */
  139 + stl_raw(p++, 0);
  140 + /* zero unused fields */
  141 + memset(p, 0, 256 + 1024 -
  142 + (p - ((uint32_t *)(phys_ram_base + KERNEL_ARGS_ADDR))));
  143 + s = phys_ram_base + KERNEL_ARGS_ADDR + 256 + 1024;
  144 + if (kernel_cmdline)
  145 + strcpy (s, kernel_cmdline);
  146 + else
  147 + stb_raw(s, 0);
  148 +}
  149 +
79 150 void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
80 151 const char *kernel_cmdline, const char *initrd_filename,
81 152 int board_id, target_phys_addr_t loader_start)
... ... @@ -140,6 +211,11 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
140 211 bootloader[6] = entry;
141 212 for (n = 0; n < sizeof(bootloader) / 4; n++)
142 213 stl_raw(phys_ram_base + (n * 4), bootloader[n]);
143   - set_kernel_args(ram_size, initrd_size, kernel_cmdline, loader_start);
  214 + if (old_param)
  215 + set_kernel_args_old(ram_size, initrd_size,
  216 + kernel_cmdline, loader_start);
  217 + else
  218 + set_kernel_args(ram_size, initrd_size,
  219 + kernel_cmdline, loader_start);
144 220 }
145 221 }
... ...
... ... @@ -197,6 +197,9 @@ const char *option_rom[MAX_OPTION_ROMS];
197 197 int nb_option_roms;
198 198 int semihosting_enabled = 0;
199 199 int autostart = 1;
  200 +#ifdef TARGET_ARM
  201 +int old_param = 0;
  202 +#endif
200 203 const char *qemu_name;
201 204 int alt_grab = 0;
202 205 #ifdef TARGET_SPARC
... ... @@ -6801,6 +6804,7 @@ enum {
6801 6804 QEMU_OPTION_semihosting,
6802 6805 QEMU_OPTION_name,
6803 6806 QEMU_OPTION_prom_env,
  6807 + QEMU_OPTION_old_param,
6804 6808 };
6805 6809  
6806 6810 typedef struct QEMUOption {
... ... @@ -6902,6 +6906,9 @@ const QEMUOption qemu_options[] = {
6902 6906 #if defined(TARGET_SPARC)
6903 6907 { "prom-env", HAS_ARG, QEMU_OPTION_prom_env },
6904 6908 #endif
  6909 +#if defined(TARGET_ARM)
  6910 + { "old-param", 0, QEMU_OPTION_old_param },
  6911 +#endif
6905 6912 { NULL },
6906 6913 };
6907 6914  
... ... @@ -7676,6 +7683,10 @@ int main(int argc, char **argv)
7676 7683 nb_prom_envs++;
7677 7684 break;
7678 7685 #endif
  7686 +#ifdef TARGET_ARM
  7687 + case QEMU_OPTION_old_param:
  7688 + old_param = 1;
  7689 +#endif
7679 7690 }
7680 7691 }
7681 7692 }
... ...
... ... @@ -164,6 +164,7 @@ extern int graphic_rotate;
164 164 extern int no_quit;
165 165 extern int semihosting_enabled;
166 166 extern int autostart;
  167 +extern int old_param;
167 168 extern const char *bootp_filename;
168 169  
169 170 #define MAX_OPTION_ROMS 16
... ...