The Pedigree Project 0.1
Todo List
Member AtaDisk::doRead (uint64_t location)

What's the best way to handle this?

What's the best way to handle this?

logical sector size here

getPageSize() here

Member AtaDisk::doWrite (uint64_t location)
might still want to allow writes - assuming CDROM here...
Member AtaDisk::initialise (size_t nUnit=~0)

Testing needs to be done on more than just CD/DVD and block devices...

should check that this doesn't break on ATAPI

Member AtaDisk::writePageBuffer (uint64_t location, uintptr_t page)
What's the best way to handle this?
Member BusMasterIde::add (uintptr_t buffer, size_t nBytes)
Can't write if a read is in progress, and vice versa
Member BusMasterIdeCommandRegister::__attribute__ ((packed)) bits
I blanked when writing this, so I can't remember if this defines "bits" as a packed structure or if the attribute is ignored...
Member Cache::insert (uintptr_t key, bool *alreadyExisted=nullptr)
remove this, it makes the bloom filter pointless
Member ConsoleFile::inputLineDiscipline (ConsoleIoState &state, char *buf, size_t len, bool canBlock, size_t flags=~0U, const char *controlChars=nullptr)
remove me, this is because of the port
Class ConstantString< N >
make String hashes more expressive so we can do a compile-time hash of these ConstantString objects and avoid the runtime computation.
Member Cord::operator[] (size_t index) const
should this be more crashy?
Member Debugger::start (InterruptState &state, LargeStaticString &description)
OZMFGBARBIE, this needs major cleanup. Look at the state of it!! :O
Member Device::foreach (Callback callback, Device *root=0)

add filters to avoid the need to filter in callbacks

add a way to end iteration early

Module dhcp4
:
  • Support for interfaces other than Ethernet (SLIP, PPP, ...)
Class Directory
Need to add a way to count # of times a particular lookup has happened so we can potentially offer a way to cull directory entries that are otherwise just consuming space.
Member Display::setScreenMode (size_t nWidth, size_t nHeight, size_t nBpp)
"Closest match": allow a threshold for a match in case the specific mode specified cannot be set.
Member DwarfState::getRegister (unsigned int nRegister, const DwarfState &initialState) const
This needs to be better - we need to check if the CFA is borked so we don't try to do a stupid read - This requires VirtualAddressSpace, I think.
Member DynamicLinker::initPlt (Elf *pElf, uintptr_t value)

Change this to use the size of the elf!

Change this to use the size of the elf!

Member Elf::allocate (uint8_t *pBuffer, size_t length, uintptr_t &loadBase, SymbolTable *pSymtab=0, bool bAllocate=true, size_t *pSize=0)
Don't rely on this. Look at nchain in the hash table.
Member Elf::extractEntryPoint (uint8_t *pBuffer, size_t length, uintptr_t &entry)
check magic
Member Elf::extractInformation (uint8_t *pBuffer, size_t length, size_t &phdrCount, size_t &phdrEntrySize, uintptr_t &phdrAddress)
check magic
Member Elf::loadModule (uint8_t *pBuffer, size_t length, uintptr_t &loadBase, size_t &loadSize, SymbolTable *pSymbolTableCopy=0)

we should handle hidden symbols better so they are only needed for relocation and not tracked forever

Figure out how to map to the pages loaded by GRUB instead of copying into newly-allocated pages here.

Member Elf::populateSymbolTable (SymbolTable *pSymtab, uintptr_t loadBase)
Don't rely on this. Look at nchain in the hash table.
Member Ext2Directory::addEntry (const String &filename, File *pFile, size_t type)
Ensure 4-byte alignment.
Member Ext2Directory::removeEntryLocked (const String &filename, Ext2Node *pFile)
Okay, this is not quite enough. The previous entry needs to be updated to skip past this now-empty entry. If this was the first entry, a blank record must be created to point to either the next entry or the end of the block.
Member Ext2Filesystem::createNode (File *parent, const String &filename, uint32_t mask, const String &value, size_t type, uint32_t inodeOverride=0)

Endianness!

save group descriptor block number elsewhere

Member Ext2Filesystem::findFreeBlocksInGroup (uint32_t group, size_t maxCount, Vector< uint32_t > &blocks)

Endianness - to ensure correct operation, must ptr be little endian?

save group descriptor block number elsewhere

Member Ext2Filesystem::initialise (Disk *pDisk)

Check for journal required features.

Check all read-only features.

Set g_pSparseBlock as read-only.

Member Ext2Filesystem::releaseBlockLocked (uint32_t block, uint32_t inode=0)
save group descriptor block number elsewhere
Member Ext2Filesystem::removeNode (File *parent, const String &filename, File *file)
save group descriptor block number elsewhere
Member Ext2Filesystem::retireInodeLocked (uint32_t inode, Ext2Node *lastNode)
save group descriptor block number elsewhere
Member Ext2Node::fileAttributeChanged (size_t size, size_t atime, size_t mtime, size_t ctime)
4GB files.
Member FatDirectory::FatDirectory (String name, uintptr_t cluster, class FatFilesystem *pFs, File *pParent, FatFileInfo &info, uint32_t dirClus=0, uint32_t dirOffset=0)
Permissions
Member FatFilesystem::convertFilenameTo (String filename) const
This should increment if a file is found with the same name!
Member File::read (uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true) final
consider caching this still
Member File::writeCallback (CacheConstants::CallbackCause cause, uintptr_t loc, uintptr_t page, void *meta)
handle block size < 4K??
Member File::writeUnlocked (uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock)
consider caching this still
Member FileDescriptor::fdflags
swap this to private and fix everything that breaks
Member FileDescriptor::FileDescriptor (File *newFile, uint64_t newOffset=0, size_t newFd=0xFFFFFFFF, int fdFlags=0, int flFlags=0)
need a copy constructor for networkImpl
Class FileDisk
Expose functionality here as a Service - specifically creating/removing disks.
Member FileDisk::cacheIsCritical ()
Could it be possible to allow writes to go through to the file we've mounted? Then this could return true if the backing device is read-only, false otherwise.
Member FileDisk::write (uint64_t location)
implement this
Member Filesystem::findNode (File *pNode, StringView path, File *stableStart, File *trueRoot, File **retainedResult)
do we need to do permissions checks at each intermediate step?
Member Framebuffer::redraw (size_t x=~0UL, size_t y=~0UL, size_t w=~0UL, size_t h=~0UL, bool bChild=false)
nChildren parameter - this is not necessary if no children!
Member Framebuffer::swBlit (Graphics::Buffer *pBuffer, size_t srcx, size_t srcy, size_t destx, size_t desty, size_t width, size_t height)
This code is broken for the case where srcx/srcy are not zero. :(
Member Framebuffer::swCopy (size_t srcx, size_t srcy, size_t destx, size_t desty, size_t w, size_t h)
consider source bytes per line?
Member Framebuffer::swCreateBuffer (const void *srcData, Graphics::PixelFormat srcFormat, size_t width, size_t height, uint32_t *pPalette)
8-bit
Member Framebuffer::swRect (size_t x, size_t y, size_t width, size_t height, uint32_t colour, Graphics::PixelFormat format)

Handle 24-bit properly

Handle 24-bit properly

Member Framebuffer::swSetPixel (size_t x, size_t y, uint32_t colour, Graphics::PixelFormat format=Graphics::Bits32_Argb)
8-bit
Member FramebufferFile::m_pGraphicsParameters
pinBlock/unpinBlock should pin/unpin physical pages!
Member FramebufferFile::readBlock (uint64_t location)
If this is NOT virtual, we need to do something about that.
Member g_FreePages
expose this via PhysicalMemoryManager interface
Class HashTable< K, V, SiblingK, InitialBuckets, QuadraticProbe, GrowthFactor >
check InitialBuckets for is a power of two
Member HidUtils::sendInputToManager (HidDeviceType deviceType, uint16_t nUsagePage, uint16_t nUsage, int64_t nRelativeValue)
Matt, fix the damn input manager!!!
Member HostedInterruptManager::interrupt (InterruptState &interruptState)
Provide a better entry point for system shutdown.
Member HostedPhysicalMemoryManager::m_MemoryRegions
rename this member (conflicts with PhysicalMemoryManager::m_MemoryRegions)
Member HostedSchedulerState::getInstructionPointer () const
implement this somehow?
Member IntervalTimer::signal ()
sanity check that this is absolutely a PosixSubsystem
Member Iso9660Filesystem::initialise (Disk *pDisk)
Obtain disk information (perhaps a new call in Disk?)
Member KernelElf::loadModule (struct ModuleInfo *info, bool silent=false)
rewrite to the new module dependency logic
Member LocksCommand::lockReleased (const Spinlock *pLock, size_t nCpu=~0U)
not SMP-safe...
Member LWIP_NETIF_TX_SINGLE_PBUF
: TCP and IP-frag do not work with this, yet:
Member LwipSocketSyscalls::accept (struct sockaddr_storage *address, socklen_t *addrlen, int flags, DescriptorLease *accepted=nullptr)
handle other families
Member LwipSocketSyscalls::connect (const struct sockaddr_storage *address, socklen_t addrlen)
for accept() we need to do this too
Member LwipSocketSyscalls::create ()
need an error here...
Member LwipSocketSyscalls::getpeername (struct sockaddr_storage *address, socklen_t *address_len)
handle other families
Member LwipSocketSyscalls::getsockname (struct sockaddr_storage *address, socklen_t *address_len)
handle other families
Member LwipSocketSyscalls::netconnCallback (struct netconn *conn, enum netconn_evt evt, uint16_t len)
need a way to do this with lwip when threads are off
Member LwipSocketSyscalls::poll (bool &read, bool &write, bool &error, Semaphore *waiter)
this is buggy as it'll return for the wrong events!
Member MappingCommand::execute (const HugeStaticString &input, HugeStaticString &output, InterruptState &state, DebuggerIO *screen)
define operator != on StaticString
File MemoryMappedFile.h
Handle writing of files, not just reading.
Member MemoryMappedFile::compact () override
Improve this.
Member Ne2k::Ne2k (Network *pDev)
Proper multicast subscription via the Network card abstraction
Member NetworkFilter::filter (size_t level, uintptr_t packet, size_t sz)
Callbacks should be able to return a code which requests a specific response, such as ICMP Unreachable or something, rather than just dropping the packet.
Class ObjectPool< T, poolSize >
add a MemoryPressureHandler here.
Member Ohci::detachED (ED *pED)
Isochronous and Periodic.
Member Ohci::irq (irq_id_t number) override
Handle.
Member Ohci::portReset (uint8_t nPort, bool bErrorResponse=false)
Error handling? Device fails to reset? Not present after reset?
Member Ohci::ptv_ed (physical_uintptr_t phys)
defines for the list sizes so changing one doesn't involve rewriting heaps of code
Member PageFaultHandler::interrupt (size_t interruptNumber, InterruptState &state)
probably can just skip checking for traps across the entire kernel address space?
Member PciAtaController::PciAtaController (Controller *pDev, int nController=0)

Bus master registerss may be memory mapped...

ICH will have "native mode" to worry about

Detect PCI IRQ, don't use ISA IRQs in native mode (etc...)

for ICH and the like, there's more Ultra DMA configuration.

Member PciDevicesFile::resync ()

add driver name here if known?

need to add some flags here

Member PosixSubsystem::checkAddress (uintptr_t addr, size_t extent, size_t flags)
This has a security flaw in that between the check and the use of the actual pointer, the pointer can become invalid due to other threads being active in the process. It may be worth having a Process-wide UnlikelyLock which has the mmap family of functions, sbrk, etc... as writers, and all other syscalls as readers. This would ensure a multithreaded application is not able to crash the kernel.
Member PosixSubsystem::insertThread (size_t n, PosixThread *thread)
It might be safe to delete the pointer... We'll see.
Member PosixSubsystem::removeThread (size_t n)
It might be safe to delete the pointer... We'll see.
Member PosixSubsystem::~PosixSubsystem ()
Call the destructor (need a way to call into userspace and return back here)
Member ProcessorBase::getDebugStatus ()
is the debug status somehow abtractable?
Member ProcFs::addProcess (PosixProcess *proc)

add some info to the directory...

is this correct? or should it be effective user/group?

Member ProcFs::initialise (Disk *pDisk)

add driver name here if known?

need to add some flags here

also probably need /etc/mtab...

need to know parent (if any) so we can add dotdot too

ConstantFile is taking const char *s of all this and holding them which is extremely unsafe. That must be fixed because right now the ConstantFile could point into freed heap memory.

Member PtmxFile::open ()
so, when this master is closed, we'll leak these resources...
Member RadixTree< T >::operator= (const RadixTree &x)
check for incompatible case-sensitivity?
Member RawFsDir::removeRecursive ()

Leaky.

do this

Member ScsiDisk::doRead (uint64_t location)
Cache this somewhere.
Member ScsiDisk::initialise (class ScsiController *pController, size_t nUnit)
Use this data to change how read() and write() work
Member ScsiDisk::readSense (Sense *s)
get the amount of data received from the SCSI device
Member ScsiDisk::unitReady ()
this can fail with UNIT_ATTN or NOT_READY if the device is removable.
Member Serial::setBase (uintptr_t nBaseAddr)=0
make this generic for Mmaped and port IO.
Member SerialIO::putChar (char c, DebuggerIO::Colour foreColour, DebuggerIO::Colour backColour)
This code below is costly and slow, but without it we can't line-wrap. Sort this out.
Class Service
Integrate with the Event system somehow
Class ServiceManager
Integrate with the Event system somehow
Member SharedPointer< T >::release () noexcept
allow specifying a custom function to handle deletion
Member SignalEvent::serialize (uint8_t *pBuffer)
There may be a need for serialization in the future...
Member SlamCache::isPointerValid (uintptr_t object) const
need to figure out how to do this
Member StaticString< N >::right (int n) const
this is technically off-by-one, but I don't feel comfortable changing the behavior -Matt
Class String
provide documentation
Member String::find (const char c) const
this problem only exists because we use return -1 as a status indicator. That could be changed, and we could avoid a signed/unsigned conversion here!
Member sys_thread_new (const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
stacksize might be important
Member TextIO::writeStr (const char *s, size_t len)

Should we handle this?

hook in to Keyboard::setLedState!

Sanity check.

Error out if is Utf8

implement me!

implement me!

Member Thread::setTlsBase (uintptr_t base)
clean up old base
Class ThreadToCoreAllocationAlgorithm
Document.
Class Tree< K, E >::IteratorNode
This will actually mean for each Tree you can only use one iterator at a time, which may not be effective depending on how this is used.
Member UnixSocketSyscalls::bind (const struct sockaddr_storage *address, socklen_t addrlen)
re-bind an unnamed address if we are bound already
Member UnixSocketSyscalls::listen (int backlog)
bind to an unnamed socket if we aren't already bound
Member UsbDevice::getDescriptor (uint8_t nDescriptorType, uint8_t nDescriptorIndex, uint16_t nBytes, uint8_t requestType=0)
Proper language ID handling!
Member UsbDevice::getDescriptorLength (uint8_t nDescriptorType, uint8_t nDescriptorIndex, uint8_t requestType=0)
Proper language ID handling
Member UsbDevice::getString (uint8_t nString)
UTF-8 support of some kind
Member UsbDevice::initialise (uint8_t nAddress)
support more configurations (how?)
Member VFS::m_Instance
Figure out a way to clean up files after deletion. Directory::remove() is not the right place to do this. There needs to be a way to add a File to some sort of queue that cleans it up once it hits refcount zero or something like that.
Member VirtualTerminalManager::getTerminalMode (size_t n) const
validate n
Member VirtualTerminalManager::setTerminalMode (size_t n, struct vt_mode mode)
validate n
Member X64GdtManager::initialiseProcessor () INITIALISATION_ONLY
and some smp/acpi function
Member X64GdtManager::initialiseTss (X64TaskStateSegment *pTss) INITIALISATION_ONLY
this should change
Member X64SyscallManager::syscall (SyscallState &syscallState) USED
this is an extraordinary hack, this should be done in a way more abstract way than this!!
Member X64VirtualAddressSpace::clone (bool copyOnWrite=true)

Deal with 2MB pages here.

figure out how to handle page tracking here

Member X64VirtualAddressSpace::revertToKernelAddressSpace ()

When swap system comes along, we want to remove this page from swap!

Deal with 2MB pages here.

Member X64VirtualAddressSpace::~X64VirtualAddressSpace ()
validate that we're cleaning up enough stuff here for example are we missing stuff like PDPTs etc?
Member X86CommonPhysicalMemoryManager::initialise (const BootstrapStruct_t &Info) INITIALISATION_ONLY
do this in initialise64 too, copying any existing entries.
Member X86CommonPhysicalMemoryManager::m_MemoryRegions
rename this member (conflicts with PhysicalMemoryManager::m_MemoryRegions)
Member X86CommonPhysicalMemoryManager::PageStack::free (uint64_t physicalAddress, size_t length, bool newMemory=false)
make sure callers split any regions that cross over before calling
Member X86IsaDma::initTransfer (uint8_t channel, uint8_t mode, size_t length, uintptr_t addr)
Extra flags to control modes and things
Member X86Keyboard::initialise ()
do we need to switch into a specific scancode set?