Re: [PATCH v2] MIPS: Fix MAX_REG_OFFSET and remove zero-length struct member
From: Thorsten Blum
Date: Fri Apr 18 2025 - 09:39:17 EST
On 18. Apr 2025, at 14:44, Maciej W. Rozycki wrote:
> On Fri, 18 Apr 2025, Thorsten Blum wrote:
>>> Though the fix is incorrect for CPU_CAVIUM_OCTEON, because it doesn't
>>> allow one to access the second half of the last register, and I find it
>>> exceedingly complex anyway. Just:
>>>
>>> #define MAX_REG_OFFSET \
>>> (offsetof(struct pt_regs, __last) - sizeof(unsigned long))
>>>
>>> will do (as `regs_get_register' operates on `unsigned long' quantities).
>>
>> Does regs_get_register() even work for CPU_CAVIUM_OCTEON when accessing
>> the last two registers because they're both ULL, not UL? (independent of
>> my patch)
>
> Or rather two arrays of registers. With 32-bit configurations their
> contents have to be retrieved by pieces. I don't know if it's handled by
> the caller(s) though as I'm not familiar with this interface.
Ah, CPU_CAVIUM_OCTEON seems to be 64-bit only, so there's no difference
between UL and ULL. Then both my patch and your suggestion:
#define MAX_REG_OFFSET (offsetof(struct pt_regs, __last) - sizeof(unsigned long))
should be fine.
I still prefer my approach without '__last[0]' because it also silences
the following false-positive Coccinelle warning, which is how I stumbled
upon this in the first place:
./ptrace.h:51:15-21: WARNING use flexible-array member instead
Would it make sense to also change the register arrays 'mpl' and 'mtp'
from ULL to UL? ULL seems unnecessarily confusing to me.
Thanks,
Thorsten