39
39
* Espen Skoglund <[email protected] >
40
40
* Francois H. Theron <[email protected] >
41
41
*/
42
+
43
+ #include <asm/unaligned.h>
42
44
#include <linux/kernel.h>
43
45
#include <linux/module.h>
44
46
#include <linux/slab.h>
@@ -237,10 +239,10 @@ u64 nfp_rtsym_size(const struct nfp_rtsym *sym)
237
239
{
238
240
switch (sym -> type ) {
239
241
case NFP_RTSYM_TYPE_NONE :
240
- pr_err ("rtsym type NONE\n" );
242
+ pr_err ("rtsym '%s': type NONE\n" , sym -> name );
241
243
return 0 ;
242
244
default :
243
- pr_warn ("Unknown rtsym type: %d\n" , sym -> type );
245
+ pr_warn ("rtsym '%s': unknown type: %d\n" , sym -> name , sym -> type );
244
246
/* fall through */
245
247
case NFP_RTSYM_TYPE_OBJECT :
246
248
case NFP_RTSYM_TYPE_FUNCTION :
@@ -255,7 +257,8 @@ nfp_rtsym_to_dest(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
255
257
u8 action , u8 token , u64 off , u32 * cpp_id , u64 * addr )
256
258
{
257
259
if (sym -> type != NFP_RTSYM_TYPE_OBJECT ) {
258
- nfp_err (cpp , "Direct access attempt to non-object rtsym\n" );
260
+ nfp_err (cpp , "rtsym '%s': direct access to non-object rtsym\n" ,
261
+ sym -> name );
259
262
return - EINVAL ;
260
263
}
261
264
@@ -270,8 +273,8 @@ nfp_rtsym_to_dest(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
270
273
* cpp_id = NFP_CPP_ISLAND_ID (NFP_CPP_TARGET_MU , action , token ,
271
274
sym -> domain );
272
275
} else if (sym -> target < 0 ) {
273
- nfp_err (cpp , "Unhandled RTsym target encoding: %d\n" ,
274
- sym -> target );
276
+ nfp_err (cpp , "rtsym '%s': unhandled target encoding: %d\n" ,
277
+ sym -> name , sym -> target );
275
278
return - EINVAL ;
276
279
} else {
277
280
* cpp_id = NFP_CPP_ISLAND_ID (sym -> target , action , token ,
@@ -284,15 +287,23 @@ nfp_rtsym_to_dest(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
284
287
int __nfp_rtsym_read (struct nfp_cpp * cpp , const struct nfp_rtsym * sym ,
285
288
u8 action , u8 token , u64 off , void * buf , size_t len )
286
289
{
290
+ u64 sym_size = nfp_rtsym_size (sym );
287
291
u32 cpp_id ;
288
292
u64 addr ;
289
293
int err ;
290
294
295
+ if (off > sym_size ) {
296
+ nfp_err (cpp , "rtsym '%s': read out of bounds: off: %lld + len: %zd > size: %lld\n" ,
297
+ sym -> name , off , len , sym_size );
298
+ return - ENXIO ;
299
+ }
300
+ len = min_t (size_t , len , sym_size - off );
301
+
291
302
if (sym -> type == NFP_RTSYM_TYPE_ABS ) {
292
- __le64 tmp = cpu_to_le64 ( sym -> addr ) ;
303
+ u8 tmp [ 8 ] ;
293
304
294
- len = min ( len , sizeof ( tmp ) );
295
- memcpy (buf , & tmp , len );
305
+ put_unaligned_le64 ( sym -> addr , tmp );
306
+ memcpy (buf , & tmp [ off ] , len );
296
307
297
308
return len ;
298
309
}
@@ -317,6 +328,12 @@ int __nfp_rtsym_readl(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
317
328
u64 addr ;
318
329
int err ;
319
330
331
+ if (off + 4 > nfp_rtsym_size (sym )) {
332
+ nfp_err (cpp , "rtsym '%s': readl out of bounds: off: %lld + 4 > size: %lld\n" ,
333
+ sym -> name , off , nfp_rtsym_size (sym ));
334
+ return - ENXIO ;
335
+ }
336
+
320
337
err = nfp_rtsym_to_dest (cpp , sym , action , token , off , & cpp_id , & addr );
321
338
if (err )
322
339
return err ;
@@ -337,8 +354,16 @@ int __nfp_rtsym_readq(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
337
354
u64 addr ;
338
355
int err ;
339
356
340
- if (sym -> type == NFP_RTSYM_TYPE_ABS )
341
- return sym -> addr ;
357
+ if (off + 8 > nfp_rtsym_size (sym )) {
358
+ nfp_err (cpp , "rtsym '%s': readq out of bounds: off: %lld + 8 > size: %lld\n" ,
359
+ sym -> name , off , nfp_rtsym_size (sym ));
360
+ return - ENXIO ;
361
+ }
362
+
363
+ if (sym -> type == NFP_RTSYM_TYPE_ABS ) {
364
+ * value = sym -> addr ;
365
+ return 0 ;
366
+ }
342
367
343
368
err = nfp_rtsym_to_dest (cpp , sym , action , token , off , & cpp_id , & addr );
344
369
if (err )
@@ -356,10 +381,18 @@ int nfp_rtsym_readq(struct nfp_cpp *cpp, const struct nfp_rtsym *sym, u64 off,
356
381
int __nfp_rtsym_write (struct nfp_cpp * cpp , const struct nfp_rtsym * sym ,
357
382
u8 action , u8 token , u64 off , void * buf , size_t len )
358
383
{
384
+ u64 sym_size = nfp_rtsym_size (sym );
359
385
u32 cpp_id ;
360
386
u64 addr ;
361
387
int err ;
362
388
389
+ if (off > sym_size ) {
390
+ nfp_err (cpp , "rtsym '%s': write out of bounds: off: %lld + len: %zd > size: %lld\n" ,
391
+ sym -> name , off , len , sym_size );
392
+ return - ENXIO ;
393
+ }
394
+ len = min_t (size_t , len , sym_size - off );
395
+
363
396
err = nfp_rtsym_to_dest (cpp , sym , action , token , off , & cpp_id , & addr );
364
397
if (err )
365
398
return err ;
@@ -380,6 +413,12 @@ int __nfp_rtsym_writel(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
380
413
u64 addr ;
381
414
int err ;
382
415
416
+ if (off + 4 > nfp_rtsym_size (sym )) {
417
+ nfp_err (cpp , "rtsym '%s': writel out of bounds: off: %lld + 4 > size: %lld\n" ,
418
+ sym -> name , off , nfp_rtsym_size (sym ));
419
+ return - ENXIO ;
420
+ }
421
+
383
422
err = nfp_rtsym_to_dest (cpp , sym , action , token , off , & cpp_id , & addr );
384
423
if (err )
385
424
return err ;
@@ -400,6 +439,12 @@ int __nfp_rtsym_writeq(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
400
439
u64 addr ;
401
440
int err ;
402
441
442
+ if (off + 8 > nfp_rtsym_size (sym )) {
443
+ nfp_err (cpp , "rtsym '%s': writeq out of bounds: off: %lld + 8 > size: %lld\n" ,
444
+ sym -> name , off , nfp_rtsym_size (sym ));
445
+ return - ENXIO ;
446
+ }
447
+
403
448
err = nfp_rtsym_to_dest (cpp , sym , action , token , off , & cpp_id , & addr );
404
449
if (err )
405
450
return err ;
@@ -449,7 +494,7 @@ u64 nfp_rtsym_read_le(struct nfp_rtsym_table *rtbl, const char *name,
449
494
break ;
450
495
default :
451
496
nfp_err (rtbl -> cpp ,
452
- "rtsym '%s' unsupported or non-scalar size: %lld\n" ,
497
+ "rtsym '%s': unsupported or non-scalar size: %lld\n" ,
453
498
name , nfp_rtsym_size (sym ));
454
499
err = - EINVAL ;
455
500
break ;
@@ -495,7 +540,7 @@ int nfp_rtsym_write_le(struct nfp_rtsym_table *rtbl, const char *name,
495
540
break ;
496
541
default :
497
542
nfp_err (rtbl -> cpp ,
498
- "rtsym '%s' unsupported or non-scalar size: %lld\n" ,
543
+ "rtsym '%s': unsupported or non-scalar size: %lld\n" ,
499
544
name , nfp_rtsym_size (sym ));
500
545
err = - EINVAL ;
501
546
break ;
@@ -521,18 +566,18 @@ nfp_rtsym_map(struct nfp_rtsym_table *rtbl, const char *name, const char *id,
521
566
err = nfp_rtsym_to_dest (rtbl -> cpp , sym , NFP_CPP_ACTION_RW , 0 , 0 ,
522
567
& cpp_id , & addr );
523
568
if (err ) {
524
- nfp_err (rtbl -> cpp , "Symbol %s mapping failed\n" , name );
569
+ nfp_err (rtbl -> cpp , "rtsym '%s': mapping failed\n" , name );
525
570
return (u8 __iomem * )ERR_PTR (err );
526
571
}
527
572
528
573
if (sym -> size < min_size ) {
529
- nfp_err (rtbl -> cpp , "Symbol %s too small\n" , name );
574
+ nfp_err (rtbl -> cpp , "rtsym '%s': too small\n" , name );
530
575
return (u8 __iomem * )ERR_PTR (- EINVAL );
531
576
}
532
577
533
578
mem = nfp_cpp_map_area (rtbl -> cpp , id , cpp_id , addr , sym -> size , area );
534
579
if (IS_ERR (mem )) {
535
- nfp_err (rtbl -> cpp , "Failed to map symbol %s : %ld\n" ,
580
+ nfp_err (rtbl -> cpp , "rtysm '%s': failed to map : %ld\n" ,
536
581
name , PTR_ERR (mem ));
537
582
return mem ;
538
583
}
0 commit comments