|
|
1.1.1.2 root 1: the sun2 mainbus signal handler needs to OR together like signals from
2: the different buses; right now the state of a signal on the mainbus is
3: just the state of the signal on the last bus that happened to call it
4: out. this will cause interrupts to get lost (but because of cooperative
5: threading, this probably isn't manifesting now).
6:
1.1 root 7: clean up posix-serial callouts to be like 3c400
8:
9: is the (brief) extension word handling correct for PC-relative
10: EAs when there are multiple brief extension words? (i.e., is
11: first_ea_extword_offset updated (does it need to be?))
12:
13: in type 8 frames, we currently store the address as it appeared
14: on the bus - i.e., only 24 bits, not the full 32. maybe this is
15: incorrect?
16:
17: should tme_m68k_rte_start have more RESTARTING checks?
18:
19: are the data input buffer and data output buffers being kept in the
20: right endianness in both the trap frames and in the ic buffers?
21:
22: watch out for (raw[0] << 4) possibly staying 8-bit and then overflowing
23: in tme_m68k_insn_buffer_xfer
24:
25: optimization: have the fast executor only execute an instruction if
26: there are TME_M68K_INSN_WORDS_MAX * sizeof(tme_uint16_t) bytes
27: available. note that this does *not* eliminate the need for the
28: group0 hook entirely, since while we guarantee that we won't fault on
29: an instruction fetch, we still might fault on data in
30: mid-instruction-fetch. this optimization would however remove a
31: test and goto in the fast FETCH macros.
32:
1.1.1.2 root 33: /* version enforcement: */
34: #if !defined(TME_BUS_DEVICE_VERSION) || TME_VERSION_CURRENT_X(TME_BUS_DEVICE_VERSION) != 0
35: #error "check your sources; <tme/bus-device.h> version is now 0"
36: #endif
37:
38: /* includes: */
39: #include <tme/element.h>
40: #undef TME_BUS_VERSION
41: #define TME_BUS_VERSION TME_VERSION_X(0, 0, 0)
42: #include <tme/generic/bus.h>
43:
44: sun-sc's slow cycle implementation is broken; it should use the new
45: bus-device dma support
46:
47: if a tlb_fill function invalidates previous TLBs, make sure that it
48: invalidates before it fills (since it may be filling the same
49: structure it wants to invalidate.)
50:
51: m68k: lowering the interrupt priority mask below 7 when the external
52: priority is 7 causes another NMI to be recognized.
53:
54: TLBs filled for DVMA space for the VME bus shouldn't refer to the
55: obmem bus fault handler, right?
56:
57: file a PR against NetBSD/sun3 1.6.x:
58: sys/arch/sun3/dev/if_ie.c:ie_readframe(), when NBPFILTER == 0, calls
59: ieget() with NULL for its int *to_bpf argument. this ultimately
60: causes a NULL dereference in (the inline expansion of) check_eh() -
61: witness a "clrl 0" instruction in the compiler output for
62: ie_readframe(). proper fix is to remove the *to_bpf = 0 in check_eh().
63:
64: file a PR against NetBSD/sun3:
65: XXX FIXME - this hack works around a bug in NetBSD/sun3, present
66: since revision 1.49 of src/sys/arch/sun3/conf/GENERIC (when the
67: sun3x port was merged into the sun3 port). in this revision, the
68: declaration for cgtwo0 changed:
69:
70: -cgtwo0 at vmes0 addr 0xff400000 level 4 vect 0xA8
71: +cgtwo0 at vme2 addr 0x400000 ipl 4 vect 0xA8
72:
73: because the cg2mmap() function in src/sys/arch/sun3/dev/cg2.c
74: doesn't add the 0xff000000 mask to the configured physical
75: address (needed because the cgtwo is an A24 device), when Xsun
76: mmap()s the cgtwo it gets a mapping of physical address 0x400000
77: in VME space instead of the correct 0xff400000. the sparc cgtwo
78: driver gets this right.
79:
80: - bus: DRQ(x) and DACK(x), with an UNSPEC
81: - ncr5380: bug where a SCSI callout deferred because of a higher-priority callout isn't put into later_callouts
1.1.1.3 root 82:
83: in ncr5380.c:_tme_ncr5380_bus_tlb_fill(), the structure assignment
84: of *tlb from *ncr5380->tme_ncr5380_dma_tlb may copy fields partially
85: and/or out-of-order, such that the subsequent relevance test succeeds
86: when it should fail? we should probably test at least the important,
87: invalidating fields in *ncr5380->tme_ncr5380_dma_tlb instead of the
88: local *tlb? XXX actually, ncr5380.c needs to use the new TLB
89: valid/invalid tests, and be made more thread-safe.
90:
91: in ncr5380.c:_tme_ncr5380_scsi_cycle(), we test if tme_scsi_dma_in
92: points to the internal FIFO to determine if the transfer was a read;
93: however, if the transfer was a write this value may be garbage (under
94: NDEBUG, it isn't initialized in _tme_ncr5380_callout()) that happens
95: to match the internal FIFO anyways.
96:
97: the SCSI DMA structure needs to be expanded to support tme_shared
98: pointers and bus boundary values, and scsi-bus.c needs to use
99: tme_memory_bus_read_buffer(), tme_memory_bus_write_buffer() as
100: appropriate.
101:
102: need barriers in the m68k read/write/fetch, etc. functions
103:
104: remove the locks argument from the generic bus-device DMA functions, since
105: elements are only supposed to have a single mutex (and provide a pointer
106: to the mutex in the struct tme_bus_device, or maybe have the mutex in the
107: struct tme_bus_device).
108:
109: sun4: log when cache and memerr become visible/invisible
110: sun4: log when FPU compliance changes
111:
112: bus-device-auto.sh: keep bus router from device structure in a local,
113: in case it gets changed during a callout
114:
115: ncr53c9x: the SS2 esp is really an ESP100A, not an ESP100.
116:
117: sparc: for long-lived idle types, print address when first detected
118:
119: sparc: most unimplemented instructions cause NULL dereferences from opcode table
120:
121: gtk-keyboard.c: some X servers actually *don't* give locking behavior
122: to the Caps_Lock, Num_Lock, etc., keysyms, and this causes problems.
123: see the comments in _tme_gtk_keyboard_x11_new().
124:
125: sun4: FAILURE: SEVAR (60000004) Power-Up, Exp = 00000000, Obs = ffed9000
126:
1.1.1.4 ! root 127: add [] to all tr character classes, so they work for SysV
! 128:
! 129: sparc: convert tme_sparc_ls_tlb_map from a struct tme_bus_tlb to a new struct type,
! 130: since it uses various fields that will disappear in the bus cycle transition.
! 131:
! 132: sparc64 recode: don't assist membar instructions
! 133: sparc64 recode: don't redispatch return instructions; instead they
! 134: should return a value for the TME_SPARC_IREG_PC_NEXT register, and we
! 135: should set pc_advance and reg_guest_pc so PCs won't get updated by the
! 136: TME_SPARC_RECODE_INSN_UPDATE_PCS code. (but what about a return in a
! 137: branch delay slot? - just add it to
! 138: _tme_sparc_recode_insn_branch_delay_bad())
! 139:
! 140: sparc64 recode: make the %rcc flags thunk only do 64-bit flags (the
! 141: 32-bit flags shouldn't be needed)
! 142:
! 143: recode: we must document that tme_recode_insns_thunk() REQUIRES that
! 144: guest read/write instructions THAT ARE READS have
! 145: TME_RECODE_OPERAND_ZERO for tme_recode_insn_operand_src[1] (this frees
! 146: tme_recode_insns_thunk() from having to skip _src[1] on a read).
! 147: this should be an assert().
! 148:
! 149: tme_bus_tlb_map() - check that addr_offset can be a tme_bus_addr_t,
! 150: no matter what tme_bus_addr_t's size.
! 151:
! 152: sparc64 recode: TME_SPARC_RECODE_SRC_HASH_SIZE_ELEMENT assumes
! 153: that sizeof(tme_sparc_recode_src_key_t) >= sizeof(tme_recode_thunk_off_t)
! 154:
! 155: sparc64 FPU: the new operations (especially FMOVcc) are always
! 156: present, no matter what the architecture. this exposes us to guests.
! 157:
! 158: x86 recode: stack alignment correct for a read/write assist call on an
! 159: x86_64 host?
! 160:
! 161: SUN-ULTRA-1: make the onboard esp0 revision 2, and the onboard
! 162: ncr53c9x a variant esp200
! 163:
! 164: sparc64 recode: a redispatch should probably encourage thunk
! 165: generation (otherwise, after a wrpsr we'll interpret instructions
! 166: until the next branch), something similar to the encouragement
! 167: at the end of the sparc-execute.c recode thunk running.
! 168:
! 169: sparc execute: note that the V8 execute_trap ISP description notes
! 170: that if a trap is taken preinstruction when annul != 0, the PCs are
! 171: just advanced past the annulled instruction when they are saved for
! 172: the trap (i.e., in the trap case, the annulled instruction isn't
! 173: fetched). if we put the annulled bit into tme_sparc, we wouldn't have
! 174: to force _tme_sparc_instruction_burst_remaining to be at least one
! 175: after an annulling branch (if the burst was zero, we'll fetch the
! 176: annulled instruction at the beginning of the next burst) and we'll get
! 177: better emulation (because a real CPU doesn't fetch an annulled
! 178: instruction when the previous instruction traps - but how could this
! 179: happen, anyways? how can you annul an instruction but take a trap
! 180: before it's fetched? maybe that's only possible by a trap for an
! 181: interrupt?)
! 182:
! 183: sparc preemptive threading: an std must execute atomically; we must
! 184: do one store instead of two.
! 185:
! 186: stp103x: there may be a race on setting TICK.INT_DIS, where you
! 187: may still get a tick interrupt afterwards?
! 188:
! 189: make a version of tme_misc_cycles_spin_until() that doesn't
! 190: do too many gettimeofday() calls?
! 191:
! 192: sparc64 recode: do we need to address-mask PC in
! 193: _tme_sparc_recode_recode()?
! 194:
! 195: sparc64 recode: we should address-mask the PC_next_nexts made
! 196: in the assist functions.
! 197:
! 198: sparc32 external: remove the interrupt acknowledge cycle
! 199:
! 200: make tme_sjlj_sleep_yield() and tme_sjlj_cond_sleep_yield() return
! 201: immediately if the time to sleep is zero (because otherwise,
! 202: tme_sjlj_yield() will think the thread is blocked).
! 203:
! 204: sparc64 recode assist: it's only necessary to set PC_next_next if
! 205: the instruction handler might redispatch; are there any assist
! 206: types where we know that the handler will not redispatch?
! 207:
! 208: replace some gettimeofday() calls with tme_gettimeofday(),
! 209: also with tme_thread_long() as needed.
! 210:
! 211: sunfb bus transition: instead of initializing the completion error,
! 212: tme_sunfb_bus_cycle_transition() should poison it and make sure that
! 213: the cycle handler defines it *and* the fast cycle types.
! 214:
! 215: sparc execute: check for an external check at the beginning of
! 216: tme_sparc_thread():TME_SPARC_MODE_EXECUTION, and truncate the
! 217: execution burst if true?
! 218:
! 219: sparc optimization: in tme_sparc${arch}_ls(), push the poisoning of an
! 220: unusable TLB entry before the address_map call, into the address_map
! 221: functions (and only if they trap).
! 222:
! 223: sparc: in tme_sparc${arch}_ls(), should a TME_SPARC_LSINFO_OP_ATOMIC
! 224: start out as TME_BUS_CYCLE_READ? this would at least make a TLB miss
! 225: report the access as a read. the ultrasparc manual isn't clear if
! 226: atomics are always reported in SFSR as writes.
! 227:
! 228: threading: any threading implementation must call tme_thread_long() as
! 229: needed, including in its own tme_*_yield() functions as needed.
! 230:
! 231: NetBSD/sparc (>=5.x only?): on some hosts and some debugging setups,
! 232: keys will unexpectedly repeat in the guest when large updates are
! 233: happening on the text console:
! 234: 1. original keypress, starts key repeat callout
! 235: 2. user process writes a lot to the console kd device
! 236: 3. kd.c:kd_putfb() does splsoftclock() and calls prom_putstr()
! 237: 4. while prom_putstr() is running, the key release interrupt
! 238: happens. since we're at splsoftclock(), the zs soft interrupt
! 239: for the key release is held pending. (the key repeat callout is
! 240: only cancelled in the soft interrupt path.)
! 241: 5. while prom_putstr() is running, the key repeat callout expires.
! 242: since we're at splsoftclock(), the callout is held pending. it
! 243: is now too late to avoid the key repeating.
! 244: 6. prom_putstr() finally finishes. the key repeat callout is called
! 245: (either before or after the zs soft interrupt, it doesn't matter)
! 246: and repeats the key.
! 247: in a non-debugging setup (-DNDEBUG, -DTME_NO_LOG, etc.) the emulator
! 248: seems fast enough that prom_putstr() finishes before the key repeat
! 249: callout expires, which is why this problem probably won't get fixed.
! 250: (before recode, we may have avoided the problem because the emulator
! 251: was actually too slow - the key release interrupt could have happened
! 252: even before we got to the prom_putstr() point.)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.