[RTEMS Project] #2460: arm-gic.h - GIC_ID_TO_TWO_BITS_REG_OFFSET(id) incorrectly defined

RTEMS trac trac at rtems.org
Thu Nov 5 19:53:14 UTC 2015


#2460: arm-gic.h - GIC_ID_TO_TWO_BITS_REG_OFFSET(id) incorrectly defined
----------------------+--------------------
 Reporter:  budhe888  |      Owner:
     Type:  defect    |     Status:  new
 Priority:  normal    |  Milestone:  4.11.1
Component:  bsps      |    Version:  4.11
 Severity:  normal    |   Keywords:
----------------------+--------------------
 This bug pertains to the ARM Generic Interrupt Controller (GIC) register
 utility functions in

 {{{c/src/lib/libbsp/arm/shared/include/arm-gic.h}}}

 The following routines all use the macro
 {{{GIC_ID_TO_TWO_BITS_REG_OFFSET(id)}}}:

 {{{
 gic_id_get_handling_mode
 gic_id_set_handling_mode
 gic_id_get_trigger_mode
 gic_id_set_trigger_mode
 }}}

 These routines set the {{{GIC_ICFGRn}}} set of registers. These registers
 have 2-bit bit fields. Let's take the trigger mode routines as an example
 of the bug, but it applies to the handling mode as well. The GIC
 specification from ARM states that for a particular interrupt ID ''m'' the
 register ''n'' and bit field ''F'' is found by:

 ''n = m DIV 16''
 ''F = m MOD 16''

 And the bit location in register ''n'' is defined as ''[2F+1:2F]''.
 However, the macro  {{{GIC_ID_TO_TWO_BITS_REG_OFFSET(id)}}} and the
 routines that use it, set bits ''[F+1:F]''.

 I have tested this by using the set_trigger_mode routine to set an
 interrupt to be edge triggered, but the correct bit does not get set, and
 the interrupt still behaves in a level triggered fashion. When I adjust
 the macro to have a {{{<< 1}}} it works correctly.

 If someone can verify my logic at least, then I can submit a tested patch.

--
Ticket URL: <http://devel.rtems.org/ticket/2460>
RTEMS Project <http://www.rtems.org/>
RTEMS Project


More information about the bugs mailing list