Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce433f80 authored by Chris Metcalf's avatar Chris Metcalf
Browse files

tile: avoid undefined behavior with regs[TREG_TP] etc



Recent compilers warn about accesses to arrays past the end,
which is supported for pt_regs and sigcontext with the
intended alias past the end of regs[] to sp, tp, and lr
using TREG_SP, TREG_TP, and TREG_LR.

Make the intended usage explict by providing an anonymous
union of regs[56] on the one hand, and a short __regs[53]
on the other followed by the sp, tp, and lr fields, so the
aliasing is done explicitly and is visible to the compiler.

Reviewed-by: default avatarJeff Epler <jepler@unpythonic.net>
Signed-off-by: default avatarChris Metcalf <cmetcalf@ezchip.com>
parent a5c1cb63
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -52,12 +52,16 @@ typedef uint_reg_t pt_reg_t;
 * system call or exception.  "struct sigcontext" has the same shape.
 */
struct pt_regs {
	union {
		/* Saved main processor registers; 56..63 are special. */
	/* tp, sp, and lr must immediately follow regs[] for aliasing. */
	pt_reg_t regs[53];
		pt_reg_t regs[56];
		struct {
			pt_reg_t __regs[53];
			pt_reg_t tp;		/* aliases regs[TREG_TP] */
			pt_reg_t sp;		/* aliases regs[TREG_SP] */
			pt_reg_t lr;		/* aliases regs[TREG_LR] */
		};
	};

	/* Saved special registers. */
	pt_reg_t pc;		/* stored in EX_CONTEXT_K_0 */
+10 −4
Original line number Diff line number Diff line
@@ -24,10 +24,16 @@
 * but is simplified since we know the fault is from userspace.
 */
struct sigcontext {
	__uint_reg_t gregs[53];	/* General-purpose registers.  */
	__extension__ union {
		/* General-purpose registers.  */
		__uint_reg_t gregs[56];
		__extension__ struct {
			__uint_reg_t __gregs[53];
			__uint_reg_t tp;	/* Aliases gregs[TREG_TP].  */
			__uint_reg_t sp;	/* Aliases gregs[TREG_SP].  */
			__uint_reg_t lr;	/* Aliases gregs[TREG_LR].  */
		};
	};
	__uint_reg_t pc;	/* Program counter.  */
	__uint_reg_t ics;	/* In Interrupt Critical Section?  */
	__uint_reg_t faultnum;	/* Fault number.  */