register: 0.736 semantic: 0.640 network: 0.611 device: 0.610 performance: 0.585 ppc: 0.566 user-level: 0.560 files: 0.475 socket: 0.432 kernel: 0.423 hypervisor: 0.419 permissions: 0.404 arm: 0.377 PID: 0.361 graphic: 0.354 debug: 0.289 risc-v: 0.286 architecture: 0.283 mistranslation: 0.280 peripherals: 0.279 boot: 0.257 vnc: 0.250 virtual: 0.233 assembly: 0.167 x86: 0.151 i386: 0.144 VMM: 0.128 TCG: 0.099 KVM: 0.064 resetting moder register in opencores_eth.c code (ethernet IP core specification code) Hi, I would like to report a possible error in the code qemu/hw/net/opencores_eth.c The corresponding data sheet : http://www.cprover.org/firmware/doc/ethoc/eth_speci.pdf In the code, there is a function open_eth_moder_host_write. static void open_eth_moder_host_write(OpenEthState *s, uint32_t val) { uint32_t set = val & ~s->regs[MODER]; if (set & MODER_RST) { open_eth_reset(s); } s->regs[MODER] = val; if (set & MODER_RXEN) { s->rx_desc = s->regs[TX_BD_NUM]; open_eth_notify_can_receive(s); } if (set & MODER_TXEN) { s->tx_desc = 0; open_eth_check_start_xmit(s); } } This piece of code is executed when MODER (Mode Register) resister is command to updated to ‘val’. In case of reset, as you can see, if the MODER_RST bit (0x800) bit is set && the old MODER_RST bit (0x800) of MODER register is clear, the code falls into the if(set & MODER_RST) branch. Then, it calls open_eth_reset(s), which does “s->regs[MODER] = 0xa000;”. Now, the MODER register is reset to 0xa000. Page 9 of the data sheet (http://www.cprover.org/firmware/doc/ethoc/eth_speci.pdf) specifies the reset value of the moder is 0000A000h. So far, the code works fine. Then, the open_eth_moder_host_write function does not end but executes but executes “s->regs[MODER] = val;” line. Now, the MODER register is not 0xa000 any more. In fact, since the MODER_RST bit of ‘val’ is 1, now the MODER_RST bit of the MODER register becomes 1 as well. Suppose one somehow calls this open_eth_moder_host_write again with val = MODER_RST with purpose of resetting again. Since the MODER_RST bit is 1, (set = val & ~s->regs[MODER]) & MODER_RST is zero. So after this, resetting again is not possible. Hence, I doubt the function’s correctness here. I think it could be better if the function changes to : if (set & MODER_RST) { open_eth_reset(s); return; } Please let me know if I am correct. Looking through old bug tickets... is this still an issue with the latest version of QEMU? Or could we close this ticket nowadays? [Expired for QEMU because there has been no activity for 60 days.]