Christian Menard has uploaded this change for review. ( https://gem5-review.googlesource.com/3482

Change subject: misc: check address range in the SystemC example
......................................................................

misc: check address range in the SystemC example

Using a wrong offset or memory size may lead to segmentation faults.
This patch adds an address range check and produces an error message.

Change-Id: I79a72c05879266daf61a83367fe4ae386d1958a4
---
M util/tlm/examples/slave_port/sc_target.cc
M util/tlm/examples/slave_port/sc_target.hh
2 files changed, 15 insertions(+), 0 deletions(-)



diff --git a/util/tlm/examples/slave_port/sc_target.cc b/util/tlm/examples/slave_port/sc_target.cc
index c44a271..152d99a 100644
--- a/util/tlm/examples/slave_port/sc_target.cc
+++ b/util/tlm/examples/slave_port/sc_target.cc
@@ -66,6 +66,14 @@
 }

 void
+Target::check_address(unsigned long long int addr)
+{
+    if (addr < offset || addr >= offset + size)
+        SC_REPORT_FATAL("Target", "Address out of range. Did you set an "
+                                  "appropriate size and offset?");
+}
+
+void
 Target::b_transport(tlm::tlm_generic_payload& trans, sc_time& delay)
 {
     /* Execute the read or write commands */
@@ -75,6 +83,8 @@
 unsigned int
 Target::transport_dbg(tlm::tlm_generic_payload& trans)
 {
+    check_address(trans.get_address());
+
     tlm::tlm_command cmd = trans.get_command();
     sc_dt::uint64    adr = trans.get_address() - offset;
     unsigned char*   ptr = trans.get_data_ptr();
@@ -203,6 +213,8 @@
 void
 Target::execute_transaction(tlm::tlm_generic_payload& trans)
 {
+    check_address(trans.get_address());
+
     tlm::tlm_command cmd = trans.get_command();
     sc_dt::uint64    adr = trans.get_address() - offset;
     unsigned char*   ptr = trans.get_data_ptr();
diff --git a/util/tlm/examples/slave_port/sc_target.hh b/util/tlm/examples/slave_port/sc_target.hh
index 7a2d075..a10fb49 100644
--- a/util/tlm/examples/slave_port/sc_target.hh
+++ b/util/tlm/examples/slave_port/sc_target.hh
@@ -91,6 +91,9 @@
     /** Method process that runs on target_done_event */
     void execute_transaction_process();

+ /** Helping function that checks if a requested address is with range */
+    void check_address(unsigned long long int addr);
+
     /** Helping Variables **/
     unsigned long long int size;
     unsigned offset;

--
To view, visit https://gem5-review.googlesource.com/3482
To unsubscribe, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I79a72c05879266daf61a83367fe4ae386d1958a4
Gerrit-Change-Number: 3482
Gerrit-PatchSet: 1
Gerrit-Owner: Christian Menard <[email protected]>
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to