@@ -127,7 +127,7 @@ static bool synth_event_match(const char *system, const char *event,
127
127
128
128
struct synth_trace_event {
129
129
struct trace_entry ent ;
130
- u64 fields [];
130
+ union trace_synth_field fields [];
131
131
};
132
132
133
133
static int synth_event_define_fields (struct trace_event_call * call )
@@ -321,19 +321,19 @@ static const char *synth_field_fmt(char *type)
321
321
322
322
static void print_synth_event_num_val (struct trace_seq * s ,
323
323
char * print_fmt , char * name ,
324
- int size , u64 val , char * space )
324
+ int size , union trace_synth_field * val , char * space )
325
325
{
326
326
switch (size ) {
327
327
case 1 :
328
- trace_seq_printf (s , print_fmt , name , ( u8 ) val , space );
328
+ trace_seq_printf (s , print_fmt , name , val -> as_u8 , space );
329
329
break ;
330
330
331
331
case 2 :
332
- trace_seq_printf (s , print_fmt , name , ( u16 ) val , space );
332
+ trace_seq_printf (s , print_fmt , name , val -> as_u16 , space );
333
333
break ;
334
334
335
335
case 4 :
336
- trace_seq_printf (s , print_fmt , name , ( u32 ) val , space );
336
+ trace_seq_printf (s , print_fmt , name , val -> as_u32 , space );
337
337
break ;
338
338
339
339
default :
@@ -374,36 +374,26 @@ static enum print_line_t print_synth_event(struct trace_iterator *iter,
374
374
/* parameter values */
375
375
if (se -> fields [i ]-> is_string ) {
376
376
if (se -> fields [i ]-> is_dynamic ) {
377
- u32 offset , data_offset ;
378
- char * str_field ;
379
-
380
- offset = (u32 )entry -> fields [n_u64 ];
381
- data_offset = offset & 0xffff ;
382
-
383
- str_field = (char * )entry + data_offset ;
377
+ union trace_synth_field * data = & entry -> fields [n_u64 ];
384
378
385
379
trace_seq_printf (s , print_fmt , se -> fields [i ]-> name ,
386
380
STR_VAR_LEN_MAX ,
387
- str_field ,
381
+ ( char * ) entry + data -> as_dynamic . offset ,
388
382
i == se -> n_fields - 1 ? "" : " " );
389
383
n_u64 ++ ;
390
384
} else {
391
385
trace_seq_printf (s , print_fmt , se -> fields [i ]-> name ,
392
386
STR_VAR_LEN_MAX ,
393
- (char * )& entry -> fields [n_u64 ],
387
+ (char * )& entry -> fields [n_u64 ]. as_u64 ,
394
388
i == se -> n_fields - 1 ? "" : " " );
395
389
n_u64 += STR_VAR_LEN_MAX / sizeof (u64 );
396
390
}
397
391
} else if (se -> fields [i ]-> is_stack ) {
398
- u32 offset , data_offset , len ;
399
392
unsigned long * p , * end ;
393
+ union trace_synth_field * data = & entry -> fields [n_u64 ];
400
394
401
- offset = (u32 )entry -> fields [n_u64 ];
402
- data_offset = offset & 0xffff ;
403
- len = offset >> 16 ;
404
-
405
- p = (void * )entry + data_offset ;
406
- end = (void * )p + len - (sizeof (long ) - 1 );
395
+ p = (void * )entry + data -> as_dynamic .offset ;
396
+ end = (void * )p + data -> as_dynamic .len - (sizeof (long ) - 1 );
407
397
408
398
trace_seq_printf (s , "%s=STACK:\n" , se -> fields [i ]-> name );
409
399
@@ -419,13 +409,13 @@ static enum print_line_t print_synth_event(struct trace_iterator *iter,
419
409
print_synth_event_num_val (s , print_fmt ,
420
410
se -> fields [i ]-> name ,
421
411
se -> fields [i ]-> size ,
422
- entry -> fields [n_u64 ],
412
+ & entry -> fields [n_u64 ],
423
413
space );
424
414
425
415
if (strcmp (se -> fields [i ]-> type , "gfp_t" ) == 0 ) {
426
416
trace_seq_puts (s , " (" );
427
417
trace_print_flags_seq (s , "|" ,
428
- entry -> fields [n_u64 ],
418
+ entry -> fields [n_u64 ]. as_u64 ,
429
419
__flags );
430
420
trace_seq_putc (s , ')' );
431
421
}
@@ -454,21 +444,16 @@ static unsigned int trace_string(struct synth_trace_event *entry,
454
444
int ret ;
455
445
456
446
if (is_dynamic ) {
457
- u32 data_offset ;
447
+ union trace_synth_field * data = & entry -> fields [ * n_u64 ] ;
458
448
459
- data_offset = struct_size (entry , fields , event -> n_u64 );
460
- data_offset += data_size ;
461
-
462
- len = fetch_store_strlen ((unsigned long )str_val );
463
-
464
- data_offset |= len << 16 ;
465
- * (u32 * )& entry -> fields [* n_u64 ] = data_offset ;
449
+ data -> as_dynamic .offset = struct_size (entry , fields , event -> n_u64 ) + data_size ;
450
+ data -> as_dynamic .len = fetch_store_strlen ((unsigned long )str_val );
466
451
467
452
ret = fetch_store_string ((unsigned long )str_val , & entry -> fields [* n_u64 ], entry );
468
453
469
454
(* n_u64 )++ ;
470
455
} else {
471
- str_field = (char * )& entry -> fields [* n_u64 ];
456
+ str_field = (char * )& entry -> fields [* n_u64 ]. as_u64 ;
472
457
473
458
#ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
474
459
if ((unsigned long )str_val < TASK_SIZE )
@@ -492,6 +477,7 @@ static unsigned int trace_stack(struct synth_trace_event *entry,
492
477
unsigned int data_size ,
493
478
unsigned int * n_u64 )
494
479
{
480
+ union trace_synth_field * data = & entry -> fields [* n_u64 ];
495
481
unsigned int len ;
496
482
u32 data_offset ;
497
483
void * data_loc ;
@@ -515,8 +501,9 @@ static unsigned int trace_stack(struct synth_trace_event *entry,
515
501
memcpy (data_loc , stack , len );
516
502
517
503
/* Fill in the field that holds the offset/len combo */
518
- data_offset |= len << 16 ;
519
- * (u32 * )& entry -> fields [* n_u64 ] = data_offset ;
504
+
505
+ data -> as_dynamic .offset = data_offset ;
506
+ data -> as_dynamic .len = len ;
520
507
521
508
(* n_u64 )++ ;
522
509
@@ -592,19 +579,19 @@ static notrace void trace_event_raw_event_synth(void *__data,
592
579
593
580
switch (field -> size ) {
594
581
case 1 :
595
- * ( u8 * ) & entry -> fields [n_u64 ] = (u8 )val ;
582
+ entry -> fields [n_u64 ]. as_u8 = (u8 )val ;
596
583
break ;
597
584
598
585
case 2 :
599
- * ( u16 * ) & entry -> fields [n_u64 ] = (u16 )val ;
586
+ entry -> fields [n_u64 ]. as_u16 = (u16 )val ;
600
587
break ;
601
588
602
589
case 4 :
603
- * ( u32 * ) & entry -> fields [n_u64 ] = (u32 )val ;
590
+ entry -> fields [n_u64 ]. as_u32 = (u32 )val ;
604
591
break ;
605
592
606
593
default :
607
- entry -> fields [n_u64 ] = val ;
594
+ entry -> fields [n_u64 ]. as_u64 = val ;
608
595
break ;
609
596
}
610
597
n_u64 ++ ;
@@ -1791,19 +1778,19 @@ int synth_event_trace(struct trace_event_file *file, unsigned int n_vals, ...)
1791
1778
1792
1779
switch (field -> size ) {
1793
1780
case 1 :
1794
- * ( u8 * ) & state .entry -> fields [n_u64 ] = (u8 )val ;
1781
+ state .entry -> fields [n_u64 ]. as_u8 = (u8 )val ;
1795
1782
break ;
1796
1783
1797
1784
case 2 :
1798
- * ( u16 * ) & state .entry -> fields [n_u64 ] = (u16 )val ;
1785
+ state .entry -> fields [n_u64 ]. as_u16 = (u16 )val ;
1799
1786
break ;
1800
1787
1801
1788
case 4 :
1802
- * ( u32 * ) & state .entry -> fields [n_u64 ] = (u32 )val ;
1789
+ state .entry -> fields [n_u64 ]. as_u32 = (u32 )val ;
1803
1790
break ;
1804
1791
1805
1792
default :
1806
- state .entry -> fields [n_u64 ] = val ;
1793
+ state .entry -> fields [n_u64 ]. as_u64 = val ;
1807
1794
break ;
1808
1795
}
1809
1796
n_u64 ++ ;
@@ -1884,19 +1871,19 @@ int synth_event_trace_array(struct trace_event_file *file, u64 *vals,
1884
1871
1885
1872
switch (field -> size ) {
1886
1873
case 1 :
1887
- * ( u8 * ) & state .entry -> fields [n_u64 ] = (u8 )val ;
1874
+ state .entry -> fields [n_u64 ]. as_u8 = (u8 )val ;
1888
1875
break ;
1889
1876
1890
1877
case 2 :
1891
- * ( u16 * ) & state .entry -> fields [n_u64 ] = (u16 )val ;
1878
+ state .entry -> fields [n_u64 ]. as_u16 = (u16 )val ;
1892
1879
break ;
1893
1880
1894
1881
case 4 :
1895
- * ( u32 * ) & state .entry -> fields [n_u64 ] = (u32 )val ;
1882
+ state .entry -> fields [n_u64 ]. as_u32 = (u32 )val ;
1896
1883
break ;
1897
1884
1898
1885
default :
1899
- state .entry -> fields [n_u64 ] = val ;
1886
+ state .entry -> fields [n_u64 ]. as_u64 = val ;
1900
1887
break ;
1901
1888
}
1902
1889
n_u64 ++ ;
@@ -2031,19 +2018,19 @@ static int __synth_event_add_val(const char *field_name, u64 val,
2031
2018
} else {
2032
2019
switch (field -> size ) {
2033
2020
case 1 :
2034
- * ( u8 * ) & trace_state -> entry -> fields [field -> offset ] = (u8 )val ;
2021
+ trace_state -> entry -> fields [field -> offset ]. as_u8 = (u8 )val ;
2035
2022
break ;
2036
2023
2037
2024
case 2 :
2038
- * ( u16 * ) & trace_state -> entry -> fields [field -> offset ] = (u16 )val ;
2025
+ trace_state -> entry -> fields [field -> offset ]. as_u16 = (u16 )val ;
2039
2026
break ;
2040
2027
2041
2028
case 4 :
2042
- * ( u32 * ) & trace_state -> entry -> fields [field -> offset ] = (u32 )val ;
2029
+ trace_state -> entry -> fields [field -> offset ]. as_u32 = (u32 )val ;
2043
2030
break ;
2044
2031
2045
2032
default :
2046
- trace_state -> entry -> fields [field -> offset ] = val ;
2033
+ trace_state -> entry -> fields [field -> offset ]. as_u64 = val ;
2047
2034
break ;
2048
2035
}
2049
2036
}
0 commit comments