[PATCH 4/8] regcache: Zero-extend small registers described by a register map.
John Baldwin
jhb@FreeBSD.org
Wed Dec 22 21:20:42 GMT 2021
On 10/26/21 2:17 PM, John Baldwin wrote:
> On 10/19/21 9:31 AM, John Baldwin wrote:
>> On 10/19/21 1:36 AM, Andrew Burgess wrote:
>>> * John Baldwin <jhb@FreeBSD.org> [2021-07-14 07:07:37 -0700]:
>>>
>>>> When registers are supplied via regcache_supply_register from a register
>>>> block described by a register map, registers may be stored in slots smaller
>>>> than GDB's native register size (e.g. x86 segment registers are 16 bits,
>>>> but the GDB registers for those are 32-bits). regcache_collect_regset
>>>> is careful to zero-extend slots larger than a register size, but
>>>> regcache_supply_regset just used regcache::raw_supply_part and did not
>>>> initialize the upper bytes of a register value.
>>>>
>>>> trad_frame_set_reg_regmap assumes these semantics (zero-extending
>>>> short registers) as I had misread the implementation of
>>>> regcache::transfer_regset and assumed it zero-extended short
>>>> registers. In my specific use case (x86 segment registers stored as
>>>> 16-bit values), I need the semantics of zero-extending a register
>>>> value in a smaller slot.
>>>
>>> I don't claim to know if anyone relies on the old behaviour of
>>> transfer_regset_register, but the change you propose seems reasonable.
>>>
>>> However, the second paragraph of your commit message really confuses
>>> me.
>>>
>>> It seems to say that a mistake was made in trad_frame_set_reg_regmap,
>>> and so transfer_regset_register should change, then you just jump to
>>> saying you need the zero extend. I don't really understand the
>>> connection between all these ideas.
>
> Here's an updated log message that hopefully is clearer:
>
> regcache: Zero-extend small registers described by a register map.
>
> When registers are supplied via regcache_supply_register from a
> register block described by a register map, registers may be stored in
> slots smaller than GDB's native register size (e.g. x86 segment
> registers are 16 bits, but the GDB registers for those are 32-bits).
> regcache_collect_regset is careful to zero-extend slots larger than a
> register size, but regcache_supply_regset just used
> regcache::raw_supply_part and did not initialize the upper bytes of a
> register value.
>
> trad_frame_set_reg_regmap assumes these semantics (zero-extending
> short registers). Upcoming patches also require these semantics for
> handling x86 segment register values stored in 16-bit slots on
> FreeBSD. Note that architecturally x86 segment registers are 16 bits,
> but the x86 gdb architectures treat these registers as 32 bits.
Ping on the updated commit log message.
--
John Baldwin
More information about the Gdb-patches
mailing list