Annotation of tme/TODO, revision 1.1.1.4

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.)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.