Skip to content

Commit 4fc6932

Browse files
committed
flash+eeprom: fix ioctl handling
The flash ioctl handler unconditionally reported the request as processed even when it was skipped. This lead to eeprom ioctl handler not getting called at all if it was registered later than the flash. The eeprom ioctl handler reported the request as not processed even if it was, so fix that too while at it. This bug resulted in the emulated firmware seeing blank EEPROM even when the contents was provided (as a section in ELF or as a separate HEX file) and r/w access via GDB not working. Signed-off-by: Paul Fertser <[email protected]>
1 parent c0c4cd5 commit 4fc6932

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

simavr/sim/avr_eeprom.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ avr_eeprom_ioctl(
115115
memcpy(p->eeprom + desc->offset, desc->ee, desc->size);
116116
AVR_LOG(port->avr, LOG_TRACE, "EEPROM: %s: AVR_IOCTL_EEPROM_SET Loaded %d at offset %d\n",
117117
__FUNCTION__, desc->size, desc->offset);
118+
res = 0;
118119
} break;
119120
case AVR_IOCTL_EEPROM_GET: {
120121
avr_eeprom_desc_t * desc = (avr_eeprom_desc_t*)io_param;
@@ -127,6 +128,7 @@ avr_eeprom_ioctl(
127128
memcpy(desc->ee, p->eeprom + desc->offset, desc->size);
128129
else // allow to get access to the read data, for gdb support
129130
desc->ee = p->eeprom + desc->offset;
131+
res = 0;
130132
} break;
131133
}
132134

simavr/sim/avr_flash.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ avr_flash_ioctl(
7272
{
7373
avr_flash_t * p = (avr_flash_t *)port;
7474
avr_t * avr = p->io.avr;
75+
int res = -1;
7576

7677
avr_flashaddr_t z = avr->data[R_ZL] | (avr->data[R_ZH] << 8);
7778
if (avr->rampz)
@@ -85,24 +86,24 @@ avr_flash_ioctl(
8586
#endif
8687
switch (ctl) {
8788
case AVR_IOCTL_FLASH_LPM: {
88-
uint8_t *res = io_param;
89+
uint8_t *result = io_param;
8990
if (avr_regbit_get(avr, p->selfprgen)) {
9091
avr_cycle_timer_cancel(avr, avr_progen_clear, p);
9192
if (avr_regbit_get(avr, p->blbset)) {
9293
AVR_LOG(avr, LOG_TRACE, "FLASH: Reading fuse/lock byte %02x\n", z);
9394
switch (z) {
94-
case 0x0: *res = avr->fuse[0]; break; // LFuse
95-
case 0x1: *res = avr->lockbits; break; // lock bits
96-
case 0x2: *res = avr->fuse[2]; break; // EFuse
97-
case 0x3: *res = avr->fuse[1]; break; // HFuse
95+
case 0x0: *result = avr->fuse[0]; break; // LFuse
96+
case 0x1: *result = avr->lockbits; break; // lock bits
97+
case 0x2: *result = avr->fuse[2]; break; // EFuse
98+
case 0x3: *result = avr->fuse[1]; break; // HFuse
9899
}
99100
} else if (avr_regbit_get(avr, p->sigrd)) {
100101
AVR_LOG(avr, LOG_TRACE, "FLASH: Reading signature&serial byte %02x\n", z);
101102
switch (z) {
102-
case 0x00: *res = avr->signature[0]; break;
103-
case 0x02: *res = avr->signature[1]; break;
104-
case 0x04: *res = avr->signature[2]; break;
105-
case 0x01: *res = 0x55; break; // OSC Cal
103+
case 0x00: *result = avr->signature[0]; break;
104+
case 0x02: *result = avr->signature[1]; break;
105+
case 0x04: *result = avr->signature[2]; break;
106+
case 0x01: *result = 0x55; break; // OSC Cal
106107
/* serial# bytes are ordered bizarelly */
107108
/* NOTE: Not all AVR that have sigrd have a
108109
* serial number, currenly we return one anyway */
@@ -111,11 +112,12 @@ avr_flash_ioctl(
111112
1,0,3,2,5,4,0,6,7,8
112113
};
113114
z -= 0x0e;
114-
*res = avr->serial[idx[z]]; break;
115+
*result = avr->serial[idx[z]]; break;
115116
} break;
116117
}
117118
}
118119
}
120+
res = 0;
119121
} break;
120122
case AVR_IOCTL_FLASH_SPM: {
121123
uint16_t r01 = avr->data[0] | (avr->data[1] << 8);
@@ -150,10 +152,11 @@ avr_flash_ioctl(
150152
}
151153
}
152154
}
155+
res = 0;
153156
} break;
154157
}
155158
avr_regbit_clear(avr, p->selfprgen);
156-
return 0;
159+
return res;
157160
}
158161

159162
static void

0 commit comments

Comments
 (0)