diff --git a/api/test/loopback.cpp b/api/test/loopback.cpp index 5229a46be391dc9e997f4fcc447bf26351d40e34..48486954db99f07e3b939cf1f56149a05430dbe8 100644 --- a/api/test/loopback.cpp +++ b/api/test/loopback.cpp @@ -41,7 +41,6 @@ using namespace etherbone; using namespace std; void die(const char* why, status_t error); -address_t hash(address_t address); void test_query(Device device, int len, int requests); void test_width(Socket socket, width_t width); @@ -54,10 +53,6 @@ void die(const char* why, status_t error) { exit(1); } -address_t hash(address_t address) { - return ~address; -} - enum RecordType { READ_BUS, READ_CFG, WRITE_BUS, WRITE_CFG }; struct Record { address_t address; @@ -65,19 +60,24 @@ struct Record { bool error; RecordType type; - Record(); + Record(width_t width); }; -Record::Record() - : address(rand()), - data(rand()) { +Record::Record(width_t width) { static address_t prev = 0; long seed = rand(); - address = (address << 1) | (seed&1); - seed >>= 1; - data = (data << 1) | (seed&1); - seed >>= 1; + address = rand(); + address += address*RAND_MAX; + address += rand(); + address += address*RAND_MAX; + address += rand(); + + data = rand(); + data += data*RAND_MAX; + data += rand(); + data += data*RAND_MAX; + data += rand(); switch (seed & 3) { case 0: type = READ_BUS; break; @@ -87,18 +87,21 @@ Record::Record() } seed >>= 2; + /* Expect no data for config space reads */ if (type == READ_CFG) data = 0; - if (type == READ_BUS) - data = hash(address); if (type == READ_CFG || type == WRITE_CFG) { /* Config space is narrower */ address &= 0x7FFF; /* Don't stomp on the error flag register */ if (address < 8) address = 8; + /* Config space never has an error */ error = 0; } else { + /* Trim the request to fit the addr/data widths */ + data &= (data_t)(~0) >> ((sizeof(data)-(width&EB_DATAX))*8); + address &= (address_t)(~0) >> ((sizeof(address)-(width>>4))*8); error = (address & 3) == 1; } @@ -214,7 +217,7 @@ void TestCycle::launch(Device device, int length, int* success_) { Cycle cycle(device, this, &proxy<TestCycle, &TestCycle::complete>); for (int op = 0; op < length; ++op) { - Record r; + Record r(device.widths()); switch (r.type) { case READ_BUS: cycle.read (r.address, 0); break; case READ_CFG: cycle.read_config (r.address, 0); break; @@ -247,7 +250,7 @@ void test_query(Device device, int len, int requests) { ++serial; #if 0 - if (serial == 13043) { + if (serial == 91845) { printf("Enabling debug\n"); loud = true; } @@ -303,7 +306,7 @@ int main() { status_t err; Socket socket; - if ((err = socket.open(60368)) != EB_OK) die("socket.open", err); + if ((err = socket.open(60368, EB_DATA32|EB_ADDR32)) != EB_OK) die("socket.open", err); Echo echo; if ((err = socket.attach(0, ~0, &echo)) != EB_OK) die("socket.attach", err);