28 int get_psci_conduit_val()
const
30 if (p_psci_conduit.get_value() ==
"disabled") {
32 }
else if (p_psci_conduit.get_value() ==
"smc") {
34 }
else if (p_psci_conduit.get_value() ==
"hvc") {
42 void add_exclusive_ext(TlmPayload&
pl)
45 ext->add_hop(m_cpu.get_index());
46 pl.set_extension(
ext);
49 static uint64_t extract_data_from_payload(
const TlmPayload&
pl)
57 while (
ptr >=
pl.get_data_ptr()) {
65 cci::cci_param<unsigned int> p_mp_affinity;
66 cci::cci_param<bool> p_has_el2;
67 cci::cci_param<bool> p_has_el3;
68 cci::cci_param<bool> p_start_powered_off;
69 cci::cci_param<bool> p_en_pauth;
70 cci::cci_param<std::string> p_psci_conduit;
71 cci::cci_param<uint64_t> p_rvbar;
72 cci::cci_param<uint64_t> p_cntfrq_hz;
91 , p_mp_affinity(
"mp_affinity", 0,
"Multi-processor affinity value")
92 , p_has_el2(
"has_el2",
true,
"ARM virtualization extensions")
93 , p_has_el3(
"has_el3",
true,
"ARM secure-mode extensions")
94 , p_en_pauth(
"enable_pauth",
true,
"ARM pointer authentication")
95 , p_start_powered_off(
"start_powered_off",
false,
96 "Start and reset the CPU "
97 "in powered-off state")
98 , p_psci_conduit(
"psci_conduit",
"disabled",
99 "Set the QEMU PSCI conduit: "
100 "disabled->no conduit, "
101 "hvc->through hvc call, "
102 "smc->through smc call")
103 , p_rvbar(
"rvbar", 0
ull,
"Reset vector base address register value")
104 , p_cntfrq_hz(
"cntfrq_hz", 0
ull,
"CPU Generic Timer CNTFRQ in Hz")
110 , irq_timer_phys_out(
"irq_timer_phys_out")
111 , irq_timer_virt_out(
"irq_timer_virt_out")
112 , irq_timer_hyp_out(
"irq_timer_hyp_out")
113 , irq_timer_sec_out(
"irq_timer_sec_out")
114 , irq_maintenance_out(
"gicv3_maintenance_interrupt")
115 , irq_pmu_out(
"pmu_interrupt")
117 m_external_ev |= irq_in->default_event();
118 m_external_ev |= fiq_in->default_event();
119 m_external_ev |= virq_in->default_event();
120 m_external_ev |= vfiq_in->default_event();
123 void before_end_of_elaboration()
override
125 QemuCpuArm::before_end_of_elaboration();
128 cpu.set_aarch64_mode(
true);
130 if (!p_mp_affinity.is_default_value()) {
131 cpu.set_prop_int(
"mp-affinity", p_mp_affinity);
133 cpu.set_prop_bool(
"has_el2", p_has_el2);
134 cpu.set_prop_bool(
"has_el3", p_has_el3);
136 if (!p_en_pauth.is_default_value()) {
137 cpu.set_prop_bool(
"pauth", p_en_pauth);
139 cpu.set_prop_bool(
"start-powered-off", p_start_powered_off);
140 cpu.set_prop_int(
"psci-conduit", get_psci_conduit_val());
142 cpu.set_prop_int(
"rvbar", p_rvbar);
143 if (!p_cntfrq_hz.is_default_value()) {
144 cpu.set_prop_int(
"cntfrq", p_cntfrq_hz);
148 void end_of_elaboration()
override
150 QemuCpuArm::end_of_elaboration();
152 irq_in.
init(m_dev, 0);
153 fiq_in.
init(m_dev, 1);
154 virq_in.
init(m_dev, 2);
155 vfiq_in.
init(m_dev, 3);
157 irq_timer_phys_out.
init(m_dev, 0);
158 irq_timer_virt_out.
init(m_dev, 1);
159 irq_timer_hyp_out.
init(m_dev, 2);
160 irq_timer_sec_out.
init(m_dev, 3);
161 irq_maintenance_out.
init_named(m_dev,
"gicv3-maintenance-interrupt", 0);
162 irq_pmu_out.
init_named(m_dev,
"pmu-interrupt", 0);
165 void initiator_customize_tlm_payload(TlmPayload&
payload)
override
170 QemuCpu::initiator_customize_tlm_payload(
payload);
174 if (!
arm_cpu.is_in_exclusive_context()) {
191 void initiator_tidy_tlm_payload(TlmPayload&
payload)
override
198 QemuCpu::initiator_tidy_tlm_payload(
payload);
203 if (
ext ==
nullptr) {
208 auto sta =
ext->get_exclusive_store_status();
211 if (
sta == ExclusiveAccessTlmExtension::EXCLUSIVE_STORE_FAILURE) {
255 m_cpu.exit_loop_from_io();
void init_named(qemu::Device dev, const char *gpio_name, int gpio_idx)
Initialize this socket with a device, a GPIO namespace, and a GPIO index.
Definition qemu-initiator-signal-socket.h:155
void init(qemu::Device dev, int gpio_idx)
Initialize this socket with a device and a GPIO index.
Definition qemu-initiator-signal-socket.h:137
void init(qemu::Device dev, int gpio_idx)
Initialize this socket with a device and a GPIO index.
Definition qemu-target-signal-socket.h:60