Good to know. Thanks Laurent.
On Oct 17, 2014 10:27 AM, "Laurent Desnogues" <
address@hidden> wrote:
On Fri, Oct 17, 2014 at 5:20 PM, Greg Bellows <address@hidden> wrote:
> So, I believe I reproduced the issue with gcc-4.4. 4.6 and 4.7 appear to
> work fine. I tried adding the "-fms-extensions" flag through configure's
> "--extra-cflags" but it dow not appear to work. Not sure if this is a
> configure/make issue or if anonymous unions/structs are still disallowed.
>
> I'll look into other options in case we deem it important to support older
> compilers.
gcc 4.4 is what comes with RHEL6/CentOS 6 so IMHO it should be
supported.
Laurent
> Greg
>
> On 17 October 2014 08:37, Greg Bellows <address@hidden> wrote:
>>
>> Hmmm, I had not encountered this as I am using a new compiler which is
>> presumeably using -std=c11. Here is what I am using:
>>
>> > gcc --version
>> gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
>>
>> A quick search on gcc 4.4 shows that a different flag may be needed
>> (-fms-extensions). There is also a special flag for 4.6 apparently.
>>
>> One question I have is how old of a toolchain do we support? Peter?
>>
>> In the meantime, I'll try and reproduce on my end and try the additional
>> flags.
>>
>> Thanks for pointing this out.
>>
>> Greg
>>
>> On 16 October 2014 20:32, Edgar E. Iglesias <address@hidden>
>> wrote:
>>>
>>> On Fri, Oct 10, 2014 at 11:03:22AM -0500, Greg Bellows wrote:
>>> > From: Fabian Aggeler <address@hidden>
>>> >
>>> > Prepare ARMCPRegInfo to support specifying two fieldoffsets per
>>> > register definition. This will allow us to keep one register
>>> > definition for banked registers (different offsets for secure/
>>> > non-secure world).
>>>
>>> Hi Greg,
>>>
>>> I gave the series a try through my auto-tester and it fails on this
>>> patch with gcc-4.4:
>>> $ gcc-4.4 --version
>>> gcc-4.4 (Ubuntu/Linaro 4.4.7-8ubuntu1) 4.4.7
>>>
>>> We might need to pass additional options to gcc for the
>>> anonymous structs/unions or use a different approach.
>>>
>>> Cheers,
>>> Edgar
>>>
>>>
>>>
>>> >
>>> > Also added secure state tracking field and flags. This allows for
>>> > identification of the register info secure state.
>>> >
>>> > Signed-off-by: Fabian Aggeler <address@hidden>
>>> > Signed-off-by: Greg Bellows <address@hidden>
>>> >
>>> > ==========
>>> >
>>> > v5 -> v6
>>> > - Separate out secure CPREG flags
>>> > - Add convenience macro for testing flags
>>> > - Removed extraneous newline
>>> > - Move add_cpreg_to_hashtable() functionality to a later commit for
>>> > which it is
>>> > dependent on.
>>> > - Added comment explaining fieldoffset padding
>>> >
>>> > v4 -> v5
>>> > - Added ARM CP register secure and non-secure bank flags
>>> > - Added setting of secure and non-secure flags furing registration
>>> > ---
>>> > target-arm/cpu.h | 42 +++++++++++++++++++++++++++++++++++++++---
>>> > 1 file changed, 39 insertions(+), 3 deletions(-)
>>> >
>>> > diff --git a/target-arm/cpu.h b/target-arm/cpu.h
>>> > index 59414f3..4d8de9e 100644
>>> > --- a/target-arm/cpu.h
>>> > +++ b/target-arm/cpu.h
>>> > @@ -985,6 +985,24 @@ enum {
>>> > ARM_CP_STATE_BOTH = 2,
>>> > };
>>> >
>>> > +/* ARM CP register secure state flags. These flags identify security
>>> > state
>>> > + * attributes for a given CP register entry.
>>> > + * The existence of both or neither secure and non-secure flags
>>> > indicates that
>>> > + * the register has both a secure and non-secure hash entry. A single
>>> > one of
>>> > + * these flags causes the register to only be hashed for the specified
>>> > + * security state.
>>> > + * Although definitions may have any combination of the S/NS bits,
>>> > each
>>> > + * registered entry will only have one to identify whether the entry
>>> > is secure
>>> > + * or non-secure.
>>> > + */
>>> > +enum {
>>> > + ARM_CP_SECSTATE_S = (1 << 0), /* bit[0]: Secure state register
>>> > */
>>> > + ARM_CP_SECSTATE_NS = (1 << 1), /* bit[1]: Non-secure state
>>> > register */
>>> > +};
>>> > +
>>> > +/* Convenience macro for checking for a specific bit */
>>> > +#define ARM_CP_SECSTATE_TEST(_ri, _flag) (((_ri)->secure & (_flag)) ==
>>> > (_flag))
>>> > +
>>> > /* Return true if cptype is a valid type field. This is used to try to
>>> > * catch errors where the sentinel has been accidentally left off the
>>> > end
>>> > * of a list of registers.
>>> > @@ -1119,6 +1137,8 @@ struct ARMCPRegInfo {
>>> > int type;
>>> > /* Access rights: PL*_[RW] */
>>> > int access;
>>> > + /* Security state: ARM_CP_SECSTATE_* bits/values */
>>> > + int secure;
>>> > /* The opaque pointer passed to define_arm_cp_regs_with_opaque()
>>> > when
>>> > * this register was defined: can be used to hand data through to
>>> > the
>>> > * register read/write functions, since they are passed the
>>> > ARMCPRegInfo*.
>>> > @@ -1128,12 +1148,28 @@ struct ARMCPRegInfo {
>>> > * fieldoffset is non-zero, the reset value of the register.
>>> > */
>>> > uint64_t resetvalue;
>>> > - /* Offset of the field in CPUARMState for this register. This is
>>> > not
>>> > - * needed if either:
>>> > + /* Offsets of the fields (secure/non-secure) in CPUARMState for
>>> > this
>>> > + * register. The array will be accessed by the ns bit which means
>>> > the
>>> > + * secure instance has to be at [0] while the non-secure instance
>>> > must be
>>> > + * at [1]. If a register is not banked .fieldoffset can be used,
>>> > which maps
>>> > + * to the non-secure bank.
>>> > + *
>>> > + * Extra padding is added to align the default fieldoffset field
>>> > with the
>>> > + * non-secure bank_fieldoffsets entry. This is necessary for
>>> > maintaining
>>> > + * the same storage offset when AArch64 and banked AArch32 are
>>> > seperately
>>> > + * defined.
>>> > + *
>>> > + * This is not needed if either:
>>> > * 1. type is ARM_CP_CONST or one of the ARM_CP_SPECIALs
>>> > * 2. both readfn and writefn are specified
>>> > */
>>> > - ptrdiff_t fieldoffset; /* offsetof(CPUARMState, field) */
>>> > + union { /* offsetof(CPUARMState, field) */
>>> > + struct {
>>> > + ptrdiff_t _fieldoffset_padding;
>>> > + ptrdiff_t fieldoffset;
>>> > + };
>>> > + ptrdiff_t bank_fieldoffsets[2];
>>> > + };
>>> > /* Function for making any access checks for this register in
>>> > addition to
>>> > * those specified by the 'access' permissions bits. If NULL, no
>>> > extra
>>> > * checks required. The access check is performed at runtime, not
>>> > at
>>> > --
>>> > 1.8.3.2
>>> >
>>
>>
>