diff --git a/src/system/kernel/device_manager/device_manager.cpp b/src/system/kernel/device_manager/device_manager.cpp index e1d3bfbe86..503da86418 100644 --- a/src/system/kernel/device_manager/device_manager.cpp +++ b/src/system/kernel/device_manager/device_manager.cpp @@ -30,6 +30,7 @@ #include "BaseDevice.h" #include "devfs_private.h" #include "id_generator.h" +#include "io_requests.h" #include "io_resources.h" @@ -268,7 +269,63 @@ dump_attribute(device_attr* attr, int32 level) static int -dump_device_nodes(int argc, char **argv) +dump_io_request(int argc, char** argv) +{ + if (argc != 2 || !strcmp(argv[1], "--help")) { + kprintf("usage: %s \n", argv[0]); + return 0; + } + + IORequest* request = (IORequest*)parse_expression(argv[1]); + request->Dump(); + return 0; +} + + +static int +dump_io_operation(int argc, char** argv) +{ + if (argc != 2 || !strcmp(argv[1], "--help")) { + kprintf("usage: %s \n", argv[0]); + return 0; + } + + IOOperation* operation = (IOOperation*)parse_expression(argv[1]); + operation->Dump(); + return 0; +} + + +static int +dump_io_buffer(int argc, char** argv) +{ + if (argc != 2 || !strcmp(argv[1], "--help")) { + kprintf("usage: %s \n", argv[0]); + return 0; + } + + IOBuffer* buffer = (IOBuffer*)parse_expression(argv[1]); + buffer->Dump(); + return 0; +} + + +static int +dump_dma_buffer(int argc, char** argv) +{ + if (argc != 2 || !strcmp(argv[1], "--help")) { + kprintf("usage: %s \n", argv[0]); + return 0; + } + + DMABuffer* buffer = (DMABuffer*)parse_expression(argv[1]); + buffer->Dump(); + return 0; +} + + +static int +dump_device_nodes(int argc, char** argv) { sRootNode->Dump(); return 0; @@ -2160,10 +2217,16 @@ device_manager_init(struct kernel_args* args) sRootNode->Dump(); #endif - add_debugger_command("dm_tree", &dump_device_nodes, - "dump device node tree"); register_generic_syscall(DEVICE_MANAGER_SYSCALLS, control_device_manager, 1, 0); + + add_debugger_command("dm_tree", &dump_device_nodes, + "dump device node tree"); + add_debugger_command("io_request", &dump_io_request, "dump an I/O request"); + add_debugger_command("io_operation", &dump_io_operation, + "dump an I/O operation"); + add_debugger_command("io_buffer", &dump_io_buffer, "dump an I/O buffer"); + add_debugger_command("dma_buffer", &dump_dma_buffer, "dump a DMA buffer"); return B_OK; } diff --git a/src/system/kernel/device_manager/dma_resources.cpp b/src/system/kernel/device_manager/dma_resources.cpp index 9cc81ee556..32fa7842ff 100644 --- a/src/system/kernel/device_manager/dma_resources.cpp +++ b/src/system/kernel/device_manager/dma_resources.cpp @@ -82,6 +82,22 @@ DMABuffer::UsesBounceBufferAt(uint32 index) } +void +DMABuffer::Dump() const +{ + kprintf("DMABuffer at %p\n", this); + + kprintf(" bounce buffer: %p (physical %#lx)\n", fBounceBuffer, + fPhysicalBounceBuffer); + kprintf(" bounce buffer size: %lu\n", fBounceBufferSize); + kprintf(" vecs: %lu\n", fVecCount); + + for (uint32 i = 0; i < fVecCount; i++) { + kprintf(" [%lu] %p, %lu\n", i, fVecs[i].iov_base, fVecs[i].iov_len); + } +} + + // #pragma mark - diff --git a/src/system/kernel/device_manager/dma_resources.h b/src/system/kernel/device_manager/dma_resources.h index 421fc0a497..9cf07bdf56 100644 --- a/src/system/kernel/device_manager/dma_resources.h +++ b/src/system/kernel/device_manager/dma_resources.h @@ -51,6 +51,8 @@ public: bool UsesBounceBufferAt(uint32 index); void SetToBounceBuffer(size_t length); + void Dump() const; + private: void* fBounceBuffer; addr_t fPhysicalBounceBuffer; diff --git a/src/system/kernel/device_manager/io_requests.cpp b/src/system/kernel/device_manager/io_requests.cpp index 9e574cfe42..0f0e13cbea 100644 --- a/src/system/kernel/device_manager/io_requests.cpp +++ b/src/system/kernel/device_manager/io_requests.cpp @@ -122,6 +122,23 @@ IOBuffer::UnlockMemory(team_id team, bool isWrite) } +void +IOBuffer::Dump() const +{ + kprintf("IOBuffer at %p\n", this); + + kprintf(" origin: %s\n", fUser ? "user" : "kernel"); + kprintf(" kind: %s\n", fPhysical ? "physical" : "virtual"); + kprintf(" length: %lu\n", fLength); + kprintf(" capacity: %lu\n", fCapacity); + kprintf(" vecs: %lu\n", fVecCount); + + for (uint32 i = 0; i < fVecCount; i++) { + kprintf(" [%lu] %p, %lu\n", i, fVecs[i].iov_base, fVecs[i].iov_len); + } +} + + // #pragma mark - @@ -496,6 +513,35 @@ IOOperation::_CopyPartialEnd(bool isWrite) } +void +IOOperation::Dump() const +{ + kprintf("io_operation at %p\n", this); + + kprintf(" parent: %p\n", fParent); + kprintf(" status: %s\n", strerror(fStatus)); + kprintf(" dma buffer: %p\n", fDMABuffer); + kprintf(" offset: %-8Ld (original: %Ld)\n", fOffset, + fOriginalOffset); + kprintf(" length: %-8lu (original: %lu)\n", fLength, + fOriginalLength); + kprintf(" transferred: %lu\n", fTransferredBytes); + kprintf(" block size: %lu\n", fBlockSize); + kprintf(" saved vec index: %u\n", fSavedVecIndex); + kprintf(" saved vec length: %u\n", fSavedVecLength); + kprintf(" r/w: %s\n", IsWrite() ? "write" : "read"); + kprintf(" phase: %s\n", fPhase == PHASE_READ_BEGIN + ? "read begin" : fPhase == PHASE_READ_END ? "read end" + : fPhase == PHASE_DO_ALL ? "do all" : "unknown"); + kprintf(" partial begin: %s\n", fPartialBegin ? "yes" : "no"); + kprintf(" partial end: %s\n", fPartialEnd ? "yes" : "no"); + kprintf(" bounce buffer: %s\n", fUsesBounceBuffer ? "yes" : "no"); + + set_debug_variable("_parent", (addr_t)fParent); + set_debug_variable("_buffer", (addr_t)fDMABuffer); +} + + // #pragma mark - @@ -1055,6 +1101,47 @@ IORequest::_CopyUser(void* _bounceBuffer, void* _external, size_t size, } +void +IORequest::Dump() const +{ + kprintf("io_request at %p\n", this); + + kprintf(" parent: %p\n", fParent); + kprintf(" status: %s\n", strerror(fStatus)); + kprintf(" mutex: %p\n", &fLock); + kprintf(" IOBuffer: %p\n", fBuffer); + kprintf(" offset: %Ld\n", fOffset); + kprintf(" length: %lu\n", fLength); + kprintf(" transfer size: %lu\n", fTransferSize); + kprintf(" relative offset: %lu\n", fRelativeParentOffset); + kprintf(" pending children: %ld\n", fPendingChildren); + kprintf(" flags: %#lx\n", fFlags); + kprintf(" team: %ld\n", fTeam); + kprintf(" r/w: %s\n", fIsWrite ? "write" : "read"); + kprintf(" partial transfer: %s\n", fPartialTransfer ? "yes" : "no"); + kprintf(" finished cvar: %p\n", &fFinishedCondition); + kprintf(" iteration:\n"); + kprintf(" vec index: %lu\n", fVecIndex); + kprintf(" vec offset: %lu\n", fVecOffset); + kprintf(" remaining bytes: %lu\n", fRemainingBytes); + kprintf(" callbacks:\n"); + kprintf(" finished %p, cookie %p\n", fFinishedCallback, fFinishedCookie); + kprintf(" iteration %p, cookie %p\n", fIterationCallback, + fIterationCookie); + kprintf(" children:\n"); + + IORequestChunkList::ConstIterator iterator = fChildren.GetIterator(); + while (iterator.HasNext()) { + kprintf(" %p\n", iterator.Next()); + } + + set_debug_variable("_parent", (addr_t)fParent); + set_debug_variable("_mutex", (addr_t)&fLock); + set_debug_variable("_buffer", (addr_t)fBuffer); + set_debug_variable("_cvar", (addr_t)&fFinishedCondition); +} + + // #pragma mark - diff --git a/src/system/kernel/device_manager/io_requests.h b/src/system/kernel/device_manager/io_requests.h index f80cfe104d..b6da468e3d 100644 --- a/src/system/kernel/device_manager/io_requests.h +++ b/src/system/kernel/device_manager/io_requests.h @@ -55,6 +55,8 @@ public: status_t LockMemory(team_id team, bool isWrite); void UnlockMemory(team_id team, bool isWrite); + void Dump() const; + private: IOBuffer(); ~IOBuffer(); @@ -155,6 +157,8 @@ public: void SetBuffer(DMABuffer* buffer) { fDMABuffer = buffer; } + void Dump() const; + protected: void _PrepareVecs(); status_t _CopyPartialBegin(bool isWrite, @@ -268,6 +272,8 @@ struct IORequest : IORequestChunk, DoublyLinkedListLinkImpl { status_t CopyData(const void* buffer, off_t offset, size_t size); + void Dump() const; + private: status_t _CopyData(void* buffer, off_t offset, size_t size, bool copyIn);