From b682e4b6309f42fe5b3babec0935461264bcd785 Mon Sep 17 00:00:00 2001
From: Sami Liedes <sliedes@cc.hut.fi>
Date: Fri, 18 Feb 2011 22:09:24 +0200
Subject: [PATCH] avr_register_io_[read,write](): fail if overriding earlier
 registration.

The avr_register_io_*() functions do not maintain a chain of
callbacks. This can be confusing if someone like me tries to use them
to listen to some I/O events (for which you should use the avr_irq_*
stuff).

Make this more explicit by checking in the register functions if we
already have a callback and failing with an error message if so.

Signed-off-by: Sami Liedes <sliedes@cc.hut.fi>
---
 simavr/sim/sim_io.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/simavr/sim/sim_io.c b/simavr/sim/sim_io.c
index 42e8c1b..3ef9d35 100644
--- a/simavr/sim/sim_io.c
+++ b/simavr/sim/sim_io.c
@@ -47,6 +47,10 @@ void avr_register_io(avr_t *avr, avr_io_t * io)
 void avr_register_io_read(avr_t *avr, avr_io_addr_t addr, avr_io_read_t readp, void * param)
 {
 	avr_io_addr_t a = AVR_DATA_TO_IO(addr);
+	if (avr->io[a].r.param || avr->io[a].r.c) {
+		fputs("Error: avr_register_io_read(): Already registered, refusing to override.\n", stderr);
+		exit(1);
+	}
 	avr->io[a].r.param = param;
 	avr->io[a].r.c = readp;
 }
@@ -54,6 +58,10 @@ void avr_register_io_read(avr_t *avr, avr_io_addr_t addr, avr_io_read_t readp, v
 void avr_register_io_write(avr_t *avr, avr_io_addr_t addr, avr_io_write_t writep, void * param)
 {
 	avr_io_addr_t a = AVR_DATA_TO_IO(addr);
+	if (avr->io[a].w.param || avr->io[a].w.c) {
+		fputs("Error: avr_register_io_write(): Already registered, refusing to override.\n", stderr);
+		exit(1);
+	}
 	avr->io[a].w.param = param;
 	avr->io[a].w.c = writep;
 }
-- 
2.39.5