[PATCH 2/2] P2V: Thumb2 support

Dave Martin dave.martin at linaro.org
Mon Feb 14 09:59:47 EST 2011


Hi,

On Mon, Feb 14, 2011 at 2:48 PM, Nicolas Pitre <nicolas.pitre at linaro.org> wrote:
> On Mon, 14 Feb 2011, Dave Martin wrote:
>
>> On Sat, Feb 12, 2011 at 6:33 PM, Nicolas Pitre <nico at fluxnic.net> wrote:
>> >  __fixup_a_pv_table:
>> > +#ifdef CONFIG_THUMB2_KERNEL
>> > +#ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT
>> > +       lsls    r0, r6, #24
>> > +       lsr     r6, #8
>> > +       beq     1f
>> > +       clz     r7, r0
>> > +       lsrs    r0, #24
>> > +       lsls    r0, r7
>> > +       bic     r0, 0x0080
>> > +       lsrs    r7, #1
>> > +       orrcs   r0, #0x0080
>> > +       orr     r0, r0, r7, lsl #12
>> > +#endif
>> > +1:     lsls    r6, #24
>> > +       beq     4f
>> > +       clz     r7, r6
>> > +       lsrs    r6, #24
>> > +       lsls    r6, r7
>> > +       bic     r6, #0x0080
>> > +       lsrs    r7, #1
>> > +       orrcs   r6, #0x0080
>> > +       orr     r6, r6, r7, lsl #12
>> > +       orr     r6, #0x4000
>> > +       b       4f
>>
>> We do almost the same, complex, operation twice here ... can it be
>> factorised with a macro or something?  This may also help readability.
>>  Not essential though.
>
> I'm not sure.  There is potentially only 7 instructions which are common
> to both cases which would form a logical group.  Hiding that behind a
> macro doesn't save much here.

I was thinking more of avoiding mis-maintanance by ensuring there's
only one copy of the code to edit.  It wouldn't be a saving as such.
Either way, I agree that it's not that important, since it's not a lot
of code.

>> > +2:     add     r7, r3
>> > +#ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT
>> > +       ldrh    ip, [r7]
>> > +       tst     ip, 0x0400      @ the i bit tells us LS or MS byte
>>
>> Might be helpful to comment that we rely on TST resetting the C flag?
>
> The tst instruction doesn't touch the C flag.  It is already cleared by
> the loop condition.  But yes, a comment to that effect might be good.

You're right ... the comment would have helped me, then :)

>
>> > +       beq     3f
>> > +       cmp     r0, #0          @ set C flag, and ...
>> > +       biceq   ip, 0x0400      @ immediate zero value has a special encoding
>> > +       streqh  ip, [r7]        @ that requires the i bit cleared
>> > +#endif
>> > +3:     ldrh    ip, [r7, #2]
>> > +       and     ip, 0x8f00
>> > +       orrcc   ip, r6  @ mask in offset bits 31-24
>> > +       orrcs   ip, r0  @ mask in offset bits 23-16
>> > +       strh    ip, [r7, #2]
>> > +4:     cmp     r4, r5
>> > +        ldrcc   r7, [r4], #4   @ use branch for delay slot
>> > +        bcc    2b
>> > +        bx     lr
>> > +#else
>> >  #ifdef CONFIG_ARM_PATCH_PHYS_VIRT_16BIT
>> >        and     r0, r6, #255    @ offset bits 23-16
>> >        mov     r6, r6, lsr #8  @ offset bits 31-24
>> > @@ -513,6 +558,7 @@ __fixup_a_pv_table:
>> >        ldrcc   r7, [r4], #4    @ use branch for delay slot
>> >        bcc     2b
>> >        mov     pc, lr
>> > +#endif
>> >  ENDPROC(__fixup_a_pv_table)
>> >
>> >  ENTRY(fixup_pv_table)
>> > --
>> > 1.7.4
>> >
>>
>> Not sure I entirely all the implications of this code, and I haven't
>> tested it yet, but it looks sound if I've understood it correctly.
>>
>> Reviewed-by: Dave Martin <dave.martin at linaro.org>
>
> Thanks.  I'll also remove the s flag to those insns that don't need it
> for clarity.

OK, sounds fine.
---Dave



More information about the linux-arm-kernel mailing list