Revision 9ee6e8bb hw/arm_boot.c

b/hw/arm_boot.c
1 1
/*
2 2
 * ARM kernel loader.
3 3
 *
4
 * Copyright (c) 2006 CodeSourcery.
4
 * Copyright (c) 2006-2007 CodeSourcery.
5 5
 * Written by Paul Brook
6 6
 *
7 7
 * This code is licenced under the GPL.
......
24 24
  0  /* Kernel entry point.  Set by integratorcp_init.  */
25 25
};
26 26

  
27
/* Entry point for secondary CPUs.  Enable interrupt controller and
28
   Issue WFI until start address is written to system controller.  */
29
static uint32_t smpboot[] = {
30
  0xe3a00201, /* mov     r0, #0x10000000 */
31
  0xe3800601, /* orr     r0, r0, #0x001000000 */
32
  0xe3a01001, /* mov     r1, #1 */
33
  0xe5801100, /* str     r1, [r0, #0x100] */
34
  0xe3a00201, /* mov     r0, #0x10000000 */
35
  0xe3800030, /* orr     r0, #0x30 */
36
  0xe320f003, /* wfi */
37
  0xe5901000, /* ldr     r1, [r0] */
38
  0xe3110003, /* tst     r1, #3 */
39
  0x1afffffb, /* bne     <wfi> */
40
  0xe12fff11  /* bx      r1 */
41
};
42

  
27 43
static void main_cpu_reset(void *opaque)
28 44
{
29 45
    CPUState *env = opaque;
......
33 49
        arm_load_kernel(env, env->ram_size, env->kernel_filename,
34 50
                        env->kernel_cmdline, env->initrd_filename,
35 51
                        env->board_id, env->loader_start);
52

  
53
    /* TODO:  Reset secondary CPUs.  */
36 54
}
37 55

  
38 56
static void set_kernel_args(uint32_t ram_size, int initrd_size,
......
211 229
        bootloader[6] = entry;
212 230
        for (n = 0; n < sizeof(bootloader) / 4; n++)
213 231
            stl_raw(phys_ram_base + (n * 4), bootloader[n]);
232
        for (n = 0; n < sizeof(smpboot) / 4; n++)
233
            stl_raw(phys_ram_base + ram_size + (n * 4), smpboot[n]);
214 234
        if (old_param)
215 235
            set_kernel_args_old(ram_size, initrd_size,
216 236
                                kernel_cmdline, loader_start);

Also available in: Unified diff