From 89ca7bda3b028784cb012c78e95bc65c69eb2b3c Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 2 Aug 2014 15:43:39 -0700 Subject: [PATCH] Fix to avoid excessive compiler optimization of MicroVAX II ROM access spinwait. Found by Cory Smelosky and Jordi Guillaumes Pons. Used same solution as the MicroVAX 3900 ROM access logic suggested by Sergy Oboguev in April 2012. --- VAX/vax630_sysdev.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/VAX/vax630_sysdev.c b/VAX/vax630_sysdev.c index bf285abe..3e04b2cd 100644 --- a/VAX/vax630_sysdev.c +++ b/VAX/vax630_sysdev.c @@ -319,10 +319,11 @@ return ((val << 24) & 0xff000000) | (( val << 8) & 0xff0000) | ((val >> 8) & 0xff00) | ((val >> 24) & 0xff); } +volatile int32 rom_loopval = 0; + int32 rom_read_delay (int32 val) { uint32 i, l = rom_delay; -int32 loopval = 0; if (rom_unit.flags & UNIT_NODELAY) return val; @@ -344,12 +345,12 @@ if (rom_delay == 0) { by subsequent code or to avoid the whole computation being eliminated. */ for (i = 0; i < c; i++) - loopval |= (loopval + ts) ^ rom_swapb (rom_swapb (loopval + ts)); + rom_loopval |= (rom_loopval + ts) ^ rom_swapb (rom_swapb (rom_loopval + ts)); te = sim_os_msec (); if ((te - ts) < 50) /* sample big enough? */ continue; - if (rom_delay < (loopval + (c / (te - ts) / 1000) + 1)) - rom_delay = loopval + (c / (te - ts) / 1000) + 1; + if (rom_delay < (rom_loopval + (c / (te - ts) / 1000) + 1)) + rom_delay = rom_loopval + (c / (te - ts) / 1000) + 1; if (++samples >= 4) break; c = c / 2; @@ -359,8 +360,8 @@ if (rom_delay == 0) { } for (i = 0; i < l; i++) - loopval |= (loopval + val) ^ rom_swapb (rom_swapb (loopval + val)); -return val + loopval; + rom_loopval |= (rom_loopval + val) ^ rom_swapb (rom_swapb (rom_loopval + val)); +return val + rom_loopval; } int32 rom_rd (int32 pa)