summaryrefslogtreecommitdiff
path: root/nios2.c
diff options
context:
space:
mode:
Diffstat (limited to 'nios2.c')
-rw-r--r--nios2.c76
1 files changed, 38 insertions, 38 deletions
diff --git a/nios2.c b/nios2.c
index a8ff9c4..2b2fec2 100644
--- a/nios2.c
+++ b/nios2.c
@@ -91,25 +91,38 @@ static bool is_mem_addr(struct memory *mem, uint32_t addr)
return false;
}
-int nios2_load_byte(struct nios2 *cpu, uint32_t addr, uint8_t *data)
+int nios2_load(struct nios2 *cpu, uint32_t addr, void *data, size_t size)
{
struct memory *mem = cpu->mem;
- dbg("ldb %08x\n", addr);
+ dbg("load%zu %08x\n", size * 8, addr);
if (is_mem_addr(mem, addr)) {
- dbg("load byte MEM\n");
- *data = memory_get_byte(mem, addr);
+ dbg("load MEM\n");
+ switch (size) {
+ case 1:
+ *((uint8_t *) data) = memory_get_byte(mem, addr);
+ break;
+ case 2:
+ *((uint16_t *) data) = memory_get_halfword(mem, addr);
+ break;
+ case 4:
+ *((uint32_t *) data) = memory_get_word(mem, addr);
+ break;
+ default:
+ err("Invalid size for load at %08x: %zu\n", addr, size);
+ return -1;
+ }
} else { /* must be I/O */
struct device *dev = device_get_by_addr(addr);
- dbg("load byte I/O\n");
+ dbg("load I/O\n");
if (unlikely(dev == NULL)) {
err("Reading data outside of device range (0x%08x)\n", addr);
return -1;
}
- if (dev->read(dev, addr, data, 1) != 1) {
+ if (dev->read(dev, addr, data, size) != 1) {
err("Read from device '%s' failed\n", dev->name);
return -1;
}
@@ -118,52 +131,39 @@ int nios2_load_byte(struct nios2 *cpu, uint32_t addr, uint8_t *data)
return 0;
}
-int nios2_store_byte(struct nios2 *cpu, uint32_t addr, uint8_t data)
+int nios2_store(struct nios2 *cpu, uint32_t addr, void *data, size_t size)
{
struct memory *mem = cpu->mem;
- dbg("stb %02x @ %08x\n", data, addr);
+ dbg("store%zu %08x\n", size, addr);
if (is_mem_addr(mem, addr)) {
- dbg("store byte MEM\n");
- memory_set_byte(mem, addr, data);
- } else { /* must be I/O */
- struct device *dev = device_get_by_addr(addr);
- dbg("store byte I/O\n");
- if (unlikely(dev == NULL)) {
- err("Writing data outside of device range (0x%08x)\n", addr);
+ dbg("store MEM\n");
+ switch (size) {
+ case 1:
+ memory_set_byte(mem, addr, *((uint8_t *) data));
+ break;
+ case 2:
+ memory_set_halfword(mem, addr, *((uint16_t *) data));
+ break;
+ case 4:
+ memory_set_word(mem, addr, *((uint32_t *) data));
+ break;
+ default:
+ err("Invalid size for store at %08x: %zu\n", addr, size);
return -1;
}
-
- if (dev->write(dev, addr, &data, 1) != 1) {
- err("Write to device '%s' failed\n", dev->name);
- return -1;
- }
- }
-
- return 0;
-}
-
-int nios2_load_word(struct nios2 *cpu, uint32_t addr, uint32_t *data)
-{
- struct memory *mem = cpu->mem;
-
- dbg("ldw %08x\n", addr);
-
- if (is_mem_addr(mem, addr)) {
- dbg("load word MEM\n");
- *data = memory_get_word(mem, addr);
} else { /* must be I/O */
struct device *dev = device_get_by_addr(addr);
- dbg("load byte I/O\n");
+ dbg("store I/O\n");
if (unlikely(dev == NULL)) {
- err("Reading data outside of device range (0x%08x)\n", addr);
+ err("Writing data outside of device range (0x%08x)\n", addr);
return -1;
}
- if (dev->read(dev, addr, (uint8_t *) data, 4) != 1) {
- err("Read from device '%s' failed\n", dev->name);
+ if (dev->write(dev, addr, data, size) != 1) {
+ err("Write to device '%s' failed\n", dev->name);
return -1;
}
}