[DTrace-devel] [PATCH] cg: add a function to scalarize pointers

Nick Alcock nick.alcock at oracle.com
Fri Feb 24 22:12:42 UTC 2023


On 24 Feb 2023, Kris Van Hees via DTrace-devel outgrape:

> Withdrawing this for now...  No longer needed (for now).

Well, I'd been putting off turning it into a function for no good
reason, so when you do want it, consider it

Reviewed-by: Nick Alcock <nick.alcock at oracle.com>

> On Fri, Feb 24, 2023 at 11:11:22AM -0500, Kris Van Hees via DTrace-devel wrote:
>> The logic to scalarize a pointer was already present in dt_cg_typecast()
>> for ALLOCA and DPTR pointers, but new use cases are emerging.  Move the
>> logic to dt_cg_scalarize().
>> 
>> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
>> ---
>>  libdtrace/dt_cg.c | 37 ++++++++++++++++++++++++++-----------
>>  1 file changed, 26 insertions(+), 11 deletions(-)
>> 
>> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
>> index 6cf311be..60e05642 100644
>> --- a/libdtrace/dt_cg.c
>> +++ b/libdtrace/dt_cg.c
>> @@ -2739,6 +2739,31 @@ dt_cg_store(dt_node_t *src, dt_irlist_t *dlp, dt_regset_t *drp, dt_node_t *dst)
>>  		dt_regset_free(drp, dreg);
>>  }
>>  
>> +/*
>> + * Scalarize a pointer (turn it into a regular scalar).  This is often needed
>> + * to ensure that the BPF verifier will no longer treat it as a pointer and
>> + * therefore enforce boundary checking.
>> + *
>> + * There is no way back - once a value is scalarized it cannot be returned to
>> + * being a pointer that is recognized by the BPF verifier.
>> + */
>> +static void
>> +dt_cg_scalarize(const dt_node_t *src, const dt_node_t *dst,
>> +		dt_irlist_t *dlp, dt_regset_t *drp)
>> +{
>> +	int	mst;
>> +
>> +	if ((mst = dt_regset_alloc(drp)) == -1)
>> +		longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
>> +
>> +	emit(dlp,  BPF_LOAD(BPF_DW, mst, BPF_REG_FP, DT_STK_DCTX));
>> +	emit(dlp,  BPF_LOAD(BPF_DW, mst, mst, DCTX_MST));
>> +	emit(dlp,  BPF_STORE(BPF_DW, mst, DMST_SCALARIZER, src->dn_reg));
>> +	emit(dlp,  BPF_LOAD(BPF_DW, dst->dn_reg, mst, DMST_SCALARIZER));
>> +
>> +	dt_regset_free(drp, mst);
>> +}
>> +
>>  /*
>>   * Generate code for a typecast or for argument promotion from the type of the
>>   * actual to the type of the formal.  We need to generate code for casts when
>> @@ -2761,17 +2786,7 @@ dt_cg_typecast(const dt_node_t *src, const dt_node_t *dst,
>>  
>>  	if (dt_node_is_arith(dst) && dt_node_is_pointer(src) &&
>>  	    (src->dn_flags & (DT_NF_ALLOCA | DT_NF_DPTR))) {
>> -		int	mst;
>> -
>> -		if ((mst = dt_regset_alloc(drp)) == -1)
>> -			longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
>> -
>> -		emit(dlp,  BPF_LOAD(BPF_DW, mst, BPF_REG_FP, DT_STK_DCTX));
>> -		emit(dlp,  BPF_LOAD(BPF_DW, mst, mst, DCTX_MST));
>> -		emit(dlp,  BPF_STORE(BPF_DW, mst, DMST_SCALARIZER, src->dn_reg));
>> -		emit(dlp,  BPF_LOAD(BPF_DW, dst->dn_reg, mst, DMST_SCALARIZER));
>> -
>> -		dt_regset_free(drp, mst);
>> +		dt_cg_scalarize(src, dst, dlp, drp);
>>  	} else {
>>  		int	srcsigned = src->dn_flags & DT_NF_SIGNED;
>>  		int	dstsigned = dst->dn_flags & DT_NF_SIGNED;
>> -- 
>> 2.39.1
>> 
>> 
>> _______________________________________________
>> DTrace-devel mailing list
>> DTrace-devel at oss.oracle.com
>> https://oss.oracle.com/mailman/listinfo/dtrace-devel
>
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel

-- 
NULL && (void)



More information about the DTrace-devel mailing list