@@ -140,7 +140,10 @@ static int str_ir_post(const struct func *func, struct node *n,
140140 ir_emit_ldbp (pb -> ir , BPF_REG_1 , n -> sym -> irs .stack );
141141 ir_emit_insn (ir , MOV_IMM ((int32_t )type_sizeof (n -> sym -> type )), BPF_REG_2 , 0 );
142142 ir_emit_sym_to_reg (ir , BPF_REG_3 , ptr -> sym );
143- ir_emit_insn (ir , CALL (BPF_FUNC_probe_read_kernel_str ), 0 , 0 );
143+ if (ptr -> sym -> irs .hint .user )
144+ ir_emit_insn (ir , CALL (BPF_FUNC_probe_read_user_str ), 0 , 0 );
145+ else
146+ ir_emit_insn (ir , CALL (BPF_FUNC_probe_read_kernel_str ), 0 , 0 );
144147 return 0 ;
145148}
146149
@@ -153,7 +156,7 @@ static int mem_ir_post(const struct func *func, struct node *n,
153156 ir_init_sym (pb -> ir , n -> sym );
154157
155158 ir_emit_sym_to_reg (pb -> ir , BPF_REG_3 , ptr -> sym );
156- ir_emit_read_to_sym (pb -> ir , n -> sym , BPF_REG_3 );
159+ ir_emit_read_to_sym (pb -> ir , n -> sym , BPF_REG_3 , ptr -> sym -> irs . hint . user );
157160 return 0 ;
158161}
159162
@@ -222,6 +225,36 @@ static struct func str_func = {
222225 .ir_post = str_ir_post ,
223226};
224227
228+ struct type t_uptr_func = {
229+ .ttype = T_FUNC ,
230+ .func = { .type = & t_void , .args = f_1arg },
231+ };
232+
233+ static int uptr_ir_post (const struct func * func , struct node * n ,
234+ struct ply_probe * pb )
235+ {
236+ struct node * child = n -> expr .args ;
237+
238+ ir_init_sym (pb -> ir , n -> sym );
239+ ir_emit_sym_to_sym (pb -> ir , n -> sym , child -> sym );
240+ n -> sym -> irs .hint .user = 1 ;
241+ return 0 ;
242+ }
243+
244+ static int uptr_type_infer (const struct func * func , struct node * n )
245+ {
246+ struct node * arg = n -> expr .args ;
247+
248+ n -> sym -> type = arg -> sym -> type ;
249+ return 0 ;
250+ }
251+
252+ static struct func uptr_func = {
253+ .name = "uptr" ,
254+ .type = & t_uptr_func ,
255+ .type_infer = uptr_type_infer ,
256+ .ir_post = uptr_ir_post ,
257+ };
225258
226259static int struct_deref_rewrite (const struct func * func , struct node * n ,
227260 struct ply_probe * pb )
@@ -424,7 +457,7 @@ static int deref_ir_post(const struct func *func, struct node *n,
424457 return 0 ;
425458
426459 ir_emit_sym_to_reg (pb -> ir , BPF_REG_0 , ptr -> sym );
427- ir_emit_read_to_sym (pb -> ir , n -> sym , BPF_REG_0 );
460+ ir_emit_read_to_sym (pb -> ir , n -> sym , BPF_REG_0 , ptr -> sym -> irs . hint . user );
428461 return 0 ;
429462}
430463
@@ -603,7 +636,7 @@ static int map_ir_post(const struct func *func, struct node *n,
603636 lhit = ir_alloc_label (pb -> ir );
604637
605638 ir_emit_insn (pb -> ir , JMP_IMM (BPF_JEQ , 0 , lmiss ), BPF_REG_0 , 0 );
606- ir_emit_read_to_sym (pb -> ir , n -> sym , BPF_REG_0 );
639+ ir_emit_read_to_sym (pb -> ir , n -> sym , BPF_REG_0 , 0 );
607640 ir_emit_insn (pb -> ir , JMP_IMM (BPF_JA , 0 , lhit ), 0 , 0 );
608641
609642 ir_emit_label (pb -> ir , lmiss );
@@ -948,6 +981,7 @@ void memory_init(void)
948981 built_in_register (& strcmp_func );
949982 built_in_register (& str_func );
950983 built_in_register (& mem_func );
984+ built_in_register (& uptr_func );
951985 built_in_register (& struct_deref_func );
952986 built_in_register (& struct_dot_func );
953987 built_in_register (& deref_func );
0 commit comments