Revision f3d6b95e
b/hw/arm_boot.c | ||
---|---|---|
24 | 24 |
0 /* Kernel entry point. Set by integratorcp_init. */ |
25 | 25 |
}; |
26 | 26 |
|
27 |
static void main_cpu_reset(void *opaque) |
|
28 |
{ |
|
29 |
CPUState *env = opaque; |
|
30 |
|
|
31 |
cpu_reset(env); |
|
32 |
if (env->kernel_filename) |
|
33 |
arm_load_kernel(env, env->ram_size, env->kernel_filename, |
|
34 |
env->kernel_cmdline, env->initrd_filename, |
|
35 |
env->board_id); |
|
36 |
} |
|
37 |
|
|
27 | 38 |
static void set_kernel_args(uint32_t ram_size, int initrd_size, |
28 | 39 |
const char *kernel_cmdline) |
29 | 40 |
{ |
... | ... | |
81 | 92 |
exit(1); |
82 | 93 |
} |
83 | 94 |
|
95 |
if (!env->kernel_filename) { |
|
96 |
env->ram_size = ram_size; |
|
97 |
env->kernel_filename = kernel_filename; |
|
98 |
env->kernel_cmdline = kernel_cmdline; |
|
99 |
env->initrd_filename = initrd_filename; |
|
100 |
env->board_id = board_id; |
|
101 |
qemu_register_reset(main_cpu_reset, env); |
|
102 |
} |
|
84 | 103 |
/* Assume that raw images are linux kernels, and ELF images are not. */ |
85 | 104 |
kernel_size = load_elf(kernel_filename, 0, &elf_entry); |
86 | 105 |
entry = elf_entry; |
b/hw/arm_sysctl.c | ||
---|---|---|
149 | 149 |
if (s->lockval == LOCK_VALUE) { |
150 | 150 |
s->resetlevel = val; |
151 | 151 |
if (val & 0x100) |
152 |
cpu_abort(cpu_single_env, "Board reset\n");
|
|
152 |
qemu_system_reset_request ();
|
|
153 | 153 |
} |
154 | 154 |
break; |
155 | 155 |
case 0x44: /* PCICTL */ |
b/target-arm/cpu.h | ||
---|---|---|
122 | 122 |
|
123 | 123 |
CPU_COMMON |
124 | 124 |
|
125 |
/* These fields after the common ones so thes are preserved on reset. */ |
|
126 |
int ram_size; |
|
127 |
const char *kernel_filename; |
|
128 |
const char *kernel_cmdline; |
|
129 |
const char *initrd_filename; |
|
130 |
int board_id; |
|
125 | 131 |
} CPUARMState; |
126 | 132 |
|
127 | 133 |
CPUARMState *cpu_arm_init(void); |
b/target-arm/helper.c | ||
---|---|---|
5 | 5 |
#include "cpu.h" |
6 | 6 |
#include "exec-all.h" |
7 | 7 |
|
8 |
static inline void set_feature(CPUARMState *env, int feature) |
|
9 |
{ |
|
10 |
env->features |= 1u << feature; |
|
11 |
} |
|
12 |
|
|
13 |
static void cpu_reset_model_id(CPUARMState *env, uint32_t id) |
|
14 |
{ |
|
15 |
env->cp15.c0_cpuid = id; |
|
16 |
switch (id) { |
|
17 |
case ARM_CPUID_ARM926: |
|
18 |
set_feature(env, ARM_FEATURE_VFP); |
|
19 |
env->vfp.xregs[ARM_VFP_FPSID] = 0x41011090; |
|
20 |
break; |
|
21 |
case ARM_CPUID_ARM1026: |
|
22 |
set_feature(env, ARM_FEATURE_VFP); |
|
23 |
set_feature(env, ARM_FEATURE_AUXCR); |
|
24 |
env->vfp.xregs[ARM_VFP_FPSID] = 0x410110a0; |
|
25 |
break; |
|
26 |
default: |
|
27 |
cpu_abort(env, "Bad CPU ID: %x\n", id); |
|
28 |
break; |
|
29 |
} |
|
30 |
} |
|
31 |
|
|
8 | 32 |
void cpu_reset(CPUARMState *env) |
9 | 33 |
{ |
34 |
uint32_t id; |
|
35 |
id = env->cp15.c0_cpuid; |
|
36 |
memset(env, 0, offsetof(CPUARMState, breakpoints)); |
|
37 |
if (id) |
|
38 |
cpu_reset_model_id(env, id); |
|
10 | 39 |
#if defined (CONFIG_USER_ONLY) |
11 | 40 |
env->uncached_cpsr = ARM_CPU_MODE_USR; |
12 | 41 |
env->vfp.xregs[ARM_VFP_FPEXC] = 1 << 30; |
... | ... | |
16 | 45 |
env->vfp.xregs[ARM_VFP_FPEXC] = 0; |
17 | 46 |
#endif |
18 | 47 |
env->regs[15] = 0; |
48 |
tlb_flush(env, 1); |
|
19 | 49 |
} |
20 | 50 |
|
21 | 51 |
CPUARMState *cpu_arm_init(void) |
... | ... | |
27 | 57 |
return NULL; |
28 | 58 |
cpu_exec_init(env); |
29 | 59 |
cpu_reset(env); |
30 |
tlb_flush(env, 1); |
|
31 | 60 |
return env; |
32 | 61 |
} |
33 | 62 |
|
34 |
static inline void set_feature(CPUARMState *env, int feature) |
|
35 |
{ |
|
36 |
env->features |= 1u << feature; |
|
37 |
} |
|
38 |
|
|
39 | 63 |
struct arm_cpu_t { |
40 | 64 |
uint32_t id; |
41 | 65 |
const char *name; |
... | ... | |
74 | 98 |
cpu_abort(env, "Unknown CPU '%s'", name); |
75 | 99 |
return; |
76 | 100 |
} |
77 |
|
|
78 |
env->cp15.c0_cpuid = id; |
|
79 |
switch (id) { |
|
80 |
case ARM_CPUID_ARM926: |
|
81 |
set_feature(env, ARM_FEATURE_VFP); |
|
82 |
env->vfp.xregs[ARM_VFP_FPSID] = 0x41011090; |
|
83 |
break; |
|
84 |
case ARM_CPUID_ARM1026: |
|
85 |
set_feature(env, ARM_FEATURE_VFP); |
|
86 |
set_feature(env, ARM_FEATURE_AUXCR); |
|
87 |
env->vfp.xregs[ARM_VFP_FPSID] = 0x410110a0; |
|
88 |
break; |
|
89 |
default: |
|
90 |
cpu_abort(env, "Bad CPU ID: %x\n", id); |
|
91 |
break; |
|
92 |
} |
|
101 |
cpu_reset_model_id(env, id); |
|
93 | 102 |
} |
94 | 103 |
|
95 | 104 |
void cpu_arm_close(CPUARMState *env) |
Also available in: Unified diff