On 22 August 2014 05:29, Fabian Aggeler <aggel...@ethz.ch> wrote: > For GICs with Security Extensions Non-secure reads have a restricted > view on the current running priority. > > Signed-off-by: Fabian Aggeler <aggel...@ethz.ch> > --- > hw/intc/arm_gic.c | 17 ++++++++++++++++- > hw/intc/gic_internal.h | 1 + > 2 files changed, 17 insertions(+), 1 deletion(-) > > diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c > index 57021fd..473b8f4 100644 > --- a/hw/intc/arm_gic.c > +++ b/hw/intc/arm_gic.c > @@ -285,6 +285,21 @@ void gic_set_cpu_control(GICState *s, int cpu, > uint32_t value) > } > } > > +uint8_t gic_get_running_priority(GICState *s, int cpu) > +{ > + if (s->security_extn && ns_access()) { > + if (s->running_priority[cpu] & 0x80) {
+ /* Running priority in upper half, return Non-secure view */ > + return s->running_priority[cpu] << 1; > This needs to be masked otherwise it could return a value with rsvd bits set. > + } else { > + /* Running priority in lower half, RAZ */ > + return 0; > + } > + } else { > + return s->running_priority[cpu]; > + } > +} > + > void gic_complete_irq(GICState *s, int cpu, int irq) > { > int update = 0; > @@ -801,7 +816,7 @@ static uint32_t gic_cpu_read(GICState *s, int cpu, int > offset) > case 0x0c: /* Acknowledge */ > return gic_acknowledge_irq(s, cpu); > case 0x14: /* Running Priority */ > - return s->running_priority[cpu]; > + return gic_get_running_priority(s, cpu); > case 0x18: /* Highest Pending Interrupt */ > return s->current_pending[cpu]; > case 0x1c: /* Aliased Binary Point */ > diff --git a/hw/intc/gic_internal.h b/hw/intc/gic_internal.h > index e9814f4..433d75e 100644 > --- a/hw/intc/gic_internal.h > +++ b/hw/intc/gic_internal.h > @@ -78,6 +78,7 @@ void gic_init_irqs_and_distributor(GICState *s, int > num_irq); > void gic_set_priority(GICState *s, int cpu, int irq, uint8_t val); > uint32_t gic_get_cpu_control(GICState *s, int cpu); > void gic_set_cpu_control(GICState *s, int cpu, uint32_t value); > +uint8_t gic_get_running_priority(GICState *s, int cpu); > > > static inline bool gic_test_pending(GICState *s, int irq, int cm) > -- > 1.8.3.2 > >