@@ -291,35 +291,40 @@ static void map_file(char **ram_loc, const char *name)
291
291
292
292
static void usage (const char * execpath )
293
293
{
294
- fprintf (stderr , "Usage: %s -k linux-image [-b dtb] [-d disk-image]\n" ,
295
- execpath );
294
+ fprintf (
295
+ stderr ,
296
+ "Usage: %s -k linux-image [-b dtb] [-i initrd-image] [-d disk-image]\n" ,
297
+ execpath );
296
298
}
297
299
298
300
static void handle_options (int argc ,
299
301
char * * argv ,
300
302
char * * kernel_file ,
301
303
char * * dtb_file ,
304
+ char * * initrd_file ,
302
305
char * * disk_file )
303
306
{
304
- * kernel_file = * dtb_file = * disk_file = NULL ;
307
+ * kernel_file = * dtb_file = * initrd_file = * disk_file = NULL ;
305
308
306
309
int optidx = 0 ;
307
310
struct option opts [] = {
308
- {"kernel" , 1 , NULL , 'k' },
309
- {"dtb" , 1 , NULL , 'b' },
310
- {"disk" , 1 , NULL , 'd' },
311
+ {"kernel" , 1 , NULL , 'k' }, {"dtb" , 1 , NULL , 'b' },
312
+ {"initrd" , 1 , NULL , 'i' }, {"disk" , 1 , NULL , 'd' },
311
313
{"help" , 0 , NULL , 'h' },
312
314
};
313
315
314
316
int c ;
315
- while ((c = getopt_long (argc , argv , "k:b:d:h" , opts , & optidx )) != -1 ) {
317
+ while ((c = getopt_long (argc , argv , "k:b:i: d:h" , opts , & optidx )) != -1 ) {
316
318
switch (c ) {
317
319
case 'k' :
318
320
* kernel_file = optarg ;
319
321
break ;
320
322
case 'b' :
321
323
* dtb_file = optarg ;
322
324
break ;
325
+ case 'i' :
326
+ * initrd_file = optarg ;
327
+ break ;
323
328
case 'd' :
324
329
* disk_file = optarg ;
325
330
break ;
@@ -347,8 +352,10 @@ static int semu_start(int argc, char **argv)
347
352
{
348
353
char * kernel_file ;
349
354
char * dtb_file ;
355
+ char * initrd_file ;
350
356
char * disk_file ;
351
- handle_options (argc , argv , & kernel_file , & dtb_file , & disk_file );
357
+ handle_options (argc , argv , & kernel_file , & dtb_file , & initrd_file ,
358
+ & disk_file );
352
359
353
360
/* Initialize the emulator */
354
361
emu_state_t emu ;
@@ -371,13 +378,27 @@ static int semu_start(int argc, char **argv)
371
378
}
372
379
assert (!(((uintptr_t ) emu .ram ) & 0b11 ));
373
380
381
+ /* *-----------------------------------------*
382
+ * | Memory layout |
383
+ * *----------------*----------------*-------*
384
+ * | kernel image | initrd image | dtb |
385
+ * *----------------*----------------*-------*
386
+ */
374
387
char * ram_loc = (char * ) emu .ram ;
375
388
/* Load Linux kernel image */
376
389
map_file (& ram_loc , kernel_file );
377
- /* Load at last 1 MiB to prevent kernel / initrd from overwriting it */
378
- uint32_t dtb_addr = RAM_SIZE - 1024 * 1024 ; /* Device tree */
390
+ /* Load at last 1 MiB to prevent kernel from overwriting it */
391
+ uint32_t dtb_addr = RAM_SIZE - DTB_SIZE ; /* Device tree */
379
392
ram_loc = ((char * ) emu .ram ) + dtb_addr ;
380
393
map_file (& ram_loc , dtb_file );
394
+ /* Load optional initrd image at last 8 MiB before the dtb region to
395
+ * prevent kernel from overwritting it
396
+ */
397
+ if (initrd_file ) {
398
+ uint32_t initrd_addr = dtb_addr - INITRD_SIZE ; /* Init RAM disk */
399
+ ram_loc = ((char * ) emu .ram ) + initrd_addr ;
400
+ map_file (& ram_loc , initrd_file );
401
+ }
381
402
382
403
/* Hook for unmapping files */
383
404
atexit (unmap_files );
0 commit comments