Attempt to write an iterator for the multiboot memory map list
This commit is contained in:
		
							parent
							
								
									fad5a48e5b
								
							
						
					
					
						commit
						ec74cb650c
					
				
					 2 changed files with 134 additions and 12 deletions
				
			
		| 
						 | 
					@ -52,6 +52,71 @@ Information::setInformation(Information *info)
 | 
				
			||||||
 * Public
 | 
					 * Public
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Information::MemoryMapIterator::MemoryMapIterator(uint32_t address,
 | 
				
			||||||
 | 
					                                                  uint32_t count)
 | 
				
			||||||
 | 
					    : mCurrent(reinterpret_cast<MemoryChunk *>(address)),
 | 
				
			||||||
 | 
					      mCount(count)
 | 
				
			||||||
 | 
					{ }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Information::MemoryMapIterator::MemoryMapIterator(const MemoryMapIterator& other)
 | 
				
			||||||
 | 
					    : mCurrent(other.mCurrent),
 | 
				
			||||||
 | 
					      mCount(other.mCount)
 | 
				
			||||||
 | 
					{ }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Information::MemoryMapIterator&
 | 
				
			||||||
 | 
					Information::MemoryMapIterator::operator++()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (mCount > 0) {
 | 
				
			||||||
 | 
					        auto p = reinterpret_cast<uint32_t *>(mCurrent);
 | 
				
			||||||
 | 
					        // The size of the current struct is stored at (mCurrent - 4) bytes.
 | 
				
			||||||
 | 
					        mCurrent = (mCurrent + p[-1]);
 | 
				
			||||||
 | 
					        mCount--;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return *this; 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Information::MemoryMapIterator
 | 
				
			||||||
 | 
					Information::MemoryMapIterator::operator++(int)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MemoryMapIterator tmp(reinterpret_cast<uint32_t>(mCurrent), mCount);
 | 
				
			||||||
 | 
					    operator++();
 | 
				
			||||||
 | 
					    return tmp;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MemoryChunk
 | 
				
			||||||
 | 
					Information::MemoryMapIterator::operator*()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (mCount == 0) {
 | 
				
			||||||
 | 
					        return MemoryChunk{0, 0, 0};
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return *mCurrent;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					Information::MemoryMapIterator::operator==(const MemoryMapIterator& other)
 | 
				
			||||||
 | 
					    const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (mCount == 0 && other.mCount == 0) {
 | 
				
			||||||
 | 
					        // If both iterators have 0 counts, it doesn't matter what the mCurrent members point at.
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return mCurrent == other.mCurrent && mCount == other.mCount;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					Information::MemoryMapIterator::operator!=(const MemoryMapIterator& other)
 | 
				
			||||||
 | 
					    const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return !(*this == other);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t
 | 
					uint32_t
 | 
				
			||||||
Information::lowerMemoryKB()
 | 
					Information::lowerMemoryKB()
 | 
				
			||||||
    const
 | 
					    const
 | 
				
			||||||
| 
						 | 
					@ -83,5 +148,35 @@ Information::commandLine()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return reinterpret_cast<const char *>(mCommandLine);
 | 
					    return reinterpret_cast<const char *>(mCommandLine);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t
 | 
				
			||||||
 | 
					Information::memoryMapChunks()
 | 
				
			||||||
 | 
					    const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if ((mFlags & Present::MemoryMap) == 0) {
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return memoryMapCount;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Information::MemoryMapIterator
 | 
				
			||||||
 | 
					Information::memoryMapBegin()
 | 
				
			||||||
 | 
					    const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if ((mFlags & Present::MemoryMap) == 0) {
 | 
				
			||||||
 | 
					        return memoryMapEnd();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return MemoryMapIterator(memoryMapAddress, memoryMapCount);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Information::MemoryMapIterator
 | 
				
			||||||
 | 
					Information::memoryMapEnd()
 | 
				
			||||||
 | 
					    const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return {0, 0};
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
} /* namespace multiboot */
 | 
					} /* namespace multiboot */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,19 +15,51 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace multiboot {
 | 
					namespace multiboot {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct PACKED MemoryChunk
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /** Base address of the chunk of memory. */
 | 
				
			||||||
 | 
					    uint64_t base;
 | 
				
			||||||
 | 
					    /** Length of the chunk of memory, in bytes. */
 | 
				
			||||||
 | 
					    uint64_t length;
 | 
				
			||||||
 | 
					    /** Type of address range. 1 indicates available; all other values indicate reserved memory. */
 | 
				
			||||||
 | 
					    uint32_t type;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * The multiboot information struct. Defined by the multiboot spec.
 | 
					 * The multiboot information struct. Defined by the multiboot spec.
 | 
				
			||||||
 * See http://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Machine-state
 | 
					 * See http://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Machine-state
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct PACKED Information
 | 
					struct PACKED Information
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    struct MemoryMapIterator
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        MemoryMapIterator(uint32_t address, uint32_t count);
 | 
				
			||||||
 | 
					        MemoryMapIterator(const MemoryMapIterator& other);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        MemoryMapIterator& operator++();
 | 
				
			||||||
 | 
					        MemoryMapIterator operator++(int);
 | 
				
			||||||
 | 
					        MemoryChunk operator*();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        bool operator==(const MemoryMapIterator& other) const;
 | 
				
			||||||
 | 
					        bool operator!=(const MemoryMapIterator& other) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private:
 | 
				
			||||||
 | 
					        MemoryChunk *mCurrent;
 | 
				
			||||||
 | 
					        uint32_t mCount;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static const Information *information();
 | 
					    static const Information *information();
 | 
				
			||||||
    static void setInformation(Information* info);
 | 
					    static void setInformation(Information* info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint32_t lowerMemoryKB() const;
 | 
					    uint32_t lowerMemoryKB() const;
 | 
				
			||||||
    uint32_t upperMemoryKB() const;
 | 
					    uint32_t upperMemoryKB() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const char* commandLine() const;
 | 
					    const char* commandLine() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t memoryMapChunks() const;
 | 
				
			||||||
 | 
					    MemoryMapIterator memoryMapBegin() const;
 | 
				
			||||||
 | 
					    MemoryMapIterator memoryMapEnd() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Bit field of flags. Fields below are only defined if the appropriate
 | 
					     * Bit field of flags. Fields below are only defined if the appropriate
 | 
				
			||||||
| 
						 | 
					@ -98,16 +130,16 @@ private:
 | 
				
			||||||
    } symbols;
 | 
					    } symbols;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
					     * @defgroup Memory Map
 | 
				
			||||||
     * Points to a buffer containing a memory map of the machine provided by the
 | 
					     * Points to a buffer containing a memory map of the machine provided by the
 | 
				
			||||||
     * BIOS. Defined only if `memoryMapPresent == true`.
 | 
					     * BIOS. Defined only if `memoryMapPresent == true`.
 | 
				
			||||||
 | 
					     * @{
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    struct PACKED
 | 
					    /** Number of memory map entries present. */
 | 
				
			||||||
    {
 | 
					    uint32_t memoryMapCount;
 | 
				
			||||||
        /** Number of memory map entries present. */
 | 
					    /** Pointer to start of memory map entry array. */
 | 
				
			||||||
        uint32_t count;
 | 
					    uint32_t memoryMapAddress;
 | 
				
			||||||
        /** Pointer to start of memory map entry array. */
 | 
					    /** @} */
 | 
				
			||||||
        uint32_t address;
 | 
					 | 
				
			||||||
    } memoryMap;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Points to a buffer containing a list of drive definitions provided by the
 | 
					     * Points to a buffer containing a list of drive definitions provided by the
 | 
				
			||||||
| 
						 | 
					@ -152,11 +184,6 @@ struct PACKED Module
 | 
				
			||||||
    uint32_t reserved;
 | 
					    uint32_t reserved;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO: Define the MemoryMap struct
 | 
					 | 
				
			||||||
struct PACKED MemoryChunk
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// TODO: Define the Drive struct
 | 
					// TODO: Define the Drive struct
 | 
				
			||||||
struct PACKED Drive
 | 
					struct PACKED Drive
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue