From bba31d7fbc06bfdac175e38649ca9b2331e44a5a Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 22 Nov 2010 11:32:41 +0100 Subject: Use generic load/store functions in instructions --- nios2.c | 76 ++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) (limited to 'nios2.c') 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; } } -- cgit v1.2.3-54-g00ecf