@@ -128,6 +128,8 @@ static int ppce500_load_device_tree(MachineState *machine,
128
128
hwaddr addr ,
129
129
hwaddr initrd_base ,
130
130
hwaddr initrd_size ,
131
+ hwaddr kernel_base ,
132
+ hwaddr kernel_size ,
131
133
bool dry_run )
132
134
{
133
135
CPUPPCState * env = first_cpu -> env_ptr ;
@@ -204,6 +206,13 @@ static int ppce500_load_device_tree(MachineState *machine,
204
206
if (ret < 0 ) {
205
207
fprintf (stderr , "couldn't set /chosen/linux,initrd-end\n" );
206
208
}
209
+
210
+ }
211
+
212
+ if (kernel_base != -1ULL ) {
213
+ qemu_fdt_setprop_cells (fdt , "/chosen" , "qemu,boot-kernel" ,
214
+ kernel_base >> 32 , kernel_base ,
215
+ kernel_size >> 32 , kernel_size );
207
216
}
208
217
209
218
ret = qemu_fdt_setprop_string (fdt , "/chosen" , "bootargs" ,
@@ -392,33 +401,41 @@ typedef struct DeviceTreeParams {
392
401
hwaddr addr ;
393
402
hwaddr initrd_base ;
394
403
hwaddr initrd_size ;
404
+ hwaddr kernel_base ;
405
+ hwaddr kernel_size ;
395
406
} DeviceTreeParams ;
396
407
397
408
static void ppce500_reset_device_tree (void * opaque )
398
409
{
399
410
DeviceTreeParams * p = opaque ;
400
- ppce500_load_device_tree (p -> machine , & p -> params , p -> addr , p -> initrd_base ,
401
- p -> initrd_size , false);
411
+ ppce500_load_device_tree (& p -> machine , & p -> params , p -> addr , p -> initrd_base ,
412
+ p -> initrd_size , p -> kernel_base , p -> kernel_size ,
413
+ false);
402
414
}
403
415
404
416
static int ppce500_prep_device_tree (MachineState * machine ,
405
417
PPCE500Params * params ,
406
418
hwaddr addr ,
407
419
hwaddr initrd_base ,
408
- hwaddr initrd_size )
420
+ hwaddr initrd_size ,
421
+ hwaddr kernel_base ,
422
+ hwaddr kernel_size )
409
423
{
410
424
DeviceTreeParams * p = g_new (DeviceTreeParams , 1 );
411
425
p -> machine = machine ;
412
426
p -> params = * params ;
413
427
p -> addr = addr ;
414
428
p -> initrd_base = initrd_base ;
415
429
p -> initrd_size = initrd_size ;
430
+ p -> kernel_base = kernel_base ;
431
+ p -> kernel_size = kernel_size ;
416
432
417
433
qemu_register_reset (ppce500_reset_device_tree , p );
418
434
419
435
/* Issue the device tree loader once, so that we get the size of the blob */
420
436
return ppce500_load_device_tree (machine , params , addr , initrd_base ,
421
- initrd_size , true);
437
+ initrd_size , kernel_base , kernel_size ,
438
+ true);
422
439
}
423
440
424
441
/* Create -kernel TLB entries for BookE. */
@@ -787,7 +804,8 @@ void ppce500_init(MachineState *machine, PPCE500Params *params)
787
804
int dt_size ;
788
805
789
806
dt_size = ppce500_prep_device_tree (machine , params , dt_base ,
790
- initrd_base , initrd_size );
807
+ initrd_base , initrd_size ,
808
+ loadaddr , kernel_size );
791
809
if (dt_size < 0 ) {
792
810
fprintf (stderr , "couldn't load device tree\n" );
793
811
exit (1 );
0 commit comments