@@ -400,42 +400,30 @@ static uintptr_t acl_kernel_cra_set_segment_rom(acl_kernel_if *kern,
400
400
401
401
static int acl_kernel_cra_read (acl_kernel_if *kern, unsigned int accel_id,
402
402
unsigned int addr, unsigned int *val) {
403
- int result = 0 ;
404
403
assert (kern->cra_ring_root_exist );
405
- #ifdef __linux__
406
- acl_sig_block_signals ();
407
- #endif
408
- {
409
- std::lock_guard<std::mutex> lock (kern->segment_mutex );
410
- uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
411
- acl_assert_locked_or_sig ();
412
- result = acl_kernel_if_read_32b (
413
- kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val);
414
- }
415
- #ifdef __linux__
416
- acl_sig_unblock_signals ();
417
- #endif
418
- return result;
404
+
405
+ // Need to block signals before acquiring mutex and unblock after releasing
406
+ acl_signal_blocker sig_blocker;
407
+ std::lock_guard<std::mutex> lock (kern->segment_mutex );
408
+
409
+ uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
410
+ acl_assert_locked_or_sig ();
411
+ return acl_kernel_if_read_32b (
412
+ kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val);
419
413
}
420
414
421
415
int acl_kernel_cra_read_64b (acl_kernel_if *kern, unsigned int accel_id,
422
416
unsigned int addr, uint64_t *val) {
423
- int result = 0 ;
424
417
assert (kern->cra_ring_root_exist );
425
- #ifdef __linux__
426
- acl_sig_block_signals ();
427
- #endif
428
- {
429
- std::lock_guard<std::mutex> lock (kern->segment_mutex );
430
- uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
431
- acl_assert_locked_or_sig ();
432
- result = acl_kernel_if_read_64b (
433
- kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val);
434
- }
435
- #ifdef __linux__
436
- acl_sig_unblock_signals ();
437
- #endif
438
- return result;
418
+
419
+ // Need to block signals before acquiring mutex and unblock after releasing
420
+ acl_signal_blocker sig_blocker;
421
+ std::lock_guard<std::mutex> lock (kern->segment_mutex );
422
+
423
+ uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
424
+ acl_assert_locked_or_sig ();
425
+ return acl_kernel_if_read_64b (
426
+ kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val);
439
427
}
440
428
441
429
// Read 32b from kernel ROM
@@ -483,95 +471,76 @@ static int acl_kernel_rom_cra_read_block(acl_kernel_if *kern, unsigned int addr,
483
471
484
472
static int acl_kernel_cra_write (acl_kernel_if *kern, unsigned int accel_id,
485
473
unsigned int addr, unsigned int val) {
486
- int result = 0 ;
487
474
assert (kern->cra_ring_root_exist );
488
- #ifdef __linux__
489
- acl_sig_block_signals ();
490
- #endif
491
- {
492
- std::lock_guard<std::mutex> lock (kern->segment_mutex );
493
- uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
494
- acl_assert_locked_or_sig ();
495
- result = acl_kernel_if_write_32b (
496
- kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val);
497
- }
498
- #ifdef __linux__
499
- acl_sig_unblock_signals ();
500
- #endif
501
- return result;
475
+
476
+ // Need to block signals before acquiring mutex and unblock after releasing
477
+ acl_signal_blocker sig_blocker;
478
+ std::lock_guard<std::mutex> lock (kern->segment_mutex );
479
+
480
+ uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
481
+ acl_assert_locked_or_sig ();
482
+ return acl_kernel_if_write_32b (
483
+ kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val);
502
484
}
503
485
504
486
static int acl_kernel_cra_write_64b (acl_kernel_if *kern, unsigned int accel_id,
505
487
unsigned int addr, uint64_t val) {
506
- int result = 0 ;
507
488
assert (kern->cra_ring_root_exist );
508
- #ifdef __linux__
509
- acl_sig_block_signals ();
510
- #endif
511
- {
512
- std::lock_guard<std::mutex> lock (kern->segment_mutex );
513
- uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
514
- acl_assert_locked ();
515
- result = acl_kernel_if_write_64b (
516
- kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val);
517
- }
518
- #ifdef __linux__
519
- acl_sig_unblock_signals ();
520
- #endif
521
- return result;
489
+
490
+ // Need to block signals before acquiring mutex and unblock after releasing
491
+ acl_signal_blocker sig_blocker;
492
+ std::lock_guard<std::mutex> lock (kern->segment_mutex );
493
+
494
+ uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
495
+ acl_assert_locked ();
496
+ return acl_kernel_if_write_64b (
497
+ kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val);
522
498
}
523
499
524
500
static int acl_kernel_cra_write_block (acl_kernel_if *kern,
525
501
unsigned int accel_id, unsigned int addr,
526
502
unsigned int *val, size_t size) {
527
- int result = 0 ;
528
503
assert (kern->cra_ring_root_exist );
529
- #ifdef __linux__
530
- acl_sig_block_signals ();
531
- #endif
532
- {
533
- std::lock_guard<std::mutex> lock (kern->segment_mutex );
534
- uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
535
- uintptr_t logical_addr =
536
- kern->accel_csr [accel_id].address + addr - OFFSET_KERNEL_CRA;
537
- uintptr_t segment = logical_addr & ((size_t )0 - (KERNEL_CRA_SEGMENT_SIZE));
538
-
539
- uintptr_t logical_addr_end =
540
- kern->accel_csr [accel_id].address + addr + size - OFFSET_KERNEL_CRA;
541
- uintptr_t segment_end =
542
- logical_addr_end & ((size_t )0 - (KERNEL_CRA_SEGMENT_SIZE));
543
-
544
- unsigned int step = 0 ;
545
- if (segment != segment_end) {
546
- ACL_KERNEL_IF_DEBUG_MSG_VERBOSE (
547
- kern, 2 , " :: Segment change during block write detected.\n " );
548
- while (step < size) {
549
- segment =
550
- (logical_addr + step) & ((size_t )0 - (KERNEL_CRA_SEGMENT_SIZE));
551
- if (kern->cur_segment != segment) {
552
- acl_kernel_if_write_block (
553
- kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val,
554
- step);
555
- segment_offset =
556
- acl_kernel_cra_set_segment (kern, accel_id, addr + step);
557
- logical_addr = kern->accel_csr [accel_id].address + addr + step -
558
- OFFSET_KERNEL_CRA;
559
- val += step;
560
- size -= step;
561
- step = 0 ;
562
- } else {
563
- step += (unsigned )sizeof (int );
564
- }
504
+
505
+ // Need to block signals before acquiring mutex and unblock after releasing
506
+ acl_signal_blocker sig_blocker;
507
+ std::lock_guard<std::mutex> lock (kern->segment_mutex );
508
+
509
+ uintptr_t segment_offset = acl_kernel_cra_set_segment (kern, accel_id, addr);
510
+ uintptr_t logical_addr =
511
+ kern->accel_csr [accel_id].address + addr - OFFSET_KERNEL_CRA;
512
+ uintptr_t segment = logical_addr & ((size_t )0 - (KERNEL_CRA_SEGMENT_SIZE));
513
+
514
+ uintptr_t logical_addr_end =
515
+ kern->accel_csr [accel_id].address + addr + size - OFFSET_KERNEL_CRA;
516
+ uintptr_t segment_end =
517
+ logical_addr_end & ((size_t )0 - (KERNEL_CRA_SEGMENT_SIZE));
518
+
519
+ unsigned int step = 0 ;
520
+ if (segment != segment_end) {
521
+ ACL_KERNEL_IF_DEBUG_MSG_VERBOSE (
522
+ kern, 2 , " :: Segment change during block write detected.\n " );
523
+ while (step < size) {
524
+ segment = (logical_addr + step) & ((size_t )0 - (KERNEL_CRA_SEGMENT_SIZE));
525
+ if (kern->cur_segment != segment) {
526
+ acl_kernel_if_write_block (
527
+ kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val,
528
+ step);
529
+ segment_offset =
530
+ acl_kernel_cra_set_segment (kern, accel_id, addr + step);
531
+ logical_addr =
532
+ kern->accel_csr [accel_id].address + addr + step - OFFSET_KERNEL_CRA;
533
+ val += step;
534
+ size -= step;
535
+ step = 0 ;
536
+ } else {
537
+ step += (unsigned )sizeof (int );
565
538
}
566
539
}
567
- result = acl_kernel_if_write_block (
568
- kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val,
569
- size);
570
540
}
571
- #ifdef __linux__
572
- acl_sig_unblock_signals ();
573
- #endif
574
- return result;
541
+
542
+ return acl_kernel_if_write_block (
543
+ kern, (unsigned )OFFSET_KERNEL_CRA + (unsigned )segment_offset, val, size);
575
544
}
576
545
577
546
// Private utility function to issue a command to the profile hardware
0 commit comments