[rv_plic/dif] Pass input data by value
The argument `complete_data` of the `dif_plic_irq_complete()` function
is used as value, not as out param as it is documented. Adjust the
documentation to reflect that, and pass the argument by value.
This was detected by compiling with GCC11, which a maybe-uninitialized
warning in the PLIC unit test code, which causes the compilation to fail.
```
c++ -Isw/device/lib/dif/5fb29ed@@dif_plic_unittest@exe -I../sw/device/lib/dif -I/home/philipp/src/opentitan -I/home/philipp/src/opentitan/build-out -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wnon-virtual-dtor -Wextra -Werror -std=c++14 -g -DHOST_BUILD -Wimplicit-fallthrough -Wswitch-default -Wno-error=unused-function -Wno-unused-parameter -Wno-sign-compare -Wno-missing-field-initializers -pthread -isystem../sw/vendor/google_googletest/googlemock -isystem../sw/vendor/google_googletest/googlemock/include -isystem../sw/vendor/google_googletest/googletest -isystem../sw/vendor/google_googletest/googletest/include -DMOCK_MMIO -MD -MQ 'sw/device/lib/dif/5fb29ed@@dif_plic_unittest@exe/dif_plic_unittest.cc.o' -MF 'sw/device/lib/dif/5fb29ed@@dif_plic_unittest@exe/dif_plic_unittest.cc.o.d' -o 'sw/device/lib/dif/5fb29ed@@dif_plic_unittest@exe/dif_plic_unittest.cc.o' -c ../sw/device/lib/dif/dif_plic_unittest.cc
In file included from ../sw/vendor/google_googletest/googletest/include/gtest/gtest.h:376,
from ../sw/device/lib/dif/dif_plic_unittest.cc:9:
../sw/device/lib/dif/dif_plic_unittest.cc: In member function ‘virtual void dif_plic_unittest::{anonymous}::IrqCompleteTest_NullArgs_Test::TestBody()’:
../sw/device/lib/dif/dif_plic_unittest.cc:345:34: error: ‘data’ may be used uninitialized [-Werror=maybe-uninitialized]
345 | EXPECT_EQ(dif_plic_irq_complete(nullptr, kTarget0, &data), kDifPlicBadArg);
| ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from ../sw/device/lib/dif/dif_plic_unittest.cc:5:
/home/philipp/src/opentitan/sw/device/lib/dif/dif_plic.h:295:19: note: by argument 3 of type ‘const dif_plic_irq_id_t*’ {aka ‘const unsigned int*’} to ‘dif_plic_result_t dif_plic_irq_complete(const dif_plic_t*, dif_plic_target_t, const dif_plic_irq_id_t*)’ declared here
295 | dif_plic_result_t dif_plic_irq_complete(const dif_plic_t *plic,
| ^~~~~~~~~~~~~~~~~~~~~
../sw/device/lib/dif/dif_plic_unittest.cc:344:21: note: ‘data’ declared here
344 | dif_plic_irq_id_t data;
| ^~~~
cc1plus: all warnings being treated as errors
```
Signed-off-by: Philipp Wagner <phw@lowrisc.org>
diff --git a/sw/device/lib/dif/dif_plic.c b/sw/device/lib/dif/dif_plic.c
index 157be6e..ae1e9c4 100644
--- a/sw/device/lib/dif/dif_plic.c
+++ b/sw/device/lib/dif/dif_plic.c
@@ -311,11 +311,10 @@
return kDifPlicOk;
}
-dif_plic_result_t dif_plic_irq_complete(
- const dif_plic_t *plic, dif_plic_target_t target,
- const dif_plic_irq_id_t *complete_data) {
- if (plic == NULL || target >= RV_PLIC_PARAM_NUM_TARGET ||
- complete_data == NULL) {
+dif_plic_result_t dif_plic_irq_complete(const dif_plic_t *plic,
+ dif_plic_target_t target,
+ dif_plic_irq_id_t complete_data) {
+ if (plic == NULL || target >= RV_PLIC_PARAM_NUM_TARGET) {
return kDifPlicBadArg;
}
@@ -323,7 +322,7 @@
// to notify the PLIC of the IRQ completion.
ptrdiff_t claim_complete_reg = plic_claim_complete_base_for_target(target);
mmio_region_write32(plic->params.base_addr, claim_complete_reg,
- *complete_data);
+ complete_data);
return kDifPlicOk;
}
diff --git a/sw/device/lib/dif/dif_plic.h b/sw/device/lib/dif/dif_plic.h
index 8ff57da..62a3655 100644
--- a/sw/device/lib/dif/dif_plic.h
+++ b/sw/device/lib/dif/dif_plic.h
@@ -287,14 +287,14 @@
*
* @param plic A PLIC handle.
* @param target Target that claimed the IRQ.
- * @param[out] complete_data Previously claimed IRQ data that is used to signal
- * PLIC of the IRQ servicing completion.
+ * @param complete_data Previously claimed IRQ data that is used to signal
+ * PLIC of the IRQ servicing completion.
* @return The result of the operation.
*/
DIF_WARN_UNUSED_RESULT
dif_plic_result_t dif_plic_irq_complete(const dif_plic_t *plic,
dif_plic_target_t target,
- const dif_plic_irq_id_t *complete_data);
+ dif_plic_irq_id_t complete_data);
/**
* Forces the software interrupt for a particular target.
diff --git a/sw/device/lib/dif/dif_plic_unittest.cc b/sw/device/lib/dif/dif_plic_unittest.cc
index d741aec..0ed67e5 100644
--- a/sw/device/lib/dif/dif_plic_unittest.cc
+++ b/sw/device/lib/dif/dif_plic_unittest.cc
@@ -341,12 +341,7 @@
};
TEST_F(IrqCompleteTest, NullArgs) {
- dif_plic_irq_id_t data;
- EXPECT_EQ(dif_plic_irq_complete(nullptr, kTarget0, &data), kDifPlicBadArg);
-
- EXPECT_EQ(dif_plic_irq_complete(&plic_, kTarget0, nullptr), kDifPlicBadArg);
-
- EXPECT_EQ(dif_plic_irq_complete(nullptr, kTarget0, nullptr), kDifPlicBadArg);
+ EXPECT_EQ(dif_plic_irq_complete(nullptr, kTarget0, 0), kDifPlicBadArg);
}
TEST_F(IrqCompleteTest, Target0Success) {
@@ -357,8 +352,7 @@
// Complete all of the IRQs.
for (int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
- dif_plic_irq_id_t data = i;
- EXPECT_EQ(dif_plic_irq_complete(&plic_, kTarget0, &data), kDifPlicOk);
+ EXPECT_EQ(dif_plic_irq_complete(&plic_, kTarget0, i), kDifPlicOk);
}
}
diff --git a/sw/device/tests/dif/dif_plic_smoketest.c b/sw/device/tests/dif/dif_plic_smoketest.c
index b5d5ca8..470e616 100644
--- a/sw/device/tests/dif/dif_plic_smoketest.c
+++ b/sw/device/tests/dif/dif_plic_smoketest.c
@@ -86,7 +86,7 @@
// Complete the IRQ by writing the IRQ source to the Ibex specific CC
// register.
- CHECK(dif_plic_irq_complete(&plic0, kPlicTarget, &interrupt_id) == kDifPlicOk,
+ CHECK(dif_plic_irq_complete(&plic0, kPlicTarget, interrupt_id) == kDifPlicOk,
"Unable to complete the IRQ request!");
}
diff --git a/sw/device/tests/sim_dv/gpio_test.c b/sw/device/tests/sim_dv/gpio_test.c
index c140ae7..23f14d8 100644
--- a/sw/device/tests/sim_dv/gpio_test.c
+++ b/sw/device/tests/sim_dv/gpio_test.c
@@ -268,7 +268,7 @@
// Complete the IRQ at PLIC.
CHECK(dif_plic_irq_complete(&plic, kTopEarlgreyPlicTargetIbex0,
- &plic_irq_id) == kDifPlicOk,
+ plic_irq_id) == kDifPlicOk,
"dif_plic_irq_complete failed");
}
diff --git a/sw/device/tests/sim_dv/spi_tx_rx_test.c b/sw/device/tests/sim_dv/spi_tx_rx_test.c
index 79200a0..928c8c0 100644
--- a/sw/device/tests/sim_dv/spi_tx_rx_test.c
+++ b/sw/device/tests/sim_dv/spi_tx_rx_test.c
@@ -130,7 +130,7 @@
// Complete the IRQ at PLIC.
CHECK(dif_plic_irq_complete(&plic0, kTopEarlgreyPlicTargetIbex0,
- &plic_irq_id) == kDifPlicOk,
+ plic_irq_id) == kDifPlicOk,
"dif_plic_irq_complete failed");
}
diff --git a/sw/device/tests/sim_dv/uart_tx_rx_test.c b/sw/device/tests/sim_dv/uart_tx_rx_test.c
index 6ee1044..f5b6b17 100644
--- a/sw/device/tests/sim_dv/uart_tx_rx_test.c
+++ b/sw/device/tests/sim_dv/uart_tx_rx_test.c
@@ -155,7 +155,7 @@
// Complete the IRQ at PLIC.
CHECK(dif_plic_irq_complete(&plic, kTopEarlgreyPlicTargetIbex0,
- &plic_irq_id) == kDifPlicOk,
+ plic_irq_id) == kDifPlicOk,
"dif_plic_irq_complete failed");
}