summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/Kernel/Core/.kmain.wtf.cpp.swp (renamed from Source/Kernel/MemoryManager/.Mem.ns.cpp.swp)bin20480 -> 20480 bytes
-rw-r--r--Source/Kernel/Core/Sys.ns.cpp2
-rw-r--r--Source/Kernel/Core/kmain.wtf.cpp26
-rw-r--r--Source/Kernel/Devices/BlockDevice.proto.h17
-rw-r--r--Source/Kernel/Devices/Floppy/FloppyController.class.cpp205
-rw-r--r--Source/Kernel/Devices/Floppy/FloppyController.class.h81
-rw-r--r--Source/Kernel/Devices/Floppy/FloppyDrive.class.cpp330
-rw-r--r--Source/Kernel/Devices/Floppy/FloppyDrive.class.h41
-rw-r--r--Source/Kernel/Makefile6
-rw-r--r--Source/Kernel/Map.txt1665
-rwxr-xr-xSource/Kernel/Melon.kebin90058 -> 107776 bytes
-rw-r--r--Source/Kernel/Ressources/keymap-fr.wtf.c2
-rw-r--r--Source/Kernel/VFS/.Part.ns.cpp.swpbin0 -> 12288 bytes
-rw-r--r--Source/Kernel/VFS/Part.ns.cpp59
-rw-r--r--Source/Kernel/VFS/Part.ns.h18
-rw-r--r--Source/Kernel/VFS/Partition.class.cpp25
-rw-r--r--Source/Kernel/VFS/Partition.class.h28
-rw-r--r--Source/Kernel/VTManager/VirtualTerminal.class.cpp28
-rw-r--r--Source/Kernel/VTManager/VirtualTerminal.class.h2
19 files changed, 1845 insertions, 690 deletions
diff --git a/Source/Kernel/MemoryManager/.Mem.ns.cpp.swp b/Source/Kernel/Core/.kmain.wtf.cpp.swp
index 132e9d8..6389e15 100644
--- a/Source/Kernel/MemoryManager/.Mem.ns.cpp.swp
+++ b/Source/Kernel/Core/.kmain.wtf.cpp.swp
Binary files differ
diff --git a/Source/Kernel/Core/Sys.ns.cpp b/Source/Kernel/Core/Sys.ns.cpp
index 9f98c91..faec43a 100644
--- a/Source/Kernel/Core/Sys.ns.cpp
+++ b/Source/Kernel/Core/Sys.ns.cpp
@@ -2,7 +2,7 @@
#include <Core/common.wtf.h>
#include <VTManager/VirtualTerminal.class.h>
-#define DEBUGVT(x) VirtualTerminal *x = new VirtualTerminal(4, 46, 0, 15); x->map(); x->put('\n');
+#define DEBUGVT(x) VirtualTerminal *x = new VirtualTerminal(4, 56, 0, 15); x->map(); x->put('\n');
using namespace CMem;
diff --git a/Source/Kernel/Core/kmain.wtf.cpp b/Source/Kernel/Core/kmain.wtf.cpp
index 7d7030b..a657cac 100644
--- a/Source/Kernel/Core/kmain.wtf.cpp
+++ b/Source/Kernel/Core/kmain.wtf.cpp
@@ -5,6 +5,7 @@
#include <Devices/Display/VGATextOutput.class.h>
#include <Devices/Keyboard/PS2Keyboard.class.h>
+#include <Devices/Floppy/FloppyDrive.class.h>
#include <Devices/Timer.class.h>
#include <DeviceManager/Disp.ns.h>
#include <DeviceManager/Dev.ns.h>
@@ -18,6 +19,7 @@
#include <SyscallManager/IDT.ns.h>
#include <Library/String.class.h>
#include <Library/wchar.class.h>
+#include <VFS/Part.ns.h>
#include <Ressources/logo.cd>
#include <Ressources/keymap-fr.wtf.c>
@@ -104,6 +106,9 @@ void kmain(multiboot_info_t* mbd, u32int magic) {
Kbd::setFocus(kvt); //Set focus to virtual terminal
OK(kvt);
+ PROCESSING(kvt, "Detecting floppy drives...");
+ FloppyController::detect(); OK(kvt);
+
asm volatile("sti");
while(1) {
@@ -119,6 +124,7 @@ void kmain(multiboot_info_t* mbd, u32int magic) {
*kvt << " - devices shows all detected devices on your computer\n";
*kvt << " - free shows memory usage (physical frames and kernel heap)\n";
*kvt << " - uptime shows seconds since boot\n";
+ *kvt << " - part shows all detected block devices and partitions\n";
} else if (tmp == "reboot") {
Sys::reboot();
} else if (tmp == "devices") {
@@ -138,6 +144,26 @@ void kmain(multiboot_info_t* mbd, u32int magic) {
"Ko) of " << (s32int)(kh / 1024 / 1024) << "Mo (" << (s32int)(kh / 1024) << "Ko).\n";
} else if (tmp == "uptime") {
*kvt << " - Uptime : " << (s32int)(Time::uptime()) << "s.\n";
+ } else if (tmp == "part") {
+ *kvt << " * Dev ID\tClass Name\n";
+ for (u32int i = 0; i < Part::devices.size(); i++) {
+ *kvt << " - " << (s32int)i << "\t\t";
+ if (Part::devices[i] == 0) {
+ *kvt << "[none]\n";
+ } else {
+ *kvt << Part::devices[i]->getClass();
+ kvt->setCursorCol(41);
+ *kvt << Part::devices[i]->getName() << "\n";
+ for (u32int j = 0; j < Part::partitions.size(); j++) {
+ if (Part::partitions[j]->getDevice() == Part::devices[i]) {
+ *kvt << "\t - Partition " << (s32int)Part::partitions[j]->getPartNumber() <<
+ ", start at " << (s32int)Part::partitions[j]->getStartBlock() <<
+ ", size " << (s32int)Part::partitions[j]->getBlockCount() << "\n";
+ }
+ }
+ }
+ *kvt << "\n";
+ }
} else if (!tmp.empty()) {
*kvt << " - Unrecognized command: " << tmp << "\n";
}
diff --git a/Source/Kernel/Devices/BlockDevice.proto.h b/Source/Kernel/Devices/BlockDevice.proto.h
new file mode 100644
index 0000000..fa51148
--- /dev/null
+++ b/Source/Kernel/Devices/BlockDevice.proto.h
@@ -0,0 +1,17 @@
+#ifndef DEF_BLOCKDEVICE_PROTO_H
+#define DEF_BLOCKDEVICE_PROTO_H
+
+#include <Devices/Device.proto.h>
+
+class BlockDevice : public Device {
+ public:
+ virtual bool readOnly() = 0;
+ virtual u64int blocks() = 0; //Returns number of blocks on device
+ virtual bool readBlocks(u64int startblock, u32int count, u8int *data) = 0; //Returns false if fails
+ virtual bool writeBlocks(u64int startblock, u32int count, u8int *data) = 0; //Returns false if fails
+ virtual u32int blockSize() = 0; //Usually 512, 2048 for CDROMs
+
+ virtual u64int chsToLBA(u32int cylinder, u32int head, u32int sector) { return 0; } //Can be used by partition manager
+};
+
+#endif
diff --git a/Source/Kernel/Devices/Floppy/FloppyController.class.cpp b/Source/Kernel/Devices/Floppy/FloppyController.class.cpp
new file mode 100644
index 0000000..bafc0a6
--- /dev/null
+++ b/Source/Kernel/Devices/Floppy/FloppyController.class.cpp
@@ -0,0 +1,205 @@
+#include "FloppyController.class.h"
+#include "FloppyDrive.class.h"
+#include <TaskManager/Task.ns.h>
+#include <DeviceManager/Dev.ns.h>
+#include <VFS/Part.ns.h>
+
+using namespace Sys; //For outb/inb
+
+//***********************************************************
+// STATIC, FOR DMA
+//***********************************************************
+Mutex FloppyController::dmaMutex(false);
+u8int FloppyController::dmabuff[FLOPPY_DMALEN]
+ __attribute__((aligned(0x8000)));
+
+bool FloppyController::dmaInit(u8int direction, u32int length) {
+ dmaMutex.waitLock();
+
+ union {
+ u8int b[4];
+ u32int l;
+ } a, c; //Address, count
+
+ //We want the physical address of dmabuff. We simply remove 0xC0000000, because we've mapped memory linearly.
+ a.l = (u32int) &dmabuff - 0xC0000000;
+ c.l = (u32int) length - 1;
+
+ if (
+ (a.l >> 24) || //Address must be under 16mb
+ (c.l >> 16) || //Count must be < 64k
+ (((a.l & 0xFFFF) + c.l) >> 16) //We must not cross a 64k boundary
+ ) { //Something is wrong
+ dmaMutex.unlock();
+ return false;
+ }
+
+ u8int mode;
+ switch (direction) {
+ case FD_READ:
+ mode = 0x46;
+ break;
+ case FD_WRITE:
+ mode = 0x4A;
+ break;
+ default: //Invalid direction
+ dmaMutex.unlock();
+ return false;
+ }
+
+ outb(0x0a, 0x06); //Mask chan 2
+
+ outb(0x0c, 0xff); //Reset flip-flop
+ outb(0x04, a.b[0]); //Address low
+ outb(0x04, a.b[1]); //Address high
+
+ outb(0x81, a.b[2]); //External page register
+
+ outb(0x0c, 0xff); //Reset flip-flop
+ outb(0x05, c.b[0]); //Count low
+ outb(0x05, c.b[1]); //Count high
+
+ outb(0x0b, mode); //Mode
+
+ outb(0x0a, 0x02); //Unmask chan 2
+
+ return true;
+}
+
+void FloppyController::dmaRelease() {
+ dmaMutex.unlock();
+}
+
+//*********************************************************
+// FOR THE CONTROLLER
+//*********************************************************
+u32int floppyMotorTimer() { //This will be an independant thread
+ while(1) {
+ Task::currentThread->sleep(1000); //Check only every second
+ Vector<Device*> floppys = Dev::findDevices("block.floppy");
+ for (u32int i = 0; i < floppys.size(); i++) {
+ FloppyDrive* f = (FloppyDrive*)floppys[i];
+ if (f->m_motorTimeout > 0 && f->m_motorState == FS_MOTORWAIT) {
+ f->m_motorTimeout--;
+ if (f->m_motorTimeout == 0)
+ f->killMotor();
+ }
+ }
+ }
+ return 0;
+}
+
+FloppyController::FloppyController(u32int base, u8int irq) : m_driveMutex(false) {
+ m_activeDrive = 0;
+ m_base = base;
+ m_irq = irq;
+ m_drives[0] = NULL;
+ m_drives[1] = NULL;
+ m_first = false;
+}
+
+void FloppyController::detect() { //TODO : do this better
+ FloppyController *fdc = new FloppyController(0x03F0, 6); //Standard controller, IRQ6 and base port 0x03F0
+ Dev::registerDevice(fdc);
+
+ outb(0x70, 0x10); //CMOS detect
+ u8int drives = inb(0x71);
+
+ u8int fdd0 = (drives >> 4), fdd1 = (drives & 0x0F);
+
+ if (fdd0 != FT_NONE)
+ Dev::registerDevice(new FloppyDrive(fdc, 0, fdd0));
+ if (fdd1 != FT_NONE)
+ Dev::registerDevice(new FloppyDrive(fdc, 1, fdd1));
+ fdc->reset();
+
+ Vector<Device*> fdds = Dev::findDevices("block.floppy");
+ for (u32int i = 0; i < fdds.size(); i++) {
+ Part::registerDevice((BlockDevice*)fdds[i]); //TODO
+ }
+
+ new Thread(floppyMotorTimer, true);
+}
+
+String FloppyController::getClass() {
+ return "controller.floppy";
+}
+
+String FloppyController::getName() {
+ String irq = String::number(m_irq);
+ return String("Floppy controller at IRQ ") += irq;
+}
+
+void FloppyController::checkInterrupt(int *st0, int *cyl) {
+ writeCmd(FC_SENSE_INTERRUPT);
+ *st0 = readData();
+ *cyl = readData();
+}
+
+void FloppyController::setDOR() {
+ u8int dor = 0x0C;
+ if (m_activeDrive == 1)
+ dor |= 0x01;
+ if (m_drives[0] != NULL and m_drives[0]->m_motorState != 0)
+ dor |= 0x10;
+ if (m_drives[1] != NULL and m_drives[1]->m_motorState != 0)
+ dor |= 0x20;
+ asm volatile ("cli");
+ outb(m_base + FR_DOR, dor);
+ if (m_first) { //First time we set the DOR, controller initialized
+ Task::currentThread->waitIRQ(m_irq);
+ int st0, cyl;
+ checkInterrupt(&st0, &cyl);
+ m_first = false;
+ }
+ asm volatile ("sti");
+ //PANIC("test");
+}
+
+void FloppyController::setActiveDrive(u8int drive) {
+ m_driveMutex.waitLock();
+ m_activeDrive = drive;
+ setDOR();
+}
+
+void FloppyController::setNoActiveDrive() {
+ m_driveMutex.unlock();
+}
+
+bool FloppyController::writeCmd(u8int cmd) {
+ for (int i = 0; i < 600; i++) {
+ if (0x80 & inb(m_base + FR_MSR)) {
+ outb(m_base + FR_FIFO, cmd);
+ return true;
+ }
+ Task::currentThread->sleep(10);
+ }
+ return false;
+}
+
+u8int FloppyController::readData() {
+ for (int i = 0; i < 600; i++) {
+ if (0x80 & inb(m_base + FR_MSR)) {
+ return inb(m_base + FR_FIFO);
+ }
+ Task::currentThread->sleep(10);
+ }
+ return 0;
+}
+
+bool FloppyController::reset() {
+ outb(m_base + FR_DOR, 0x00); //Disable controller
+ m_first = true;
+ setNoActiveDrive();
+
+ if (m_drives[0] != NULL) m_drives[0]->m_motorState = 0;
+ if (m_drives[1] != NULL) m_drives[1]->m_motorState = 0;
+
+ for (int i = 0; i < 2; i++) {
+ if (m_drives[i] != NULL) {
+ if (!m_drives[i]->setup())
+ return false;
+ }
+ }
+ return true;
+}
diff --git a/Source/Kernel/Devices/Floppy/FloppyController.class.h b/Source/Kernel/Devices/Floppy/FloppyController.class.h
new file mode 100644
index 0000000..2d0104b
--- /dev/null
+++ b/Source/Kernel/Devices/Floppy/FloppyController.class.h
@@ -0,0 +1,81 @@
+#ifndef DEF_FLOPPYCONTROLLER_CLASS_H
+#define DEF_FLOPPYCONTROLLER_CLASS_H
+
+#include <Devices/Device.proto.h>
+#include <TaskManager/Mutex.class.h>
+
+#define FLOPPY_DMALEN 0x4800 //This is one cylinder
+
+//Floppy registers
+#define FR_DOR 2 //Digital Output Register
+#define FR_MSR 4 //Main Status Register
+#define FR_FIFO 5
+#define FR_CCR 7 //Configuration Control Register
+
+//Floppy commands
+#define FC_SPECIFY 3
+#define FC_SENSE_DRIVE_STATUS 4
+#define FC_WRITE_DATA 5
+#define FC_READ_DATA 6
+#define FC_RECALIBRATE 7
+#define FC_SENSE_INTERRUPT 8
+#define FC_SEEK 15
+
+//Floppy drives types
+#define FT_NONE 0
+#define FT_360K525 1 //360kB 5.25in
+#define FT_12M525 2 //1.2MB 5.25in
+#define FT_720K35 3 //720kB 3.5in
+#define FT_144M35 4 //1.44MB 3.5in
+#define FT_288M35 5 //2.88MB 3.5in
+
+//Floppy drive motor states
+#define FS_MOTOROFF 0
+#define FS_MOTORON 1
+#define FS_MOTORWAIT 2
+
+//Floppy transfer directions
+#define FD_READ 1
+#define FD_WRITE 2
+
+class FloppyDrive;
+
+class FloppyController : public Device {
+ friend class FloppyDrive;
+ private:
+ //For DMA
+ static Mutex dmaMutex;
+ static u8int dmabuff[FLOPPY_DMALEN];
+ static bool dmaInit(u8int direction, u32int length); //Locks the DMA Mutex. Called on each r/w operation.
+ static void dmaRelease(); //Unlocks the DMA Mutex
+
+ //For the FDC
+ FloppyController(u32int base, u8int irq); //Private constructor, called by Detect();
+
+ u8int m_activeDrive;
+ Mutex m_driveMutex;
+
+ u32int m_base; //I/O port base
+ u8int m_irq;
+
+ bool m_first;
+
+ FloppyDrive* m_drives[2];
+
+ void checkInterrupt(int *st0, int *cyl);
+ void setDOR(); //Updates the Digital Output Register
+ void setActiveDrive(u8int drive); //Locks driveMutex and sets activeDrive.
+ void setNoActiveDrive(); //Unlocks driveMutex
+ bool writeCmd(u8int cmd); //Sends command to controller
+ u8int readData(); //Reads a byte from controller
+ bool reset();
+
+ public:
+ static void detect();
+ String getClass();
+ String getName();
+
+};
+
+#endif
+
diff --git a/Source/Kernel/Devices/Floppy/FloppyDrive.class.cpp b/Source/Kernel/Devices/Floppy/FloppyDrive.class.cpp
new file mode 100644
index 0000000..0d1b5fc
--- /dev/null
+++ b/Source/Kernel/Devices/Floppy/FloppyDrive.class.cpp
@@ -0,0 +1,330 @@
+#include "FloppyDrive.class.h"
+#include "FloppyController.class.h"
+#include <TaskManager/Task.ns.h>
+#include <DeviceManager/Time.ns.h>
+
+using namespace Sys;
+
+FloppyDrive::FloppyDrive(FloppyController *fdc, u8int number, u8int type) {
+ m_fdc = fdc;
+ m_driveNumber = number;
+ m_driveType = type;
+ fdc->m_drives[number] = this;
+
+ switch (m_driveType) {
+ case FT_360K525:
+ m_cylinders = 40;
+ m_sectors = 9;
+ break;
+ case FT_12M525:
+ m_cylinders = 80;
+ m_sectors = 15;
+ break;
+ case FT_720K35:
+ m_cylinders = 80;
+ m_sectors = 9;
+ break;
+ case FT_288M35:
+ m_cylinders = 80;
+ m_sectors = 36;
+ break;
+ case FT_144M35:
+ default: //all unknown types are 1.44M
+ m_cylinders = 80;
+ m_sectors = 18;
+ break;
+ }
+ m_buffCyl = 0xFFFF; //Invalid cylinder
+ m_buffTime = 0;
+}
+
+String FloppyDrive::getClass() {
+ return "block.floppy";
+}
+
+String FloppyDrive::getName() {
+ char *fdTypes[] = {
+ "NONE",
+ "360kB 5.25in",
+ "1.2MB 5.25in",
+ "720kB 3.5in",
+ "1.44MB 3.5in",
+ "2.88MB 3.5in" };
+ String ret;
+ if (m_driveNumber == 0) {
+ ret = "Floppy drive #0 : ";
+ } else {
+ ret = "Floppy drive #1 : ";
+ }
+ ret += fdTypes[m_driveType];
+ return ret;
+}
+
+bool FloppyDrive::setup() {
+ m_fdc->setActiveDrive(m_driveNumber);
+
+ //Set transfer rate
+ u8int xfer_rate;
+ if (m_driveType == FT_360K525) {
+ xfer_rate = 2;
+ } else if (m_driveType == FT_720K35) {
+ xfer_rate = 1;
+ } else {
+ xfer_rate = 0;
+ }
+ outb(m_fdc->m_base + FR_CCR, xfer_rate);
+
+ m_fdc->writeCmd(FC_SPECIFY);
+ m_fdc->writeCmd(0xDF);
+ m_fdc->writeCmd(0x02);
+
+ bool ret = calibrate();
+
+ m_fdc->setNoActiveDrive();
+
+ return ret;
+}
+
+bool FloppyDrive::calibrate() {
+ if (!m_fdc->m_driveMutex.locked() or m_fdc->m_activeDrive != m_driveNumber) return false;
+
+ int st0, cyl = -1;
+
+ if (!setMotorState(true)) return false;
+
+ for (int i = 0; i < 10; i++) {
+ asm volatile("cli");
+ m_fdc->writeCmd(FC_RECALIBRATE);
+ m_fdc->writeCmd(m_driveNumber);
+
+ Task::currentThread->waitIRQ(m_fdc->m_irq);
+ m_fdc->checkInterrupt(&st0, &cyl);
+ asm volatile("sti");
+
+ if (st0 & 0xC0) {
+ continue;
+ }
+ if (!cyl) { //Cylinder 0 reached
+ setMotorState(false);
+ return true;
+ }
+ }
+ setMotorState(false);
+ return false;
+}
+
+bool FloppyDrive::setMotorState(bool on) {
+ if (!m_fdc->m_driveMutex.locked() or m_fdc->m_activeDrive != m_driveNumber) return false;
+
+ if (on) {
+ if (m_motorState == FS_MOTOROFF) {
+ m_motorState = FS_MOTORON;
+ m_fdc->setDOR();
+ Task::currentThread->sleep(500);
+ }
+ m_motorState = FS_MOTORON;
+ } else {
+ m_motorState = FS_MOTORWAIT;
+ m_motorTimeout = 4;
+ }
+ return true;
+}
+
+bool FloppyDrive::killMotor() {
+ m_motorState = FS_MOTOROFF;
+ m_fdc->setDOR();
+ return true;
+}
+
+bool FloppyDrive::seek(u32int cyli, s32int head) {
+ if (cyli >= m_cylinders) return false;
+ m_fdc->setActiveDrive(m_driveNumber);
+
+ setMotorState(true); //Turn on motor
+
+ int st0, cyl = -1;
+
+ for (u32int i = 0; i < 10; i++) {
+ asm volatile ("cli");
+ m_fdc->writeCmd(FC_SEEK);
+ m_fdc->writeCmd(head << 2);
+ m_fdc->writeCmd(cyl);
+
+ Task::currentThread->waitIRQ(m_fdc->m_irq);
+ m_fdc->checkInterrupt(&st0, &cyl);
+ asm volatile("sti");
+
+ if (st0 & 0xC0) { //Error
+ continue;
+ }
+ if (cyl == 0xFF or cyl == 0x00) { //0xFF for bochs, 0x00 for qemu :D
+ setMotorState(false);
+ m_fdc->setNoActiveDrive();
+ return true;
+ }
+ if (cyl == (int)cyli) {
+ setMotorState(false);
+ m_fdc->setNoActiveDrive();
+ return true;
+ }
+ }
+ setMotorState(false);
+ m_fdc->setNoActiveDrive();
+ return false;
+}
+
+bool FloppyDrive::doTrack(u32int cyl, u8int dir) {
+ if (!seek(cyl, 0)) return false;
+ if (!seek(cyl, 1)) return false;
+ m_fdc->setActiveDrive(m_driveNumber);
+
+ u8int cmd, flags = 0xC0;
+ switch (dir) {
+ case FD_READ:
+ cmd = FC_READ_DATA | flags;
+ break;
+ case FD_WRITE:
+ cmd = FC_WRITE_DATA | flags;
+ break;
+ default:
+ m_fdc->setNoActiveDrive();
+ return false;
+ }
+
+ for (int i = 0; i < 20; i++) {
+ setMotorState(true);
+
+ if (!FloppyController::dmaInit(dir, 0x4800)) {
+ m_fdc->setNoActiveDrive();
+ setMotorState(false);
+ return false;
+ }
+
+ Task::currentThread->sleep(100);
+
+ asm volatile("cli");
+ m_fdc->writeCmd(cmd);
+ m_fdc->writeCmd(m_driveNumber); //Drive number & first head << 2
+ m_fdc->writeCmd(cyl); //Cylinder
+ m_fdc->writeCmd(0); //First head
+ m_fdc->writeCmd(1); //First sector
+ m_fdc->writeCmd(2);
+ m_fdc->writeCmd(18); //Number of sectors
+ m_fdc->writeCmd(0x1B);
+ m_fdc->writeCmd(0xFF);
+
+ Task::currentThread->waitIRQ(m_fdc->m_irq);
+
+ u8int st0, st1, st2, rcy, rhe, rse, bps;
+ st0 = m_fdc->readData();
+ st1 = m_fdc->readData();
+ st2 = m_fdc->readData();
+ rcy = m_fdc->readData();
+ rhe = m_fdc->readData();
+ rse = m_fdc->readData();
+ bps = m_fdc->readData();
+ asm volatile("sti");
+
+ int error = 0;
+
+ if (st0 & 0xC0) error = 1;
+ if (st1 & 0x80) error = 1; //End of cylinder
+ if (st0 & 0x08) error = 1; //Drive not ready
+ if (st1 & 0x20) error = 1; //CRC error
+ if (st1 & 0x10) error = 1; //Controller timeout
+ if (st1 & 0x04) error = 1; //No data found
+ if ((st2|st1) & 0x01) error=1; //No address mark found
+ if (st2 & 0x40) error = 1; //Deleted address mark
+ if (st2 & 0x20) error = 1; //CRC error in data
+ if (st2 & 0x10) error = 1; //Wrong cylinder
+ if (st2 & 0x04) error = 1; //uPD765 sector not found
+ if (st2 & 0x02) error = 1; //Bad cylinder
+ if (bps != 0x2) error = 1; //Wanted 512 bytes/sector, got (1<<(bps+7))
+ if (st1 & 0x02) error = 2; //Not writable
+
+ if (!error) CMem::memcpy(m_buffer, FloppyController::dmabuff, FLOPPY_DMALEN); //Copy data to internal buffer
+ FloppyController::dmaRelease();
+
+ if (!error) {
+ setMotorState(false);
+ m_fdc->setNoActiveDrive();
+ return true;
+ }
+ if (error > 1) {
+ //Not retrying
+ setMotorState(false);
+ m_fdc->setNoActiveDrive();
+ return false;
+ }
+ }
+ setMotorState(false);
+ return false;
+}
+
+bool FloppyDrive::readOnly() {
+ m_fdc->setActiveDrive(m_driveNumber);
+ asm volatile("cli");
+ m_fdc->writeCmd(FC_SENSE_DRIVE_STATUS);
+ m_fdc->writeCmd(m_driveNumber);
+ Task::currentThread->waitIRQ(m_fdc->m_irq);
+ u8int st3 = m_fdc->readData();
+ asm volatile("sti");
+
+ bool ret = (st3 & 0x80 ? true : false);
+
+ m_fdc->setNoActiveDrive();
+
+ return ret;
+}
+
+u64int FloppyDrive::blocks() {
+ return m_cylinders * m_sectors * 2;
+}
+
+bool FloppyDrive::readBlocks(u64int start, u32int count, u8int *data) {
+ u32int startblock = start;
+ if (count == 1) {
+ u32int cylinder = (startblock / (m_sectors * 2)), offset = (startblock % (m_sectors * 2)) * 512;
+ if (m_buffCyl == cylinder && m_buffTime >= Time::uptime() - 4) {
+ memcpy(data, (const u8int*)(&m_buffer[offset]), 512);
+ return true;
+ } else {
+ if (!doTrack(cylinder, FD_READ)) return false;
+ m_buffCyl = cylinder;
+ m_buffTime = Time::uptime();
+ memcpy(data, (const u8int*)(&m_buffer[offset]), 512);
+ return true;
+ }
+ } else {
+ m_buffCyl = 0xFFFF; //Invalid cylinder
+ m_buffTime = 0;
+
+ u32int startcylinder = (startblock / (m_sectors * 2)), stoffset = startblock % (m_sectors * 2);
+ u32int endcylinder = ((startblock + count - 1) / (m_sectors * 2)),
+ endoffset = (startblock + count - 1) % (m_sectors * 2);
+ for (u32int i = startcylinder; i <= endcylinder; i++) {
+ if (!doTrack(i, FD_READ)) return false; //Read cylinder
+ //Figure out what to memcpy in data
+ u32int start = 0; //Where to start memcpying in buffer
+ if (i == startcylinder) start = stoffset * 512;
+ u32int count = FLOPPY_DMALEN - start; //How much we must memcpy
+ if (i == endcylinder) count = (endoffset * 512) - start + 512;
+ u32int where = 0;
+ if (i != startcylinder) where = (i - startcylinder - 1) * (512 * 2 * m_sectors) + (stoffset * 512);
+ memcpy(&data[where], (const u8int*)(&m_buffer[start]), count);
+ }
+ }
+ return true;
+}
+
+bool FloppyDrive::writeBlocks(u64int start, u32int count, u8int *data) { //TODO
+ return false;
+}
+
+u32int FloppyDrive::blockSize() {
+ return 512;
+}
+
+u64int FloppyDrive::chs2lba(u32int cylinder, u32int head, u32int sector) {
+ return ((u64int)cylinder * (u64int)m_cylinders) + ((u64int)head + 2ULL) + (u64int)sector - 1ULL;
+}
diff --git a/Source/Kernel/Devices/Floppy/FloppyDrive.class.h b/Source/Kernel/Devices/Floppy/FloppyDrive.class.h
new file mode 100644
index 0000000..3ff832b
--- /dev/null
+++ b/Source/Kernel/Devices/Floppy/FloppyDrive.class.h
@@ -0,0 +1,41 @@
+#ifndef DEF_FLOPPYDRIVE_CLASS_H
+#define DEF_FLOPPYDRIVE_CLASS_H
+
+#include <Devices/BlockDevice.proto.h>
+
+#include "FloppyController.class.h"
+
+class FloppyDrive : public BlockDevice {
+ friend class FloppyController;
+ friend u32int floppyMotorTimer();
+ private:
+ FloppyDrive(FloppyController *fdc, u8int number, u8int type); //Private constructor, called by FloppyController()
+
+ u8int m_motorState, m_motorTimeout, m_driveNumber, m_driveType;
+ u32int m_cylinders, m_sectors;
+ FloppyController *m_fdc;
+
+ u8int m_buffer[FLOPPY_DMALEN];
+ u32int m_buffCyl, m_buffTime; //Used for keeping track of what is in buffer, this is a sort of cache system
+
+ bool setup();
+ bool calibrate();
+ bool setMotorState(bool on);
+ bool killMotor();
+ bool seek(u32int cyli, s32int head);
+ bool doTrack(u32int cyl, u8int dir);
+
+ public:
+ String getClass();
+ String getName();
+
+ bool readOnly();
+ u64int blocks();
+ bool readBlocks(u64int startblock, u32int count, u8int *data);
+ bool writeBlocks(u64int startblock, u32int count, u8int* data);
+ u32int blockSize(); //Always 512
+
+ u64int chs2lba(u32int cylinder, u32int head, u32int sector);
+};
+
+#endif
diff --git a/Source/Kernel/Makefile b/Source/Kernel/Makefile
index 21fd6c9..c0bb18b 100644
--- a/Source/Kernel/Makefile
+++ b/Source/Kernel/Makefile
@@ -5,7 +5,7 @@ CXX = g++
LD = ld
LDFLAGS = -T Link.ld -Map Map.txt --oformat=elf32-i386
CFLAGS = -nostdlib -nostartfiles -nodefaultlibs -fno-builtin -fno-stack-protector -Wall -Wextra -Werror
-CXXFLAGS = -nostartfiles -nostdlib -fno-rtti -fno-exceptions -I . -Wall -Werror -Wno-write-strings -funsigned-char
+CXXFLAGS = -nostartfiles -nostdlib -fno-exceptions -fno-rtti -I . -Wall -Werror -Wno-write-strings -funsigned-char
ASM = nasm
ASMFLAGS = -f elf
@@ -36,10 +36,14 @@ Objects = Core/loader.wtf.o \
Library/Bitset.class.o \
Library/String.class.o \
Library/wchar.class.o \
+ VFS/Partition.class.o \
+ VFS/Part.ns.o \
SyscallManager/IDT.ns.o \
SyscallManager/IDT.wtf.o \
Devices/Display/VGATextOutput.class.o \
Devices/Keyboard/PS2Keyboard.class.o \
+ Devices/Floppy/FloppyController.class.o \
+ Devices/Floppy/FloppyDrive.class.o \
Devices/Timer.class.o
all: $(OutFile)
diff --git a/Source/Kernel/Map.txt b/Source/Kernel/Map.txt
index 38b5aa2..4c5953b 100644
--- a/Source/Kernel/Map.txt
+++ b/Source/Kernel/Map.txt
@@ -15,6 +15,10 @@ Discarded input sections
.group 0x00000000 0x0 Core/kmain.wtf.o
.group 0x00000000 0x0 Core/kmain.wtf.o
.group 0x00000000 0x0 Core/kmain.wtf.o
+ .group 0x00000000 0x0 Core/kmain.wtf.o
+ .group 0x00000000 0x0 Core/kmain.wtf.o
+ .group 0x00000000 0x0 Core/kmain.wtf.o
+ .group 0x00000000 0x0 Core/kmain.wtf.o
.group 0x00000000 0x0 Core/Sys.ns.o
.group 0x00000000 0x0 Core/Sys.ns.o
.group 0x00000000 0x0 Core/Sys.ns.o
@@ -164,6 +168,37 @@ Discarded input sections
.group 0x00000000 0x0 Library/wchar.class.o
.text._ZN5wchareqEj
0x00000000 0x0 Library/wchar.class.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .group 0x00000000 0x0 VFS/Part.ns.o
+ .text._ZnwjPv 0x00000000 0x0 VFS/Part.ns.o
+ .text._Znwj 0x00000000 0x0 VFS/Part.ns.o
+ .text._ZdlPv 0x00000000 0x0 VFS/Part.ns.o
+ .text._ZdaPv 0x00000000 0x0 VFS/Part.ns.o
+ .text._ZN6VectorIP11BlockDeviceE4sizeEv
+ 0x00000000 0x0 VFS/Part.ns.o
+ .text._ZN6VectorIP11BlockDeviceEixEj
+ 0x00000000 0x0 VFS/Part.ns.o
+ .text._ZN6VectorIP9PartitionE4sizeEv
+ 0x00000000 0x0 VFS/Part.ns.o
+ .text._ZN6VectorIP9PartitionEixEj
+ 0x00000000 0x0 VFS/Part.ns.o
.group 0x00000000 0x0 SyscallManager/IDT.ns.o
.group 0x00000000 0x0 SyscallManager/IDT.ns.o
.group 0x00000000 0x0 SyscallManager/IDT.ns.o
@@ -191,6 +226,42 @@ Discarded input sections
0x00000000 0x0 Devices/Keyboard/PS2Keyboard.class.o
.rodata._ZTV6Device
0x00000000 0x0 Devices/Keyboard/PS2Keyboard.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .text._Znwj 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .text._ZdaPv 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .text._ZN6Device9handleIRQE11registers_ti
+ 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .text._ZN6DeviceC2Ev
+ 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .text._ZN6VectorIP6DeviceED1Ev
+ 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .text._ZN6VectorIP6DeviceE4sizeEv
+ 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .text._ZN6VectorIP6DeviceEixEj
+ 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .rodata._ZTV6Device
+ 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyDrive.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyDrive.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyDrive.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyDrive.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyDrive.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyDrive.class.o
+ .group 0x00000000 0x0 Devices/Floppy/FloppyDrive.class.o
+ .text._ZN6Device9handleIRQE11registers_ti
+ 0x00000000 0x0 Devices/Floppy/FloppyDrive.class.o
+ .text._ZN6DeviceC2Ev
+ 0x00000000 0x0 Devices/Floppy/FloppyDrive.class.o
+ .rodata._ZTV6Device
+ 0x00000000 0x0 Devices/Floppy/FloppyDrive.class.o
.group 0x00000000 0x0 Devices/Timer.class.o
.group 0x00000000 0x0 Devices/Timer.class.o
.group 0x00000000 0x0 Devices/Timer.class.o
@@ -216,763 +287,936 @@ Linker script and memory map
.setup 0x00100000 0x1e Core/loader.wtf.o
0xc010001e . = (. + 0xc0000000)
-.text 0xc0100020 0xcbe1 load address 0x00100020
+.text 0xc0100020 0xf371 load address 0x00100020
*(.text)
.text 0xc0100020 0x75 Core/loader.wtf.o
0xc010002c loader
*fill* 0xc0100095 0x3 00
- .text 0xc0100098 0x4726 Core/kmain.wtf.o
+ .text 0xc0100098 0x4dc5 Core/kmain.wtf.o
0xc0100098 kmain
- *fill* 0xc01047be 0x2 00
- .text 0xc01047c0 0xf Core/cppsupport.wtf.o
- 0xc01047c0 __cxa_pure_virtual
- 0xc01047c5 __cxa_atexit
- *fill* 0xc01047cf 0x1 00
- .text 0xc01047d0 0x668 Core/Sys.ns.o
- 0xc010482a Sys::bochs_output(char*, char*, unsigned int)
- 0xc01047ee Sys::inb(unsigned short)
- 0xc010480b Sys::inw(unsigned short)
- 0xc0104ab6 Sys::panic(char*, char*, unsigned int)
- 0xc0104e1c Sys::reboot()
- 0xc01047d0 Sys::outb(unsigned short, unsigned char)
- 0xc0104a2c Sys::bochs_output_hex(unsigned int)
- 0xc0104c69 Sys::panic_assert(char*, unsigned int, char*)
- 0xc0104924 Sys::bochs_output(String, char*, unsigned int)
- .text 0xc0104e38 0xd5 Core/CMem.ns.o
- 0xc0104e6e CMem::memset(unsigned char*, unsigned char, int)
- 0xc0104ea5 CMem::memsetw(unsigned short*, unsigned short, int)
- 0xc0104ee0 CMem::strlen(char const*)
- 0xc0104e38 CMem::memcpy(unsigned char*, unsigned char const*, int)
- *fill* 0xc0104f0d 0x3 00
- .text 0xc0104f10 0x8e4 MemoryManager/Mem.ns.o
- 0xc01053d0 Mem::contractHeap()
- 0xc01057de Mem::kheapSize()
- 0xc0104fca Mem::insertIntoHeapIndex(Mem::heap_header_t*)
- 0xc010516e Mem::removeFromHeapIndex(Mem::heap_header_t*)
- 0xc0105125 Mem::removeFromHeapIndex(unsigned int)
- 0xc0105195 Mem::createHeap()
- 0xc01052a3 Mem::expandHeap(unsigned int)
- 0xc010567c Mem::kfree(void*)
- 0xc01054ed Mem::kalloc(unsigned int, bool)
- 0xc01050e3 Mem::heapIndexFindEntry(Mem::heap_header_t*)
- 0xc0104f10 Mem::kallocInternal(unsigned int, bool)
- .text 0xc01057f4 0x35c MemoryManager/PhysMem.ns.o
- 0xc0105b46 PhysMem::total()
- 0xc0105996 PhysMem::removeTemporaryPages()
- 0xc0105ad1 PhysMem::freeFrame(page_t*)
- 0xc0105b20 PhysMem::free()
- 0xc01059ea PhysMem::allocFrame(page_t*, bool, bool)
- 0xc01057f4 PhysMem::initPaging(unsigned int)
- .text 0xc0105b50 0x1d MemoryManager/GDT.wtf.o
- 0xc0105b50 gdt_flush
- *fill* 0xc0105b6d 0x3 00
- .text 0xc0105b70 0x193 MemoryManager/GDT.ns.o
- 0xc0105bff GDT::init()
- 0xc0105b70 GDT::setGate(int, unsigned int, unsigned int, unsigned char, unsigned char)
- *fill* 0xc0105d03 0x1 00
- .text 0xc0105d04 0x8f1 MemoryManager/PageDirectory.class.o
- 0xc0106444 PageDirectory::getPage(unsigned int, bool)
- 0xc0105dc8 PageDirectory::PageDirectory(PageDirectory*)
- 0xc0105d04 PageDirectory::PageDirectory()
- 0xc01063be PageDirectory::~PageDirectory()
- 0xc0106338 PageDirectory::~PageDirectory()
- 0xc0106594 PageDirectory::freeFrame(unsigned int)
- 0xc0106080 PageDirectory::PageDirectory(PageDirectory*)
- 0xc0105d66 PageDirectory::PageDirectory()
- 0xc0106542 PageDirectory::allocFrame(unsigned int, bool, bool)
- 0xc01065ce PageDirectory::switchTo()
- *fill* 0xc01065f5 0x3 00
- .text 0xc01065f8 0x239 MemoryManager/PageAlloc.ns.o
- 0xc0106815 PageAlloc::free(void*)
- 0xc010664c PageAlloc::alloc(unsigned int*)
- 0xc01065f8 PageAlloc::init()
- *fill* 0xc0106831 0x3 00
- .text 0xc0106834 0x161 DeviceManager/Disp.ns.o
- 0xc010683e Disp::textRows()
- 0xc0106921 Disp::clear()
- 0xc0106834 Disp::textCols()
- 0xc010693f Disp::setDisplay(Display*)
- 0xc01068c0 Disp::moveCursor(unsigned short, unsigned short)
- 0xc0106848 Disp::putChar(unsigned short, unsigned short, wchar, unsigned char)
- *fill* 0xc0106995 0x3 00
- .text 0xc0106998 0x37d DeviceManager/Dev.ns.o
- 0xc0106a49 Dev::registerDevice(Device*)
- 0xc0106a6f Dev::unregisterDevice(Device*)
- 0xc0106af1 Dev::requestIRQ(Device*, int)
- 0xc0106b1d Dev::findDevices(String)
- 0xc0106998 Dev::handleIRQ(registers_t, int)
- *fill* 0xc0106d15 0x3 00
- .text 0xc0106d18 0x37 DeviceManager/Time.ns.o
- 0xc0106d18 Time::setTimer(Timer*)
- 0xc0106d3a Time::time()
- 0xc0106d25 Time::uptime()
- *fill* 0xc0106d4f 0x1 00
- .text 0xc0106d50 0x70f DeviceManager/Kbd.ns.o
- 0xc0106e84 Kbd::keyPress(unsigned char)
- 0xc0106dee Kbd::updateLeds()
- 0xc0106dc9 Kbd::setKeymap(wchar*, wchar*, wchar*, wchar*)
- 0xc01071cc Kbd::keyRelease(unsigned char)
- 0xc0106dbc Kbd::setFocus(VirtualTerminal*)
- 0xc0106d50 Kbd::process(Kbd::keypress_t)
- *fill* 0xc010745f 0x1 00
- .text 0xc0107460 0x518 TaskManager/Process.class.o
- 0xc01077fe Process::exit()
- 0xc0107460 Process::Process()
- 0xc0107586 Process::Process(String, unsigned int)
- 0xc010796a Process::setVirtualTerminal(VirtualTerminal*)
- 0xc0107776 Process::stackAlloc()
- 0xc010795e Process::getVirtualTerminal()
- 0xc0107884 Process::threadFinishes(Thread*, unsigned int)
- 0xc0107728 Process::~Process()
- 0xc0107484 Process::Process()
- 0xc01074a8 Process::createKernel(String, VirtualTerminal*)
- 0xc01076da Process::~Process()
- 0xc0107630 Process::Process(String, unsigned int)
- 0xc010785c Process::registerThread(Thread*)
- 0xc0107952 Process::getPagedir()
- .text 0xc0107978 0x3eb TaskManager/Thread.class.o
- 0xc0107acc Thread::Thread(Process*, unsigned int (*)())
- 0xc010799a Thread::Thread()
- 0xc0107ba4 Thread::setup(unsigned int (*)(), unsigned int)
- 0xc0107b4c Thread::~Thread()
- 0xc01079a0 Thread::Thread(unsigned int (*)(), bool)
- 0xc0107cb4 Thread::sleep(unsigned int)
- 0xc0107994 Thread::Thread()
- 0xc0107cd8 Thread::waitIRQ(unsigned char)
- 0xc0107a36 Thread::Thread(unsigned int (*)(), bool)
- 0xc0107c66 Thread::setState(unsigned int, unsigned int, unsigned int)
- 0xc0107c86 Thread::getEsp()
- 0xc0107c92 Thread::getEbp()
- 0xc0107caa Thread::getProcess()
- 0xc0107c9e Thread::getEip()
- 0xc0107c20 Thread::finish(unsigned int)
- 0xc0107d0c Thread::runnable()
- 0xc0107b78 Thread::~Thread()
- 0xc0107c44 Thread::run(unsigned int (*)())
- 0xc0107b0c Thread::Thread(Process*, unsigned int (*)())
- 0xc0107978 runThread(Thread*, unsigned int (*)())
- *fill* 0xc0107d63 0x1 00
- .text 0xc0107d64 0x56e TaskManager/Task.ns.o
- 0xc0107fd5 Task::IRQwakeup(unsigned char)
- 0xc0107fb8 Task::triggerSwitch()
- 0xc01080df Task::getKernelProcess()
- 0xc01081a5 Task::registerProcess(Process*)
- 0xc0107fbf Task::nextPid()
- 0xc01081cb Task::unregisterProcess(Process*)
- 0xc0108123 Task::unregisterThread(Thread*)
- 0xc01080fd Task::registerThread(Thread*)
- 0xc0107d64 Task::initialize(String, VirtualTerminal*)
- 0xc0107e13 Task::nextThread()
- 0xc0108051 Task::allocKernelPageTable(unsigned int, page_table_t*, unsigned int)
- 0xc0107ec8 Task::doSwitch()
- *fill* 0xc01082d2 0xe 00
- .text 0xc01082e0 0x48 TaskManager/Task.wtf.o
- 0xc01082e0 read_eip
- 0xc01082e3 idle_task
- 0xc01082ea copy_page_physical
- .text 0xc0108328 0x99 TaskManager/Mutex.class.o
- 0xc0108340 Mutex::Mutex(bool)
- 0xc01083aa Mutex::unlock()
- 0xc0108358 Mutex::lock()
- 0xc010837a Mutex::waitLock()
- 0xc01083b6 Mutex::locked()
- 0xc0108328 Mutex::Mutex(bool)
- *fill* 0xc01083c1 0x3 00
- .text 0xc01083c4 0xabe VTManager/VirtualTerminal.class.o
- 0xc010878c VirtualTerminal::map(int, int)
- 0xc0108aaa VirtualTerminal::put(wchar, bool)
- 0xc0108806 VirtualTerminal::unmap()
- 0xc0108a72 VirtualTerminal::setCursorLine(unsigned int)
- 0xc01085f8 VirtualTerminal::setColor(unsigned char, unsigned char)
- 0xc0108574 VirtualTerminal::~VirtualTerminal()
- 0xc0108a8e VirtualTerminal::setCursorCol(unsigned int)
- 0xc010849c VirtualTerminal::VirtualTerminal(unsigned int, unsigned int, unsigned char, unsigned char)
- 0xc0108a10 VirtualTerminal::updateCursor()
- 0xc0108c80 VirtualTerminal::writeDec(int, bool)
- 0xc01085b6 VirtualTerminal::~VirtualTerminal()
- 0xc0108820 VirtualTerminal::redraw()
- 0xc0108db8 VirtualTerminal::writeHex(unsigned int, bool)
- 0xc01088f8 VirtualTerminal::scroll()
- 0xc01083c4 VirtualTerminal::VirtualTerminal(unsigned int, unsigned int, unsigned char, unsigned char)
- 0xc0108c14 VirtualTerminal::write(String, bool)
- 0xc0108646 VirtualTerminal::putChar(unsigned int, unsigned int, wchar)
- 0xc0108710 VirtualTerminal::clear()
- 0xc0108a4c VirtualTerminal::moveCursor(unsigned int, unsigned int)
- *fill* 0xc0108e82 0x2 00
- .text 0xc0108e84 0x50b VTManager/VirtualTerminal-kbd.class.o
- 0xc0108fae VirtualTerminal::getKeypress(bool, bool)
- 0xc01091ea VirtualTerminal::readLine(bool)
- 0xc0108e84 VirtualTerminal::keyPress(Kbd::keypress_t)
- *fill* 0xc010938f 0x1 00
- .text 0xc0109390 0x156 VTManager/VT.ns.o
- 0xc01093b6 VT::unmap(VirtualTerminal*)
- 0xc010943d VT::redrawScreen()
- 0xc0109390 VT::map(VirtualTerminal*)
- *fill* 0xc01094e6 0x2 00
- .text 0xc01094e8 0x2f1 Library/Bitset.class.o
- 0xc01097ce Bitset::usedBits()
- 0xc01094e8 Bitset::Bitset()
- 0xc01096f0 Bitset::testBit(unsigned int)
- 0xc01095b6 Bitset::~Bitset()
- 0xc0109688 Bitset::clearBit(unsigned int)
- 0xc01095cc Bitset::init(unsigned int, unsigned int*)
- 0xc01094f4 Bitset::Bitset(unsigned int)
- 0xc01094ee Bitset::Bitset()
- 0xc0109528 Bitset::Bitset(unsigned int)
- 0xc0109622 Bitset::setBit(unsigned int)
- 0xc01095a0 Bitset::~Bitset()
- 0xc010957e Bitset::Bitset(unsigned int, unsigned int*)
- 0xc010955c Bitset::Bitset(unsigned int, unsigned int*)
- 0xc0109738 Bitset::firstFreeBit()
- *fill* 0xc01097d9 0x3 00
- .text 0xc01097dc 0x123c Library/String.class.o
- 0xc01097dc String::hex(unsigned int)
- 0xc010a16e String::operator==(char*)
- 0xc010a4b4 String::operator+=(wchar)
- 0xc010a662 String::toInt()
- 0xc0109dbc String::String(String const&)
- 0xc0109aca String::String()
- 0xc0109ae2 String::String()
- 0xc010a7f8 String::size()
- 0xc01098ea String::number(int)
- 0xc010a0ec String::operator==(String&)
- 0xc010a5e2 String::operator+(char*)
- 0xc0109eba String::~String()
- 0xc0109ce6 String::String(String const&)
- 0xc0109e92 String::~String()
- 0xc0109ee2 String::operator=(String const&)
- 0xc0109afa String::String(char*)
- 0xc010a22e String::operator+=(String&)
- 0xc010a7e6 String::operator[](int)
- 0xc010a846 String::split(wchar)
- 0xc010a804 String::clear()
- 0xc010a836 String::empty()
- 0xc010a72a String::toInt16()
- 0xc010a93a String::substr(int, int)
- 0xc0109bf0 String::String(char*)
- 0xc010a35c String::operator+=(char*)
- 0xc010a622 String::operator+(wchar)
- 0xc0109fd8 String::operator=(char*)
- 0xc010a5a2 String::operator+(String&)
- .text 0xc010aa18 0xd47 Library/wchar.class.o
- 0xc010aa26 wchar::wchar()
- 0xc010aa92 wchar::wchar(char*)
- 0xc010aa18 wchar::wchar()
- 0xc010aa78 wchar::wchar(char*)
- 0xc010ab5c wchar::affectAscii(char)
- 0xc010aaac wchar::utf8len(char*)
- 0xc010ab74 wchar::affectUtf8(char*)
- 0xc010aa34 wchar::wchar(char)
- 0xc010aa56 wchar::wchar(char)
- 0xc010ad3c wchar::toAscii()
- *fill* 0xc010b75f 0x1 00
- .text 0xc010b760 0xd53 SyscallManager/IDT.ns.o
- 0xc010c18b IDT::handleException(registers_t, int)
- 0xc010b969 IDT::init()
- 0xc010b902 IDT::setGate(unsigned char, unsigned int, unsigned short, unsigned char)
- 0xc010b760 interrupt_handler
- *fill* 0xc010c4b3 0xd 00
- .text 0xc010c4c0 0x20e SyscallManager/IDT.wtf.o
- 0xc010c4f0 isr4
- 0xc010c5ca isr27
- 0xc010c542 isr13
- 0xc010c674 irq12
- 0xc010c598 isr22
- 0xc010c552 isr15
- 0xc010c660 irq10
- 0xc010c688 irq14
- 0xc010c520 isr9
- 0xc010c64c irq8
- 0xc010c5a2 isr23
- 0xc010c5de isr29
- 0xc010c5f2 isr31
- 0xc010c58e isr21
- 0xc010c66a irq11
- 0xc010c5d4 isr28
- 0xc010c518 isr8
- 0xc010c62e irq5
- 0xc010c584 isr20
- 0xc010c54a isr14
- 0xc010c4fa isr5
- 0xc010c638 irq6
- 0xc010c606 irq1
- 0xc010c4d2 isr1
- 0xc010c656 irq9
- 0xc010c5c0 isr26
- 0xc010c532 isr11
- 0xc010c67e irq13
- 0xc010c53a isr12
- 0xc010c4c8 isr0
- 0xc010c610 irq2
- 0xc010c5ac isr24
- 0xc010c55c isr16
- 0xc010c4e6 isr3
- 0xc010c504 isr6
- 0xc010c642 irq7
- 0xc010c570 isr18
- 0xc010c5fc irq0
- 0xc010c52a isr10
- 0xc010c566 isr17
- 0xc010c4dc isr2
- 0xc010c69c int64
- 0xc010c57a isr19
- 0xc010c4c0 idt_flush
- 0xc010c5e8 isr30
- 0xc010c692 irq15
- 0xc010c50e isr7
- 0xc010c5b6 isr25
- 0xc010c624 irq4
- 0xc010c61a irq3
- *fill* 0xc010c6ce 0x2 00
- .text 0xc010c6d0 0x185 Devices/Display/VGATextOutput.class.o
- 0xc010c6f8 VGATextOutput::getName()
- 0xc010c720 VGATextOutput::textCols()
- 0xc010c81e VGATextOutput::clear()
- 0xc010c6d0 VGATextOutput::getClass()
- 0xc010c798 VGATextOutput::moveCursor(unsigned short, unsigned short)
- 0xc010c734 VGATextOutput::putChar(unsigned short, unsigned short, wchar, unsigned char)
- 0xc010c72a VGATextOutput::textRows()
- *fill* 0xc010c855 0x3 00
- .text 0xc010c858 0x190 Devices/Keyboard/PS2Keyboard.class.o
- 0xc010c88e PS2Keyboard::PS2Keyboard()
- 0xc010c914 PS2Keyboard::handleIRQ(registers_t, int)
- 0xc010c8ec PS2Keyboard::getName()
- 0xc010c99e PS2Keyboard::updateLeds(unsigned int)
- 0xc010c858 PS2Keyboard::PS2Keyboard()
- 0xc010c8c4 PS2Keyboard::getClass()
- .text 0xc010c9e8 0x219 Devices/Timer.class.o
- 0xc010cb00 Timer::setFrequency(unsigned char)
- 0xc010c9e8 Timer::Timer(unsigned char)
- 0xc010cab0 Timer::getClass()
- 0xc010cad8 Timer::getName()
- 0xc010cb84 Timer::time()
- 0xc010cbbe Timer::handleIRQ(registers_t, int)
- 0xc010cb78 Timer::uptime()
- 0xc010ca4c Timer::Timer(unsigned char)
-
-.text._Znwj 0xc010cc01 0x1b load address 0x0010cc01
- .text._Znwj 0xc010cc01 0x1b Core/kmain.wtf.o
- 0xc010cc01 operator new(unsigned int)
-
-.text._ZdaPv 0xc010cc1c 0x13 load address 0x0010cc1c
- .text._ZdaPv 0xc010cc1c 0x13 Core/kmain.wtf.o
- 0xc010cc1c operator delete[](void*)
+ *fill* 0xc0104e5d 0x3 00
+ .text 0xc0104e60 0xf Core/cppsupport.wtf.o
+ 0xc0104e60 __cxa_pure_virtual
+ 0xc0104e65 __cxa_atexit
+ *fill* 0xc0104e6f 0x1 00
+ .text 0xc0104e70 0x668 Core/Sys.ns.o
+ 0xc0104eca Sys::bochs_output(char*, char*, unsigned int)
+ 0xc0104e8e Sys::inb(unsigned short)
+ 0xc0104eab Sys::inw(unsigned short)
+ 0xc0105156 Sys::panic(char*, char*, unsigned int)
+ 0xc01054bc Sys::reboot()
+ 0xc0104e70 Sys::outb(unsigned short, unsigned char)
+ 0xc01050cc Sys::bochs_output_hex(unsigned int)
+ 0xc0105309 Sys::panic_assert(char*, unsigned int, char*)
+ 0xc0104fc4 Sys::bochs_output(String, char*, unsigned int)
+ .text 0xc01054d8 0xd5 Core/CMem.ns.o
+ 0xc010550e CMem::memset(unsigned char*, unsigned char, int)
+ 0xc0105545 CMem::memsetw(unsigned short*, unsigned short, int)
+ 0xc0105580 CMem::strlen(char const*)
+ 0xc01054d8 CMem::memcpy(unsigned char*, unsigned char const*, int)
+ *fill* 0xc01055ad 0x3 00
+ .text 0xc01055b0 0x8e4 MemoryManager/Mem.ns.o
+ 0xc0105a70 Mem::contractHeap()
+ 0xc0105e7e Mem::kheapSize()
+ 0xc010566a Mem::insertIntoHeapIndex(Mem::heap_header_t*)
+ 0xc010580e Mem::removeFromHeapIndex(Mem::heap_header_t*)
+ 0xc01057c5 Mem::removeFromHeapIndex(unsigned int)
+ 0xc0105835 Mem::createHeap()
+ 0xc0105943 Mem::expandHeap(unsigned int)
+ 0xc0105d1c Mem::kfree(void*)
+ 0xc0105b8d Mem::kalloc(unsigned int, bool)
+ 0xc0105783 Mem::heapIndexFindEntry(Mem::heap_header_t*)
+ 0xc01055b0 Mem::kallocInternal(unsigned int, bool)
+ .text 0xc0105e94 0x35c MemoryManager/PhysMem.ns.o
+ 0xc01061e6 PhysMem::total()
+ 0xc0106036 PhysMem::removeTemporaryPages()
+ 0xc0106171 PhysMem::freeFrame(page_t*)
+ 0xc01061c0 PhysMem::free()
+ 0xc010608a PhysMem::allocFrame(page_t*, bool, bool)
+ 0xc0105e94 PhysMem::initPaging(unsigned int)
+ .text 0xc01061f0 0x1d MemoryManager/GDT.wtf.o
+ 0xc01061f0 gdt_flush
+ *fill* 0xc010620d 0x3 00
+ .text 0xc0106210 0x193 MemoryManager/GDT.ns.o
+ 0xc010629f GDT::init()
+ 0xc0106210 GDT::setGate(int, unsigned int, unsigned int, unsigned char, unsigned char)
+ *fill* 0xc01063a3 0x1 00
+ .text 0xc01063a4 0x8f1 MemoryManager/PageDirectory.class.o
+ 0xc0106ae4 PageDirectory::getPage(unsigned int, bool)
+ 0xc0106468 PageDirectory::PageDirectory(PageDirectory*)
+ 0xc01063a4 PageDirectory::PageDirectory()
+ 0xc0106a5e PageDirectory::~PageDirectory()
+ 0xc01069d8 PageDirectory::~PageDirectory()
+ 0xc0106c34 PageDirectory::freeFrame(unsigned int)
+ 0xc0106720 PageDirectory::PageDirectory(PageDirectory*)
+ 0xc0106406 PageDirectory::PageDirectory()
+ 0xc0106be2 PageDirectory::allocFrame(unsigned int, bool, bool)
+ 0xc0106c6e PageDirectory::switchTo()
+ *fill* 0xc0106c95 0x3 00
+ .text 0xc0106c98 0x239 MemoryManager/PageAlloc.ns.o
+ 0xc0106eb5 PageAlloc::free(void*)
+ 0xc0106cec PageAlloc::alloc(unsigned int*)
+ 0xc0106c98 PageAlloc::init()
+ *fill* 0xc0106ed1 0x3 00
+ .text 0xc0106ed4 0x161 DeviceManager/Disp.ns.o
+ 0xc0106ede Disp::textRows()
+ 0xc0106fc1 Disp::clear()
+ 0xc0106ed4 Disp::textCols()
+ 0xc0106fdf Disp::setDisplay(Display*)
+ 0xc0106f60 Disp::moveCursor(unsigned short, unsigned short)
+ 0xc0106ee8 Disp::putChar(unsigned short, unsigned short, wchar, unsigned char)
+ *fill* 0xc0107035 0x3 00
+ .text 0xc0107038 0x37d DeviceManager/Dev.ns.o
+ 0xc01070e9 Dev::registerDevice(Device*)
+ 0xc010710f Dev::unregisterDevice(Device*)
+ 0xc0107191 Dev::requestIRQ(Device*, int)
+ 0xc01071bd Dev::findDevices(String)
+ 0xc0107038 Dev::handleIRQ(registers_t, int)
+ *fill* 0xc01073b5 0x3 00
+ .text 0xc01073b8 0x37 DeviceManager/Time.ns.o
+ 0xc01073b8 Time::setTimer(Timer*)
+ 0xc01073da Time::time()
+ 0xc01073c5 Time::uptime()
+ *fill* 0xc01073ef 0x1 00
+ .text 0xc01073f0 0x70f DeviceManager/Kbd.ns.o
+ 0xc0107524 Kbd::keyPress(unsigned char)
+ 0xc010748e Kbd::updateLeds()
+ 0xc0107469 Kbd::setKeymap(wchar*, wchar*, wchar*, wchar*)
+ 0xc010786c Kbd::keyRelease(unsigned char)
+ 0xc010745c Kbd::setFocus(VirtualTerminal*)
+ 0xc01073f0 Kbd::process(Kbd::keypress_t)
+ *fill* 0xc0107aff 0x1 00
+ .text 0xc0107b00 0x518 TaskManager/Process.class.o
+ 0xc0107e9e Process::exit()
+ 0xc0107b00 Process::Process()
+ 0xc0107c26 Process::Process(String, unsigned int)
+ 0xc010800a Process::setVirtualTerminal(VirtualTerminal*)
+ 0xc0107e16 Process::stackAlloc()
+ 0xc0107ffe Process::getVirtualTerminal()
+ 0xc0107f24 Process::threadFinishes(Thread*, unsigned int)
+ 0xc0107dc8 Process::~Process()
+ 0xc0107b24 Process::Process()
+ 0xc0107b48 Process::createKernel(String, VirtualTerminal*)
+ 0xc0107d7a Process::~Process()
+ 0xc0107cd0 Process::Process(String, unsigned int)
+ 0xc0107efc Process::registerThread(Thread*)
+ 0xc0107ff2 Process::getPagedir()
+ .text 0xc0108018 0x3eb TaskManager/Thread.class.o
+ 0xc010816c Thread::Thread(Process*, unsigned int (*)())
+ 0xc010803a Thread::Thread()
+ 0xc0108244 Thread::setup(unsigned int (*)(), unsigned int)
+ 0xc01081ec Thread::~Thread()
+ 0xc0108040 Thread::Thread(unsigned int (*)(), bool)
+ 0xc0108354 Thread::sleep(unsigned int)
+ 0xc0108034 Thread::Thread()
+ 0xc0108378 Thread::waitIRQ(unsigned char)
+ 0xc01080d6 Thread::Thread(unsigned int (*)(), bool)
+ 0xc0108306 Thread::setState(unsigned int, unsigned int, unsigned int)
+ 0xc0108326 Thread::getEsp()
+ 0xc0108332 Thread::getEbp()
+ 0xc010834a Thread::getProcess()
+ 0xc010833e Thread::getEip()
+ 0xc01082c0 Thread::finish(unsigned int)
+ 0xc01083ac Thread::runnable()
+ 0xc0108218 Thread::~Thread()
+ 0xc01082e4 Thread::run(unsigned int (*)())
+ 0xc01081ac Thread::Thread(Process*, unsigned int (*)())
+ 0xc0108018 runThread(Thread*, unsigned int (*)())
+ *fill* 0xc0108403 0x1 00
+ .text 0xc0108404 0x56e TaskManager/Task.ns.o
+ 0xc0108675 Task::IRQwakeup(unsigned char)
+ 0xc0108658 Task::triggerSwitch()
+ 0xc010877f Task::getKernelProcess()
+ 0xc0108845 Task::registerProcess(Process*)
+ 0xc010865f Task::nextPid()
+ 0xc010886b Task::unregisterProcess(Process*)
+ 0xc01087c3 Task::unregisterThread(Thread*)
+ 0xc010879d Task::registerThread(Thread*)
+ 0xc0108404 Task::initialize(String, VirtualTerminal*)
+ 0xc01084b3 Task::nextThread()
+ 0xc01086f1 Task::allocKernelPageTable(unsigned int, page_table_t*, unsigned int)
+ 0xc0108568 Task::doSwitch()
+ *fill* 0xc0108972 0xe 00
+ .text 0xc0108980 0x48 TaskManager/Task.wtf.o
+ 0xc0108980 read_eip
+ 0xc0108983 idle_task
+ 0xc010898a copy_page_physical
+ .text 0xc01089c8 0x99 TaskManager/Mutex.class.o
+ 0xc01089e0 Mutex::Mutex(bool)
+ 0xc0108a4a Mutex::unlock()
+ 0xc01089f8 Mutex::lock()
+ 0xc0108a1a Mutex::waitLock()
+ 0xc0108a56 Mutex::locked()
+ 0xc01089c8 Mutex::Mutex(bool)
+ *fill* 0xc0108a61 0x3 00
+ .text 0xc0108a64 0xe27 VTManager/VirtualTerminal.class.o
+ 0xc0108e2c VirtualTerminal::map(int, int)
+ 0xc010914a VirtualTerminal::put(wchar, bool)
+ 0xc0109534 VirtualTerminal::hexDump(unsigned char*, unsigned int)
+ 0xc0108ea6 VirtualTerminal::unmap()
+ 0xc0109112 VirtualTerminal::setCursorLine(unsigned int)
+ 0xc0108c98 VirtualTerminal::setColor(unsigned char, unsigned char)
+ 0xc0108c14 VirtualTerminal::~VirtualTerminal()
+ 0xc010912e VirtualTerminal::setCursorCol(unsigned int)
+ 0xc0108b3c VirtualTerminal::VirtualTerminal(unsigned int, unsigned int, unsigned char, unsigned char)
+ 0xc01090b0 VirtualTerminal::updateCursor()
+ 0xc0109320 VirtualTerminal::writeDec(int, bool)
+ 0xc0108c56 VirtualTerminal::~VirtualTerminal()
+ 0xc0108ec0 VirtualTerminal::redraw()
+ 0xc0109458 VirtualTerminal::writeHex(unsigned int, bool)
+ 0xc0108f98 VirtualTerminal::scroll()
+ 0xc0108a64 VirtualTerminal::VirtualTerminal(unsigned int, unsigned int, unsigned char, unsigned char)
+ 0xc01092b4 VirtualTerminal::write(String, bool)
+ 0xc0108ce6 VirtualTerminal::putChar(unsigned int, unsigned int, wchar)
+ 0xc0108db0 VirtualTerminal::clear()
+ 0xc01090ec VirtualTerminal::moveCursor(unsigned int, unsigned int)
+ *fill* 0xc010988b 0x1 00
+ .text 0xc010988c 0x50b VTManager/VirtualTerminal-kbd.class.o
+ 0xc01099b6 VirtualTerminal::getKeypress(bool, bool)
+ 0xc0109bf2 VirtualTerminal::readLine(bool)
+ 0xc010988c VirtualTerminal::keyPress(Kbd::keypress_t)
+ *fill* 0xc0109d97 0x1 00
+ .text 0xc0109d98 0x156 VTManager/VT.ns.o
+ 0xc0109dbe VT::unmap(VirtualTerminal*)
+ 0xc0109e45 VT::redrawScreen()
+ 0xc0109d98 VT::map(VirtualTerminal*)
+ *fill* 0xc0109eee 0x2 00
+ .text 0xc0109ef0 0x2f1 Library/Bitset.class.o
+ 0xc010a1d6 Bitset::usedBits()
+ 0xc0109ef0 Bitset::Bitset()
+ 0xc010a0f8 Bitset::testBit(unsigned int)
+ 0xc0109fbe Bitset::~Bitset()
+ 0xc010a090 Bitset::clearBit(unsigned int)
+ 0xc0109fd4 Bitset::init(unsigned int, unsigned int*)
+ 0xc0109efc Bitset::Bitset(unsigned int)
+ 0xc0109ef6 Bitset::Bitset()
+ 0xc0109f30 Bitset::Bitset(unsigned int)
+ 0xc010a02a Bitset::setBit(unsigned int)
+ 0xc0109fa8 Bitset::~Bitset()
+ 0xc0109f86 Bitset::Bitset(unsigned int, unsigned int*)
+ 0xc0109f64 Bitset::Bitset(unsigned int, unsigned int*)
+ 0xc010a140 Bitset::firstFreeBit()
+ *fill* 0xc010a1e1 0x3 00
+ .text 0xc010a1e4 0x123c Library/String.class.o
+ 0xc010a1e4 String::hex(unsigned int)
+ 0xc010ab76 String::operator==(char*)
+ 0xc010aebc String::operator+=(wchar)
+ 0xc010b06a String::toInt()
+ 0xc010a7c4 String::String(String const&)
+ 0xc010a4d2 String::String()
+ 0xc010a4ea String::String()
+ 0xc010b200 String::size()
+ 0xc010a2f2 String::number(int)
+ 0xc010aaf4 String::operator==(String&)
+ 0xc010afea String::operator+(char*)
+ 0xc010a8c2 String::~String()
+ 0xc010a6ee String::String(String const&)
+ 0xc010a89a String::~String()
+ 0xc010a8ea String::operator=(String const&)
+ 0xc010a502 String::String(char*)
+ 0xc010ac36 String::operator+=(String&)
+ 0xc010b1ee String::operator[](int)
+ 0xc010b24e String::split(wchar)
+ 0xc010b20c String::clear()
+ 0xc010b23e String::empty()
+ 0xc010b132 String::toInt16()
+ 0xc010b342 String::substr(int, int)
+ 0xc010a5f8 String::String(char*)
+ 0xc010ad64 String::operator+=(char*)
+ 0xc010b02a String::operator+(wchar)
+ 0xc010a9e0 String::operator=(char*)
+ 0xc010afaa String::operator+(String&)
+ .text 0xc010b420 0xd47 Library/wchar.class.o
+ 0xc010b42e wchar::wchar()
+ 0xc010b49a wchar::wchar(char*)
+ 0xc010b420 wchar::wchar()
+ 0xc010b480 wchar::wchar(char*)
+ 0xc010b564 wchar::affectAscii(char)
+ 0xc010b4b4 wchar::utf8len(char*)
+ 0xc010b57c wchar::affectUtf8(char*)
+ 0xc010b43c wchar::wchar(char)
+ 0xc010b45e wchar::wchar(char)
+ 0xc010b744 wchar::toAscii()
+ *fill* 0xc010c167 0x1 00
+ .text 0xc010c168 0x22c VFS/Partition.class.o
+ 0xc010c1be Partition::Partition(BlockDevice*, unsigned char, unsigned long long, unsigned long long)
+ 0xc010c168 Partition::Partition(BlockDevice*, unsigned char, unsigned long long, unsigned long long)
+ 0xc010c376 Partition::getBlockSize()
+ 0xc010c36a Partition::getPartNumber()
+ 0xc010c344 Partition::getDevice()
+ 0xc010c2ac Partition::writeBlocks(unsigned long long, unsigned int, unsigned char*)
+ 0xc010c35c Partition::getBlockCount()
+ 0xc010c34e Partition::getStartBlock()
+ 0xc010c214 Partition::readBlocks(unsigned long long, unsigned int, unsigned char*)
+ .text 0xc010c394 0x33d VFS/Part.ns.o
+ 0xc010c5f8 Part::getDeviceID(BlockDevice*)
+ 0xc010c394 Part::readPartitionTable(BlockDevice*)
+ 0xc010c40c Part::registerDevice(BlockDevice*)
+ 0xc010c4ad Part::unregisterDevice(BlockDevice*)
+ *fill* 0xc010c6d1 0x3 00
+ .text 0xc010c6d4 0xd53 SyscallManager/IDT.ns.o
+ 0xc010d0ff IDT::handleException(registers_t, int)
+ 0xc010c8dd IDT::init()
+ 0xc010c876 IDT::setGate(unsigned char, unsigned int, unsigned short, unsigned char)
+ 0xc010c6d4 interrupt_handler
+ *fill* 0xc010d427 0x9 00
+ .text 0xc010d430 0x20e SyscallManager/IDT.wtf.o
+ 0xc010d460 isr4
+ 0xc010d53a isr27
+ 0xc010d4b2 isr13
+ 0xc010d5e4 irq12
+ 0xc010d508 isr22
+ 0xc010d4c2 isr15
+ 0xc010d5d0 irq10
+ 0xc010d5f8 irq14
+ 0xc010d490 isr9
+ 0xc010d5bc irq8
+ 0xc010d512 isr23
+ 0xc010d54e isr29
+ 0xc010d562 isr31
+ 0xc010d4fe isr21
+ 0xc010d5da irq11
+ 0xc010d544 isr28
+ 0xc010d488 isr8
+ 0xc010d59e irq5
+ 0xc010d4f4 isr20
+ 0xc010d4ba isr14
+ 0xc010d46a isr5
+ 0xc010d5a8 irq6
+ 0xc010d576 irq1
+ 0xc010d442 isr1
+ 0xc010d5c6 irq9
+ 0xc010d530 isr26
+ 0xc010d4a2 isr11
+ 0xc010d5ee irq13
+ 0xc010d4aa isr12
+ 0xc010d438 isr0
+ 0xc010d580 irq2
+ 0xc010d51c isr24
+ 0xc010d4cc isr16
+ 0xc010d456 isr3
+ 0xc010d474 isr6
+ 0xc010d5b2 irq7
+ 0xc010d4e0 isr18
+ 0xc010d56c irq0
+ 0xc010d49a isr10
+ 0xc010d4d6 isr17
+ 0xc010d44c isr2
+ 0xc010d60c int64
+ 0xc010d4ea isr19
+ 0xc010d430 idt_flush
+ 0xc010d558 isr30
+ 0xc010d602 irq15
+ 0xc010d47e isr7
+ 0xc010d526 isr25
+ 0xc010d594 irq4
+ 0xc010d58a irq3
+ *fill* 0xc010d63e 0x2 00
+ .text 0xc010d640 0x185 Devices/Display/VGATextOutput.class.o
+ 0xc010d668 VGATextOutput::getName()
+ 0xc010d690 VGATextOutput::textCols()
+ 0xc010d78e VGATextOutput::clear()
+ 0xc010d640 VGATextOutput::getClass()
+ 0xc010d708 VGATextOutput::moveCursor(unsigned short, unsigned short)
+ 0xc010d6a4 VGATextOutput::putChar(unsigned short, unsigned short, wchar, unsigned char)
+ 0xc010d69a VGATextOutput::textRows()
+ *fill* 0xc010d7c5 0x3 00
+ .text 0xc010d7c8 0x190 Devices/Keyboard/PS2Keyboard.class.o
+ 0xc010d7fe PS2Keyboard::PS2Keyboard()
+ 0xc010d884 PS2Keyboard::handleIRQ(registers_t, int)
+ 0xc010d85c PS2Keyboard::getName()
+ 0xc010d90e PS2Keyboard::updateLeds(unsigned int)
+ 0xc010d7c8 PS2Keyboard::PS2Keyboard()
+ 0xc010d834 PS2Keyboard::getClass()
+ .text 0xc010d958 0x8b0 Devices/Floppy/FloppyController.class.o
+ 0xc010dad4 FloppyController::dmaRelease()
+ 0xc010dc2a FloppyController::FloppyController(unsigned int, unsigned char)
+ 0xc010e024 FloppyController::writeCmd(unsigned char)
+ 0xc010dfdc FloppyController::setActiveDrive(unsigned char)
+ 0xc010dae8 floppyMotorTimer()
+ 0xc010d958 FloppyController::dmaInit(unsigned char, unsigned int)
+ 0xc010df24 FloppyController::setDOR()
+ 0xc010e00e FloppyController::setNoActiveDrive()
+ 0xc010de3a FloppyController::getClass()
+ 0xc010e0a6 FloppyController::readData()
+ 0xc010dbbc FloppyController::FloppyController(unsigned int, unsigned char)
+ 0xc010de62 FloppyController::getName()
+ 0xc010dc98 FloppyController::detect()
+ 0xc010dee2 FloppyController::checkInterrupt(int*, int*)
+ 0xc010e114 FloppyController::reset()
+ .text 0xc010e208 0xf6e Devices/Floppy/FloppyDrive.class.o
+ 0xc010f104 FloppyDrive::writeBlocks(unsigned long long, unsigned int, unsigned char*)
+ 0xc010e6e6 FloppyDrive::setMotorState(bool)
+ 0xc010e30a FloppyDrive::FloppyDrive(FloppyController*, unsigned char, unsigned char)
+ 0xc010ee62 FloppyDrive::readBlocks(unsigned long long, unsigned int, unsigned char*)
+ 0xc010e4cc FloppyDrive::setup()
+ 0xc010e40c FloppyDrive::getClass()
+ 0xc010e434 FloppyDrive::getName()
+ 0xc010ee46 FloppyDrive::blocks()
+ 0xc010e208 FloppyDrive::FloppyDrive(FloppyController*, unsigned char, unsigned char)
+ 0xc010e948 FloppyDrive::doTrack(unsigned int, unsigned char)
+ 0xc010e598 FloppyDrive::calibrate()
+ 0xc010eda2 FloppyDrive::readOnly()
+ 0xc010e790 FloppyDrive::killMotor()
+ 0xc010f128 FloppyDrive::chs2lba(unsigned int, unsigned int, unsigned int)
+ 0xc010f11e FloppyDrive::blockSize()
+ 0xc010e7b2 FloppyDrive::seek(unsigned int, int)
+ *fill* 0xc010f176 0x2 00
+ .text 0xc010f178 0x219 Devices/Timer.class.o
+ 0xc010f290 Timer::setFrequency(unsigned char)
+ 0xc010f178 Timer::Timer(unsigned char)
+ 0xc010f240 Timer::getClass()
+ 0xc010f268 Timer::getName()
+ 0xc010f314 Timer::time()
+ 0xc010f34e Timer::handleIRQ(registers_t, int)
+ 0xc010f308 Timer::uptime()
+ 0xc010f1dc Timer::Timer(unsigned char)
+
+.text._Znwj 0xc010f391 0x1b load address 0x0010f391
+ .text._Znwj 0xc010f391 0x1b Core/kmain.wtf.o
+ 0xc010f391 operator new(unsigned int)
+
+.text._ZdaPv 0xc010f3ac 0x13 load address 0x0010f3ac
+ .text._ZdaPv 0xc010f3ac 0x13 Core/kmain.wtf.o
+ 0xc010f3ac operator delete[](void*)
.text._ZN6Device9handleIRQE11registers_ti
- 0xc010cc30 0x5 load address 0x0010cc30
+ 0xc010f3c0 0x5 load address 0x0010f3c0
.text._ZN6Device9handleIRQE11registers_ti
- 0xc010cc30 0x5 Core/kmain.wtf.o
- 0xc010cc30 Device::handleIRQ(registers_t, int)
+ 0xc010f3c0 0x5 Core/kmain.wtf.o
+ 0xc010f3c0 Device::handleIRQ(registers_t, int)
.text._ZN15VirtualTerminallsE6String
- 0xc010cc36 0x42 load address 0x0010cc36
+ 0xc010f3c6 0x42 load address 0x0010f3c6
.text._ZN15VirtualTerminallsE6String
- 0xc010cc36 0x42 Core/kmain.wtf.o
- 0xc010cc36 VirtualTerminal::operator<<(String)
+ 0xc010f3c6 0x42 Core/kmain.wtf.o
+ 0xc010f3c6 VirtualTerminal::operator<<(String)
.text._ZN15VirtualTerminallsEi
- 0xc010cc78 0x25 load address 0x0010cc78
+ 0xc010f408 0x25 load address 0x0010f408
.text._ZN15VirtualTerminallsEi
- 0xc010cc78 0x25 Core/kmain.wtf.o
- 0xc010cc78 VirtualTerminal::operator<<(int)
+ 0xc010f408 0x25 Core/kmain.wtf.o
+ 0xc010f408 VirtualTerminal::operator<<(int)
.text._ZN15VirtualTerminallsEj
- 0xc010cc9e 0x25 load address 0x0010cc9e
+ 0xc010f42e 0x25 load address 0x0010f42e
.text._ZN15VirtualTerminallsEj
- 0xc010cc9e 0x25 Core/kmain.wtf.o
- 0xc010cc9e VirtualTerminal::operator<<(unsigned int)
+ 0xc010f42e 0x25 Core/kmain.wtf.o
+ 0xc010f42e VirtualTerminal::operator<<(unsigned int)
.text._ZN6DeviceC2Ev
- 0xc010ccc4 0xe load address 0x0010ccc4
+ 0xc010f454 0xe load address 0x0010f454
.text._ZN6DeviceC2Ev
- 0xc010ccc4 0xe Core/kmain.wtf.o
- 0xc010ccc4 Device::Device()
+ 0xc010f454 0xe Core/kmain.wtf.o
+ 0xc010f454 Device::Device()
.text._ZN7DisplayC2Ev
- 0xc010ccd2 0x1c load address 0x0010ccd2
+ 0xc010f462 0x1c load address 0x0010f462
.text._ZN7DisplayC2Ev
- 0xc010ccd2 0x1c Core/kmain.wtf.o
- 0xc010ccd2 Display::Display()
+ 0xc010f462 0x1c Core/kmain.wtf.o
+ 0xc010f462 Display::Display()
.text._ZN13VGATextOutputC1Ev
- 0xc010ccee 0x1c load address 0x0010ccee
+ 0xc010f47e 0x1c load address 0x0010f47e
.text._ZN13VGATextOutputC1Ev
- 0xc010ccee 0x1c Core/kmain.wtf.o
- 0xc010ccee VGATextOutput::VGATextOutput()
+ 0xc010f47e 0x1c Core/kmain.wtf.o
+ 0xc010f47e VGATextOutput::VGATextOutput()
.text._ZN6VectorIP6DeviceED1Ev
- 0xc010cd0a 0x27 load address 0x0010cd0a
+ 0xc010f49a 0x27 load address 0x0010f49a
.text._ZN6VectorIP6DeviceED1Ev
- 0xc010cd0a 0x27 Core/kmain.wtf.o
- 0xc010cd0a Vector<Device*>::~Vector()
+ 0xc010f49a 0x27 Core/kmain.wtf.o
+ 0xc010f49a Vector<Device*>::~Vector()
.text._ZN6VectorIP6DeviceE4sizeEv
- 0xc010cd32 0xb load address 0x0010cd32
+ 0xc010f4c2 0xb load address 0x0010f4c2
.text._ZN6VectorIP6DeviceE4sizeEv
- 0xc010cd32 0xb Core/kmain.wtf.o
- 0xc010cd32 Vector<Device*>::size()
+ 0xc010f4c2 0xb Core/kmain.wtf.o
+ 0xc010f4c2 Vector<Device*>::size()
.text._ZN6VectorIP6DeviceEixEj
- 0xc010cd3e 0x12 load address 0x0010cd3e
+ 0xc010f4ce 0x12 load address 0x0010f4ce
.text._ZN6VectorIP6DeviceEixEj
- 0xc010cd3e 0x12 Core/kmain.wtf.o
- 0xc010cd3e Vector<Device*>::operator[](unsigned int)
-
-.text._ZnwjPv 0xc010cd50 0x8 load address 0x0010cd50
- .text._ZnwjPv 0xc010cd50 0x8 MemoryManager/PhysMem.ns.o
- 0xc010cd50 operator new(unsigned int, void*)
+ 0xc010f4ce 0x12 Core/kmain.wtf.o
+ 0xc010f4ce Vector<Device*>::operator[](unsigned int)
+
+.text._ZN6VectorIP11BlockDeviceE4sizeEv
+ 0xc010f4e0 0xb load address 0x0010f4e0
+ .text._ZN6VectorIP11BlockDeviceE4sizeEv
+ 0xc010f4e0 0xb Core/kmain.wtf.o
+ 0xc010f4e0 Vector<BlockDevice*>::size()
+
+.text._ZN6VectorIP11BlockDeviceEixEj
+ 0xc010f4ec 0x12 load address 0x0010f4ec
+ .text._ZN6VectorIP11BlockDeviceEixEj
+ 0xc010f4ec 0x12 Core/kmain.wtf.o
+ 0xc010f4ec Vector<BlockDevice*>::operator[](unsigned int)
+
+.text._ZN6VectorIP9PartitionE4sizeEv
+ 0xc010f4fe 0xb load address 0x0010f4fe
+ .text._ZN6VectorIP9PartitionE4sizeEv
+ 0xc010f4fe 0xb Core/kmain.wtf.o
+ 0xc010f4fe Vector<Partition*>::size()
+
+.text._ZN6VectorIP9PartitionEixEj
+ 0xc010f50a 0x12 load address 0x0010f50a
+ .text._ZN6VectorIP9PartitionEixEj
+ 0xc010f50a 0x12 Core/kmain.wtf.o
+ 0xc010f50a Vector<Partition*>::operator[](unsigned int)
+
+.text._ZnwjPv 0xc010f51c 0x8 load address 0x0010f51c
+ .text._ZnwjPv 0xc010f51c 0x8 MemoryManager/PhysMem.ns.o
+ 0xc010f51c operator new(unsigned int, void*)
.text._ZN6VectorIP6DeviceEC1Ev
- 0xc010cd58 0x18 load address 0x0010cd58
+ 0xc010f524 0x18 load address 0x0010f524
.text._ZN6VectorIP6DeviceEC1Ev
- 0xc010cd58 0x18 DeviceManager/Dev.ns.o
- 0xc010cd58 Vector<Device*>::Vector()
+ 0xc010f524 0x18 DeviceManager/Dev.ns.o
+ 0xc010f524 Vector<Device*>::Vector()
.text._ZN6VectorIP6DeviceE4pushES1_
- 0xc010cd70 0x91 load address 0x0010cd70
+ 0xc010f53c 0x91 load address 0x0010f53c
.text._ZN6VectorIP6DeviceE4pushES1_
- 0xc010cd70 0x91 DeviceManager/Dev.ns.o
- 0xc010cd70 Vector<Device*>::push(Device*)
+ 0xc010f53c 0x91 DeviceManager/Dev.ns.o
+ 0xc010f53c Vector<Device*>::push(Device*)
.text._ZN6VectorIP6DeviceE4backEv
- 0xc010ce02 0x19 load address 0x0010ce02
+ 0xc010f5ce 0x19 load address 0x0010f5ce
.text._ZN6VectorIP6DeviceE4backEv
- 0xc010ce02 0x19 DeviceManager/Dev.ns.o
- 0xc010ce02 Vector<Device*>::back()
+ 0xc010f5ce 0x19 DeviceManager/Dev.ns.o
+ 0xc010f5ce Vector<Device*>::back()
.text._ZN6VectorIP6DeviceE3popEv
- 0xc010ce1c 0x6d load address 0x0010ce1c
+ 0xc010f5e8 0x6d load address 0x0010f5e8
.text._ZN6VectorIP6DeviceE3popEv
- 0xc010ce1c 0x6d DeviceManager/Dev.ns.o
- 0xc010ce1c Vector<Device*>::pop()
+ 0xc010f5e8 0x6d DeviceManager/Dev.ns.o
+ 0xc010f5e8 Vector<Device*>::pop()
.text._ZN6VectorIP6DeviceEC1ERKS2_
- 0xc010ce8a 0x7f load address 0x0010ce8a
+ 0xc010f656 0x7f load address 0x0010f656
.text._ZN6VectorIP6DeviceEC1ERKS2_
- 0xc010ce8a 0x7f DeviceManager/Dev.ns.o
- 0xc010ce8a Vector<Device*>::Vector(Vector<Device*> const&)
+ 0xc010f656 0x7f DeviceManager/Dev.ns.o
+ 0xc010f656 Vector<Device*>::Vector(Vector<Device*> const&)
.text._ZN5wcharaSEj
- 0xc010cf0a 0x10 load address 0x0010cf0a
+ 0xc010f6d6 0x10 load address 0x0010f6d6
.text._ZN5wcharaSEj
- 0xc010cf0a 0x10 DeviceManager/Kbd.ns.o
- 0xc010cf0a wchar::operator=(unsigned int)
+ 0xc010f6d6 0x10 DeviceManager/Kbd.ns.o
+ 0xc010f6d6 wchar::operator=(unsigned int)
.text._ZN5wcharcvjEv
- 0xc010cf1a 0xa load address 0x0010cf1a
+ 0xc010f6e6 0xa load address 0x0010f6e6
.text._ZN5wcharcvjEv
- 0xc010cf1a 0xa DeviceManager/Kbd.ns.o
- 0xc010cf1a wchar::operator unsigned int()
+ 0xc010f6e6 0xa DeviceManager/Kbd.ns.o
+ 0xc010f6e6 wchar::operator unsigned int()
.text._ZN3Kbd10keypress_tC1Ev
- 0xc010cf24 0x33 load address 0x0010cf24
+ 0xc010f6f0 0x33 load address 0x0010f6f0
.text._ZN3Kbd10keypress_tC1Ev
- 0xc010cf24 0x33 DeviceManager/Kbd.ns.o
- 0xc010cf24 Kbd::keypress_t::keypress_t()
+ 0xc010f6f0 0x33 DeviceManager/Kbd.ns.o
+ 0xc010f6f0 Kbd::keypress_t::keypress_t()
-.text._ZdlPv 0xc010cf57 0x13 load address 0x0010cf57
- .text._ZdlPv 0xc010cf57 0x13 TaskManager/Process.class.o
- 0xc010cf57 operator delete(void*)
+.text._ZdlPv 0xc010f723 0x13 load address 0x0010f723
+ .text._ZdlPv 0xc010f723 0x13 TaskManager/Process.class.o
+ 0xc010f723 operator delete(void*)
.text._ZN6VectorIP6ThreadEC1Ev
- 0xc010cf6a 0x18 load address 0x0010cf6a
+ 0xc010f736 0x18 load address 0x0010f736
.text._ZN6VectorIP6ThreadEC1Ev
- 0xc010cf6a 0x18 TaskManager/Process.class.o
- 0xc010cf6a Vector<Thread*>::Vector()
+ 0xc010f736 0x18 TaskManager/Process.class.o
+ 0xc010f736 Vector<Thread*>::Vector()
.text._ZN6VectorIP6ThreadED1Ev
- 0xc010cf82 0x27 load address 0x0010cf82
+ 0xc010f74e 0x27 load address 0x0010f74e
.text._ZN6VectorIP6ThreadED1Ev
- 0xc010cf82 0x27 TaskManager/Process.class.o
- 0xc010cf82 Vector<Thread*>::~Vector()
+ 0xc010f74e 0x27 TaskManager/Process.class.o
+ 0xc010f74e Vector<Thread*>::~Vector()
.text._ZN6VectorIP6ThreadE5emptyEv
- 0xc010cfaa 0x10 load address 0x0010cfaa
+ 0xc010f776 0x10 load address 0x0010f776
.text._ZN6VectorIP6ThreadE5emptyEv
- 0xc010cfaa 0x10 TaskManager/Process.class.o
- 0xc010cfaa Vector<Thread*>::empty()
+ 0xc010f776 0x10 TaskManager/Process.class.o
+ 0xc010f776 Vector<Thread*>::empty()
.text._ZN6VectorIP6ThreadE4backEv
- 0xc010cfba 0x19 load address 0x0010cfba
+ 0xc010f786 0x19 load address 0x0010f786
.text._ZN6VectorIP6ThreadE4backEv
- 0xc010cfba 0x19 TaskManager/Process.class.o
- 0xc010cfba Vector<Thread*>::back()
+ 0xc010f786 0x19 TaskManager/Process.class.o
+ 0xc010f786 Vector<Thread*>::back()
.text._ZN6VectorIP6ThreadE3popEv
- 0xc010cfd4 0x6d load address 0x0010cfd4
+ 0xc010f7a0 0x6d load address 0x0010f7a0
.text._ZN6VectorIP6ThreadE3popEv
- 0xc010cfd4 0x6d TaskManager/Process.class.o
- 0xc010cfd4 Vector<Thread*>::pop()
+ 0xc010f7a0 0x6d TaskManager/Process.class.o
+ 0xc010f7a0 Vector<Thread*>::pop()
.text._ZN6VectorIP6ThreadE4pushES1_
- 0xc010d042 0x91 load address 0x0010d042
+ 0xc010f80e 0x91 load address 0x0010f80e
.text._ZN6VectorIP6ThreadE4pushES1_
- 0xc010d042 0x91 TaskManager/Process.class.o
- 0xc010d042 Vector<Thread*>::push(Thread*)
+ 0xc010f80e 0x91 TaskManager/Process.class.o
+ 0xc010f80e Vector<Thread*>::push(Thread*)
.text._ZN6VectorIP6ThreadEixEj
- 0xc010d0d4 0x12 load address 0x0010d0d4
+ 0xc010f8a0 0x12 load address 0x0010f8a0
.text._ZN6VectorIP6ThreadEixEj
- 0xc010d0d4 0x12 TaskManager/Process.class.o
- 0xc010d0d4 Vector<Thread*>::operator[](unsigned int)
+ 0xc010f8a0 0x12 TaskManager/Process.class.o
+ 0xc010f8a0 Vector<Thread*>::operator[](unsigned int)
.text._ZN6VectorIP6ThreadE4sizeEv
- 0xc010d0e6 0xb load address 0x0010d0e6
+ 0xc010f8b2 0xb load address 0x0010f8b2
.text._ZN6VectorIP6ThreadE4sizeEv
- 0xc010d0e6 0xb TaskManager/Process.class.o
- 0xc010d0e6 Vector<Thread*>::size()
+ 0xc010f8b2 0xb TaskManager/Process.class.o
+ 0xc010f8b2 Vector<Thread*>::size()
.text._ZN6Thread10irqHappensEh
- 0xc010d0f2 0x38 load address 0x0010d0f2
+ 0xc010f8be 0x38 load address 0x0010f8be
.text._ZN6Thread10irqHappensEh
- 0xc010d0f2 0x38 TaskManager/Task.ns.o
- 0xc010d0f2 Thread::irqHappens(unsigned char)
+ 0xc010f8be 0x38 TaskManager/Task.ns.o
+ 0xc010f8be Thread::irqHappens(unsigned char)
.text._ZN6VectorIP7ProcessEC1Ev
- 0xc010d12a 0x18 load address 0x0010d12a
+ 0xc010f8f6 0x18 load address 0x0010f8f6
.text._ZN6VectorIP7ProcessEC1Ev
- 0xc010d12a 0x18 TaskManager/Task.ns.o
- 0xc010d12a Vector<Process*>::Vector()
+ 0xc010f8f6 0x18 TaskManager/Task.ns.o
+ 0xc010f8f6 Vector<Process*>::Vector()
.text._ZN6VectorIP6ThreadE5clearEv
- 0xc010d142 0x3a load address 0x0010d142
+ 0xc010f90e 0x3a load address 0x0010f90e
.text._ZN6VectorIP6ThreadE5clearEv
- 0xc010d142 0x3a TaskManager/Task.ns.o
- 0xc010d142 Vector<Thread*>::clear()
+ 0xc010f90e 0x3a TaskManager/Task.ns.o
+ 0xc010f90e Vector<Thread*>::clear()
.text._ZN6VectorIP7ProcessE5clearEv
- 0xc010d17c 0x3a load address 0x0010d17c
+ 0xc010f948 0x3a load address 0x0010f948
.text._ZN6VectorIP7ProcessE5clearEv
- 0xc010d17c 0x3a TaskManager/Task.ns.o
- 0xc010d17c Vector<Process*>::clear()
+ 0xc010f948 0x3a TaskManager/Task.ns.o
+ 0xc010f948 Vector<Process*>::clear()
.text._ZN6VectorIP7ProcessE4sizeEv
- 0xc010d1b6 0xb load address 0x0010d1b6
+ 0xc010f982 0xb load address 0x0010f982
.text._ZN6VectorIP7ProcessE4sizeEv
- 0xc010d1b6 0xb TaskManager/Task.ns.o
- 0xc010d1b6 Vector<Process*>::size()
+ 0xc010f982 0xb TaskManager/Task.ns.o
+ 0xc010f982 Vector<Process*>::size()
.text._ZN6VectorIP7ProcessEixEj
- 0xc010d1c2 0x12 load address 0x0010d1c2
+ 0xc010f98e 0x12 load address 0x0010f98e
.text._ZN6VectorIP7ProcessEixEj
- 0xc010d1c2 0x12 TaskManager/Task.ns.o
- 0xc010d1c2 Vector<Process*>::operator[](unsigned int)
+ 0xc010f98e 0x12 TaskManager/Task.ns.o
+ 0xc010f98e Vector<Process*>::operator[](unsigned int)
.text._ZN6VectorIP7ProcessE4pushES1_
- 0xc010d1d4 0x91 load address 0x0010d1d4
+ 0xc010f9a0 0x91 load address 0x0010f9a0
.text._ZN6VectorIP7ProcessE4pushES1_
- 0xc010d1d4 0x91 TaskManager/Task.ns.o
- 0xc010d1d4 Vector<Process*>::push(Process*)
+ 0xc010f9a0 0x91 TaskManager/Task.ns.o
+ 0xc010f9a0 Vector<Process*>::push(Process*)
.text._ZN6VectorIP7ProcessE4backEv
- 0xc010d266 0x19 load address 0x0010d266
+ 0xc010fa32 0x19 load address 0x0010fa32
.text._ZN6VectorIP7ProcessE4backEv
- 0xc010d266 0x19 TaskManager/Task.ns.o
- 0xc010d266 Vector<Process*>::back()
+ 0xc010fa32 0x19 TaskManager/Task.ns.o
+ 0xc010fa32 Vector<Process*>::back()
.text._ZN6VectorIP7ProcessE3popEv
- 0xc010d280 0x6d load address 0x0010d280
+ 0xc010fa4c 0x6d load address 0x0010fa4c
.text._ZN6VectorIP7ProcessE3popEv
- 0xc010d280 0x6d TaskManager/Task.ns.o
- 0xc010d280 Vector<Process*>::pop()
+ 0xc010fa4c 0x6d TaskManager/Task.ns.o
+ 0xc010fa4c Vector<Process*>::pop()
.text._ZN6VectorIP7ProcessE5emptyEv
- 0xc010d2ee 0x10 load address 0x0010d2ee
+ 0xc010faba 0x10 load address 0x0010faba
.text._ZN6VectorIP7ProcessE5emptyEv
- 0xc010d2ee 0x10 TaskManager/Task.ns.o
- 0xc010d2ee Vector<Process*>::empty()
+ 0xc010faba 0x10 TaskManager/Task.ns.o
+ 0xc010faba Vector<Process*>::empty()
.text._ZN6VectorIP7ProcessED1Ev
- 0xc010d2fe 0x27 load address 0x0010d2fe
+ 0xc010faca 0x27 load address 0x0010faca
.text._ZN6VectorIP7ProcessED1Ev
- 0xc010d2fe 0x27 TaskManager/Task.ns.o
- 0xc010d2fe Vector<Process*>::~Vector()
+ 0xc010faca 0x27 TaskManager/Task.ns.o
+ 0xc010faca Vector<Process*>::~Vector()
-.text._Znaj 0xc010d325 0x1b load address 0x0010d325
- .text._Znaj 0xc010d325 0x1b VTManager/VirtualTerminal.class.o
- 0xc010d325 operator new[](unsigned int)
+.text._Znaj 0xc010faf1 0x1b load address 0x0010faf1
+ .text._Znaj 0xc010faf1 0x1b VTManager/VirtualTerminal.class.o
+ 0xc010faf1 operator new[](unsigned int)
.text._ZN3chrC1Ev
- 0xc010d340 0x16 load address 0x0010d340
+ 0xc010fb0c 0x16 load address 0x0010fb0c
.text._ZN3chrC1Ev
- 0xc010d340 0x16 VTManager/VirtualTerminal.class.o
- 0xc010d340 chr::chr()
+ 0xc010fb0c 0x16 VTManager/VirtualTerminal.class.o
+ 0xc010fb0c chr::chr()
.text._ZN6VectorIN3Kbd10keypress_tEEC1Ev
- 0xc010d356 0x18 load address 0x0010d356
+ 0xc010fb22 0x18 load address 0x0010fb22
.text._ZN6VectorIN3Kbd10keypress_tEEC1Ev
- 0xc010d356 0x18 VTManager/VirtualTerminal.class.o
- 0xc010d356 Vector<Kbd::keypress_t>::Vector()
+ 0xc010fb22 0x18 VTManager/VirtualTerminal.class.o
+ 0xc010fb22 Vector<Kbd::keypress_t>::Vector()
.text._ZN6VectorIN3Kbd10keypress_tEED1Ev
- 0xc010d36e 0x27 load address 0x0010d36e
+ 0xc010fb3a 0x27 load address 0x0010fb3a
.text._ZN6VectorIN3Kbd10keypress_tEED1Ev
- 0xc010d36e 0x27 VTManager/VirtualTerminal.class.o
- 0xc010d36e Vector<Kbd::keypress_t>::~Vector()
+ 0xc010fb3a 0x27 VTManager/VirtualTerminal.class.o
+ 0xc010fb3a Vector<Kbd::keypress_t>::~Vector()
.text._ZN6VectorIN3Kbd10keypress_tEE4pushES1_
- 0xc010d396 0x99 load address 0x0010d396
+ 0xc010fb62 0x99 load address 0x0010fb62
.text._ZN6VectorIN3Kbd10keypress_tEE4pushES1_
- 0xc010d396 0x99 VTManager/VirtualTerminal-kbd.class.o
- 0xc010d396 Vector<Kbd::keypress_t>::push(Kbd::keypress_t)
+ 0xc010fb62 0x99 VTManager/VirtualTerminal-kbd.class.o
+ 0xc010fb62 Vector<Kbd::keypress_t>::push(Kbd::keypress_t)
.text._ZN6VectorIN3Kbd10keypress_tEE5emptyEv
- 0xc010d430 0x10 load address 0x0010d430
+ 0xc010fbfc 0x10 load address 0x0010fbfc
.text._ZN6VectorIN3Kbd10keypress_tEE5emptyEv
- 0xc010d430 0x10 VTManager/VirtualTerminal-kbd.class.o
- 0xc010d430 Vector<Kbd::keypress_t>::empty()
+ 0xc010fbfc 0x10 VTManager/VirtualTerminal-kbd.class.o
+ 0xc010fbfc Vector<Kbd::keypress_t>::empty()
.text._ZN6VectorIN3Kbd10keypress_tEEixEj
- 0xc010d440 0x12 load address 0x0010d440
+ 0xc010fc0c 0x12 load address 0x0010fc0c
.text._ZN6VectorIN3Kbd10keypress_tEEixEj
- 0xc010d440 0x12 VTManager/VirtualTerminal-kbd.class.o
- 0xc010d440 Vector<Kbd::keypress_t>::operator[](unsigned int)
+ 0xc010fc0c 0x12 VTManager/VirtualTerminal-kbd.class.o
+ 0xc010fc0c Vector<Kbd::keypress_t>::operator[](unsigned int)
.text._ZN6VectorIN3Kbd10keypress_tEE4sizeEv
- 0xc010d452 0xb load address 0x0010d452
+ 0xc010fc1e 0xb load address 0x0010fc1e
.text._ZN6VectorIN3Kbd10keypress_tEE4sizeEv
- 0xc010d452 0xb VTManager/VirtualTerminal-kbd.class.o
- 0xc010d452 Vector<Kbd::keypress_t>::size()
+ 0xc010fc1e 0xb VTManager/VirtualTerminal-kbd.class.o
+ 0xc010fc1e Vector<Kbd::keypress_t>::size()
.text._ZN3Kbd10keypress_tD1Ev
- 0xc010d45e 0x5 load address 0x0010d45e
+ 0xc010fc2a 0x5 load address 0x0010fc2a
.text._ZN3Kbd10keypress_tD1Ev
- 0xc010d45e 0x5 VTManager/VirtualTerminal-kbd.class.o
- 0xc010d45e Kbd::keypress_t::~keypress_t()
+ 0xc010fc2a 0x5 VTManager/VirtualTerminal-kbd.class.o
+ 0xc010fc2a Kbd::keypress_t::~keypress_t()
.text._ZN6VectorIN3Kbd10keypress_tEE3popEv
- 0xc010d464 0x86 load address 0x0010d464
+ 0xc010fc30 0x86 load address 0x0010fc30
.text._ZN6VectorIN3Kbd10keypress_tEE3popEv
- 0xc010d464 0x86 VTManager/VirtualTerminal-kbd.class.o
- 0xc010d464 Vector<Kbd::keypress_t>::pop()
+ 0xc010fc30 0x86 VTManager/VirtualTerminal-kbd.class.o
+ 0xc010fc30 Vector<Kbd::keypress_t>::pop()
.text._ZN6VectorIP15VirtualTerminalEC1Ev
- 0xc010d4ea 0x18 load address 0x0010d4ea
+ 0xc010fcb6 0x18 load address 0x0010fcb6
.text._ZN6VectorIP15VirtualTerminalEC1Ev
- 0xc010d4ea 0x18 VTManager/VT.ns.o
- 0xc010d4ea Vector<VirtualTerminal*>::Vector()
+ 0xc010fcb6 0x18 VTManager/VT.ns.o
+ 0xc010fcb6 Vector<VirtualTerminal*>::Vector()
.text._ZN6VectorIP15VirtualTerminalE4pushES1_
- 0xc010d502 0x91 load address 0x0010d502
+ 0xc010fcce 0x91 load address 0x0010fcce
.text._ZN6VectorIP15VirtualTerminalE4pushES1_
- 0xc010d502 0x91 VTManager/VT.ns.o
- 0xc010d502 Vector<VirtualTerminal*>::push(VirtualTerminal*)
+ 0xc010fcce 0x91 VTManager/VT.ns.o
+ 0xc010fcce Vector<VirtualTerminal*>::push(VirtualTerminal*)
.text._ZN6VectorIP15VirtualTerminalE4sizeEv
- 0xc010d594 0xb load address 0x0010d594
+ 0xc010fd60 0xb load address 0x0010fd60
.text._ZN6VectorIP15VirtualTerminalE4sizeEv
- 0xc010d594 0xb VTManager/VT.ns.o
- 0xc010d594 Vector<VirtualTerminal*>::size()
+ 0xc010fd60 0xb VTManager/VT.ns.o
+ 0xc010fd60 Vector<VirtualTerminal*>::size()
.text._ZN6VectorIP15VirtualTerminalEixEj
- 0xc010d5a0 0x12 load address 0x0010d5a0
+ 0xc010fd6c 0x12 load address 0x0010fd6c
.text._ZN6VectorIP15VirtualTerminalEixEj
- 0xc010d5a0 0x12 VTManager/VT.ns.o
- 0xc010d5a0 Vector<VirtualTerminal*>::operator[](unsigned int)
+ 0xc010fd6c 0x12 VTManager/VT.ns.o
+ 0xc010fd6c Vector<VirtualTerminal*>::operator[](unsigned int)
.text._ZN6VectorIP15VirtualTerminalE4backEv
- 0xc010d5b2 0x19 load address 0x0010d5b2
+ 0xc010fd7e 0x19 load address 0x0010fd7e
.text._ZN6VectorIP15VirtualTerminalE4backEv
- 0xc010d5b2 0x19 VTManager/VT.ns.o
- 0xc010d5b2 Vector<VirtualTerminal*>::back()
+ 0xc010fd7e 0x19 VTManager/VT.ns.o
+ 0xc010fd7e Vector<VirtualTerminal*>::back()
.text._ZN6VectorIP15VirtualTerminalE3popEv
- 0xc010d5cc 0x6d load address 0x0010d5cc
+ 0xc010fd98 0x6d load address 0x0010fd98
.text._ZN6VectorIP15VirtualTerminalE3popEv
- 0xc010d5cc 0x6d VTManager/VT.ns.o
- 0xc010d5cc Vector<VirtualTerminal*>::pop()
+ 0xc010fd98 0x6d VTManager/VT.ns.o
+ 0xc010fd98 Vector<VirtualTerminal*>::pop()
.text._ZN6VectorIP15VirtualTerminalED1Ev
- 0xc010d63a 0x27 load address 0x0010d63a
+ 0xc010fe06 0x27 load address 0x0010fe06
.text._ZN6VectorIP15VirtualTerminalED1Ev
- 0xc010d63a 0x27 VTManager/VT.ns.o
- 0xc010d63a Vector<VirtualTerminal*>::~Vector()
+ 0xc010fe06 0x27 VTManager/VT.ns.o
+ 0xc010fe06 Vector<VirtualTerminal*>::~Vector()
.text._ZN5wchareqEj
- 0xc010d662 0x10 load address 0x0010d662
+ 0xc010fe2e 0x10 load address 0x0010fe2e
.text._ZN5wchareqEj
- 0xc010d662 0x10 Library/String.class.o
- 0xc010d662 wchar::operator==(unsigned int)
+ 0xc010fe2e 0x10 Library/String.class.o
+ 0xc010fe2e wchar::operator==(unsigned int)
.text._ZN6VectorI6StringEC1Ev
- 0xc010d672 0x18 load address 0x0010d672
+ 0xc010fe3e 0x18 load address 0x0010fe3e
.text._ZN6VectorI6StringEC1Ev
- 0xc010d672 0x18 Library/String.class.o
- 0xc010d672 Vector<String>::Vector()
+ 0xc010fe3e 0x18 Library/String.class.o
+ 0xc010fe3e Vector<String>::Vector()
.text._ZN6VectorI6StringE4pushES0_
- 0xc010d68a 0x9b load address 0x0010d68a
+ 0xc010fe56 0x9b load address 0x0010fe56
.text._ZN6VectorI6StringE4pushES0_
- 0xc010d68a 0x9b Library/String.class.o
- 0xc010d68a Vector<String>::push(String)
+ 0xc010fe56 0x9b Library/String.class.o
+ 0xc010fe56 Vector<String>::push(String)
.text._ZN6VectorI6StringE4backEv
- 0xc010d726 0x19 load address 0x0010d726
+ 0xc010fef2 0x19 load address 0x0010fef2
.text._ZN6VectorI6StringE4backEv
- 0xc010d726 0x19 Library/String.class.o
- 0xc010d726 Vector<String>::back()
+ 0xc010fef2 0x19 Library/String.class.o
+ 0xc010fef2 Vector<String>::back()
+
+.text._ZN6VectorIP11BlockDeviceEC1Ev
+ 0xc010ff0c 0x18 load address 0x0010ff0c
+ .text._ZN6VectorIP11BlockDeviceEC1Ev
+ 0xc010ff0c 0x18 VFS/Part.ns.o
+ 0xc010ff0c Vector<BlockDevice*>::Vector()
+
+.text._ZN6VectorIP9PartitionEC1Ev
+ 0xc010ff24 0x18 load address 0x0010ff24
+ .text._ZN6VectorIP9PartitionEC1Ev
+ 0xc010ff24 0x18 VFS/Part.ns.o
+ 0xc010ff24 Vector<Partition*>::Vector()
+
+.text._ZN6VectorIP9PartitionE4pushES1_
+ 0xc010ff3c 0x91 load address 0x0010ff3c
+ .text._ZN6VectorIP9PartitionE4pushES1_
+ 0xc010ff3c 0x91 VFS/Part.ns.o
+ 0xc010ff3c Vector<Partition*>::push(Partition*)
+
+.text._ZN6VectorIP11BlockDeviceE4pushES1_
+ 0xc010ffce 0x91 load address 0x0010ffce
+ .text._ZN6VectorIP11BlockDeviceE4pushES1_
+ 0xc010ffce 0x91 VFS/Part.ns.o
+ 0xc010ffce Vector<BlockDevice*>::push(BlockDevice*)
+
+.text._ZN6VectorIP9PartitionE4backEv
+ 0xc0110060 0x19 load address 0x00110060
+ .text._ZN6VectorIP9PartitionE4backEv
+ 0xc0110060 0x19 VFS/Part.ns.o
+ 0xc0110060 Vector<Partition*>::back()
+
+.text._ZN6VectorIP9PartitionE3popEv
+ 0xc011007a 0x6d load address 0x0011007a
+ .text._ZN6VectorIP9PartitionE3popEv
+ 0xc011007a 0x6d VFS/Part.ns.o
+ 0xc011007a Vector<Partition*>::pop()
+
+.text._ZN6VectorIP11BlockDeviceE5emptyEv
+ 0xc01100e8 0x10 load address 0x001100e8
+ .text._ZN6VectorIP11BlockDeviceE5emptyEv
+ 0xc01100e8 0x10 VFS/Part.ns.o
+ 0xc01100e8 Vector<BlockDevice*>::empty()
+
+.text._ZN6VectorIP11BlockDeviceE4backEv
+ 0xc01100f8 0x19 load address 0x001100f8
+ .text._ZN6VectorIP11BlockDeviceE4backEv
+ 0xc01100f8 0x19 VFS/Part.ns.o
+ 0xc01100f8 Vector<BlockDevice*>::back()
+
+.text._ZN6VectorIP11BlockDeviceE3popEv
+ 0xc0110112 0x6d load address 0x00110112
+ .text._ZN6VectorIP11BlockDeviceE3popEv
+ 0xc0110112 0x6d VFS/Part.ns.o
+ 0xc0110112 Vector<BlockDevice*>::pop()
+
+.text._ZN6VectorIP11BlockDeviceED1Ev
+ 0xc0110180 0x27 load address 0x00110180
+ .text._ZN6VectorIP11BlockDeviceED1Ev
+ 0xc0110180 0x27 VFS/Part.ns.o
+ 0xc0110180 Vector<BlockDevice*>::~Vector()
+
+.text._ZN6VectorIP9PartitionED1Ev
+ 0xc01101a8 0x27 load address 0x001101a8
+ .text._ZN6VectorIP9PartitionED1Ev
+ 0xc01101a8 0x27 VFS/Part.ns.o
+ 0xc01101a8 Vector<Partition*>::~Vector()
.text._ZN8KeyboardC2Ev
- 0xc010d740 0x1c load address 0x0010d740
+ 0xc01101d0 0x1c load address 0x001101d0
.text._ZN8KeyboardC2Ev
- 0xc010d740 0x1c Devices/Keyboard/PS2Keyboard.class.o
- 0xc010d740 Keyboard::Keyboard()
-
-.rodata 0xc010e000 0xc76 load address 0x0010e000
+ 0xc01101d0 0x1c Devices/Keyboard/PS2Keyboard.class.o
+ 0xc01101d0 Keyboard::Keyboard()
+
+.text._ZN11BlockDevice8chsToLBAEjjj
+ 0xc01101ec 0xf load address 0x001101ec
+ .text._ZN11BlockDevice8chsToLBAEjjj
+ 0xc01101ec 0xf Devices/Floppy/FloppyDrive.class.o
+ 0xc01101ec BlockDevice::chsToLBA(unsigned int, unsigned int, unsigned int)
+
+.text._ZN11BlockDeviceC2Ev
+ 0xc01101fc 0x1c load address 0x001101fc
+ .text._ZN11BlockDeviceC2Ev
+ 0xc01101fc 0x1c Devices/Floppy/FloppyDrive.class.o
+ 0xc01101fc BlockDevice::BlockDevice()
+
+.rodata 0xc0111000 0xe07 load address 0x00111000
*(.rodata)
- .rodata 0xc010e000 0x6c2 Core/kmain.wtf.o
- .rodata 0xc010e6c2 0x4f Core/Sys.ns.o
- .rodata 0xc010e711 0x5c MemoryManager/PhysMem.ns.o
- *fill* 0xc010e76d 0x3 00
- .rodata 0xc010e770 0x6f MemoryManager/PageAlloc.ns.o
- .rodata 0xc010e7df 0x9 DeviceManager/Kbd.ns.o
- .rodata 0xc010e7e8 0x3 VTManager/VirtualTerminal.class.o
- .rodata 0xc010e7eb 0x9 VTManager/VirtualTerminal-kbd.class.o
- .rodata 0xc010e7f4 0x5 Library/String.class.o
- .rodata 0xc010e7f9 0x1be Library/wchar.class.o
- *fill* 0xc010e9b7 0x9 00
- .rodata 0xc010e9c0 0x240 SyscallManager/IDT.ns.o
- .rodata 0xc010ec00 0x30 Devices/Display/VGATextOutput.class.o
- .rodata 0xc010ec30 0x23 Devices/Keyboard/PS2Keyboard.class.o
- .rodata 0xc010ec53 0x23 Devices/Timer.class.o
+ .rodata 0xc0111000 0x782 Core/kmain.wtf.o
+ .rodata 0xc0111782 0x4f Core/Sys.ns.o
+ .rodata 0xc01117d1 0x5c MemoryManager/PhysMem.ns.o
+ *fill* 0xc011182d 0x3 00
+ .rodata 0xc0111830 0x6f MemoryManager/PageAlloc.ns.o
+ .rodata 0xc011189f 0x9 DeviceManager/Kbd.ns.o
+ .rodata 0xc01118a8 0x19 VTManager/VirtualTerminal.class.o
+ .rodata 0xc01118c1 0x9 VTManager/VirtualTerminal-kbd.class.o
+ .rodata 0xc01118ca 0x5 Library/String.class.o
+ .rodata 0xc01118cf 0x1be Library/wchar.class.o
+ *fill* 0xc0111a8d 0x13 00
+ .rodata 0xc0111aa0 0x240 SyscallManager/IDT.ns.o
+ .rodata 0xc0111ce0 0x30 Devices/Display/VGATextOutput.class.o
+ .rodata 0xc0111d10 0x23 Devices/Keyboard/PS2Keyboard.class.o
+ .rodata 0xc0111d33 0x39 Devices/Floppy/FloppyController.class.o
+ .rodata 0xc0111d6c 0x78 Devices/Floppy/FloppyDrive.class.o
+ .rodata 0xc0111de4 0x23 Devices/Timer.class.o
.rodata._ZTV7Display
- 0xc010ec80 0x28 load address 0x0010ec80
+ 0xc0111e20 0x28 load address 0x00111e20
.rodata._ZTV7Display
- 0xc010ec80 0x28 Core/kmain.wtf.o
- 0xc010ec80 vtable for Display
+ 0xc0111e20 0x28 Core/kmain.wtf.o
+ 0xc0111e20 vtable for Display
.rodata._ZTV6Device
- 0xc010eca8 0x14 load address 0x0010eca8
+ 0xc0111e48 0x14 load address 0x00111e48
.rodata._ZTV6Device
- 0xc010eca8 0x14 Core/kmain.wtf.o
- 0xc010eca8 vtable for Device
+ 0xc0111e48 0x14 Core/kmain.wtf.o
+ 0xc0111e48 vtable for Device
.rodata._ZTV13VGATextOutput
- 0xc010ecc0 0x28 load address 0x0010ecc0
+ 0xc0111e60 0x28 load address 0x00111e60
.rodata._ZTV13VGATextOutput
- 0xc010ecc0 0x28 Devices/Display/VGATextOutput.class.o
- 0xc010ecc0 vtable for VGATextOutput
+ 0xc0111e60 0x28 Devices/Display/VGATextOutput.class.o
+ 0xc0111e60 vtable for VGATextOutput
.rodata._ZTV11PS2Keyboard
- 0xc010ece8 0x18 load address 0x0010ece8
+ 0xc0111e88 0x18 load address 0x00111e88
.rodata._ZTV11PS2Keyboard
- 0xc010ece8 0x18 Devices/Keyboard/PS2Keyboard.class.o
- 0xc010ece8 vtable for PS2Keyboard
+ 0xc0111e88 0x18 Devices/Keyboard/PS2Keyboard.class.o
+ 0xc0111e88 vtable for PS2Keyboard
.rodata._ZTV8Keyboard
- 0xc010ed00 0x18 load address 0x0010ed00
+ 0xc0111ea0 0x18 load address 0x00111ea0
.rodata._ZTV8Keyboard
- 0xc010ed00 0x18 Devices/Keyboard/PS2Keyboard.class.o
- 0xc010ed00 vtable for Keyboard
+ 0xc0111ea0 0x18 Devices/Keyboard/PS2Keyboard.class.o
+ 0xc0111ea0 vtable for Keyboard
+
+.rodata._ZTV16FloppyController
+ 0xc0111eb8 0x14 load address 0x00111eb8
+ .rodata._ZTV16FloppyController
+ 0xc0111eb8 0x14 Devices/Floppy/FloppyController.class.o
+ 0xc0111eb8 vtable for FloppyController
+
+.rodata._ZTV11FloppyDrive
+ 0xc0111ee0 0x2c load address 0x00111ee0
+ .rodata._ZTV11FloppyDrive
+ 0xc0111ee0 0x2c Devices/Floppy/FloppyDrive.class.o
+ 0xc0111ee0 vtable for FloppyDrive
+
+.rodata._ZTV11BlockDevice
+ 0xc0111f20 0x2c load address 0x00111f20
+ .rodata._ZTV11BlockDevice
+ 0xc0111f20 0x2c Devices/Floppy/FloppyDrive.class.o
+ 0xc0111f20 vtable for BlockDevice
.rodata._ZTV5Timer
- 0xc010ed18 0x14 load address 0x0010ed18
+ 0xc0111f50 0x14 load address 0x00111f50
.rodata._ZTV5Timer
- 0xc010ed18 0x14 Devices/Timer.class.o
- 0xc010ed18 vtable for Timer
+ 0xc0111f50 0x14 Devices/Timer.class.o
+ 0xc0111f50 vtable for Timer
-.rel.dyn 0xc010ed2c 0x0 load address 0x0010ed2c
+.rel.dyn 0xc0111f64 0x0 load address 0x00111f64
.rel.text 0x00000000 0x0 Core/loader.wtf.o
.rel.text._Znwj
0x00000000 0x0 Core/loader.wtf.o
@@ -1028,143 +1272,174 @@ Linker script and memory map
0x00000000 0x0 Core/loader.wtf.o
.rel.text._ZN6VectorI6StringE4pushES0_
0x00000000 0x0 Core/loader.wtf.o
+ .rel.text._ZN6VectorIP9PartitionE4pushES1_
+ 0x00000000 0x0 Core/loader.wtf.o
+ .rel.text._ZN6VectorIP11BlockDeviceE4pushES1_
+ 0x00000000 0x0 Core/loader.wtf.o
+ .rel.text._ZN6VectorIP11BlockDeviceED1Ev
+ 0x00000000 0x0 Core/loader.wtf.o
+ .rel.text._ZN6VectorIP9PartitionED1Ev
+ 0x00000000 0x0 Core/loader.wtf.o
.rel.rodata._ZTV13VGATextOutput
0x00000000 0x0 Core/loader.wtf.o
.rel.text._ZN8KeyboardC2Ev
0x00000000 0x0 Core/loader.wtf.o
.rel.rodata._ZTV8Keyboard
0x00000000 0x0 Core/loader.wtf.o
+ .rel.rodata._ZTV16FloppyController
+ 0x00000000 0x0 Core/loader.wtf.o
+ .rel.text._ZN11BlockDeviceC2Ev
+ 0x00000000 0x0 Core/loader.wtf.o
+ .rel.rodata._ZTV11FloppyDrive
+ 0x00000000 0x0 Core/loader.wtf.o
+ .rel.rodata._ZTV11BlockDevice
+ 0x00000000 0x0 Core/loader.wtf.o
-.data 0xc010f000 0x144 load address 0x0010f000
- 0xc010f000 start_ctors = .
+.data 0xc0112000 0x144 load address 0x00112000
+ 0xc0112000 start_ctors = .
*(.ctor*)
- .ctors 0xc010f000 0x4 Core/kmain.wtf.o
- .ctors 0xc010f004 0x4 DeviceManager/Dev.ns.o
- .ctors 0xc010f008 0x4 TaskManager/Task.ns.o
- .ctors 0xc010f00c 0x4 VTManager/VT.ns.o
- .ctors 0xc010f010 0x4 Library/wchar.class.o
- 0xc010f014 end_ctors = .
- 0xc010f014 start_dtors = .
+ .ctors 0xc0112000 0x4 Core/kmain.wtf.o
+ .ctors 0xc0112004 0x4 DeviceManager/Dev.ns.o
+ .ctors 0xc0112008 0x4 TaskManager/Task.ns.o
+ .ctors 0xc011200c 0x4 VTManager/VT.ns.o
+ .ctors 0xc0112010 0x4 Library/wchar.class.o
+ .ctors 0xc0112014 0x4 VFS/Part.ns.o
+ .ctors 0xc0112018 0x4 Devices/Floppy/FloppyController.class.o
+ 0xc011201c end_ctors = .
+ 0xc011201c start_dtors = .
*(.dtor*)
- 0xc010f014 end_dtors = .
+ 0xc011201c end_dtors = .
*(.data)
- .data 0xc010f014 0x24 Core/kmain.wtf.o
- 0xc010f034 melonLogoCols
- 0xc010f014 melonLogo
- 0xc010f030 melonLogoLines
- .data 0xc010f038 0x0 Core/cppsupport.wtf.o
- .data 0xc010f038 0x0 Core/Sys.ns.o
- .data 0xc010f038 0x0 Core/CMem.ns.o
- .data 0xc010f038 0x0 MemoryManager/Mem.ns.o
- .data 0xc010f038 0x0 MemoryManager/PhysMem.ns.o
- .data 0xc010f038 0x0 MemoryManager/GDT.ns.o
- .data 0xc010f038 0x0 MemoryManager/PageDirectory.class.o
- .data 0xc010f038 0x0 MemoryManager/PageAlloc.ns.o
- .data 0xc010f038 0x0 DeviceManager/Disp.ns.o
- .data 0xc010f038 0x0 DeviceManager/Dev.ns.o
- .data 0xc010f038 0x0 DeviceManager/Time.ns.o
- *fill* 0xc010f038 0x8 00
- .data 0xc010f040 0x100 DeviceManager/Kbd.ns.o
- 0xc010f040 Kbd::ctrlkeys
- .data 0xc010f140 0x0 TaskManager/Process.class.o
- .data 0xc010f140 0x0 TaskManager/Thread.class.o
- .data 0xc010f140 0x4 TaskManager/Task.ns.o
- 0xc010f140 Task::nextpid
- .data 0xc010f144 0x0 TaskManager/Mutex.class.o
- .data 0xc010f144 0x0 VTManager/VirtualTerminal.class.o
- .data 0xc010f144 0x0 VTManager/VirtualTerminal-kbd.class.o
- .data 0xc010f144 0x0 VTManager/VT.ns.o
- .data 0xc010f144 0x0 Library/Bitset.class.o
- .data 0xc010f144 0x0 Library/String.class.o
- .data 0xc010f144 0x0 Library/wchar.class.o
- .data 0xc010f144 0x0 SyscallManager/IDT.ns.o
- .data 0xc010f144 0x0 Devices/Display/VGATextOutput.class.o
- .data 0xc010f144 0x0 Devices/Keyboard/PS2Keyboard.class.o
- .data 0xc010f144 0x0 Devices/Timer.class.o
-
-.bss 0xc010f160 0x5368 load address 0x0010f160
- 0xc010f160 sbss = .
+ .data 0xc011201c 0x24 Core/kmain.wtf.o
+ 0xc011203c melonLogoCols
+ 0xc011201c melonLogo
+ 0xc0112038 melonLogoLines
+ .data 0xc0112040 0x0 Core/cppsupport.wtf.o
+ .data 0xc0112040 0x0 Core/Sys.ns.o
+ .data 0xc0112040 0x0 Core/CMem.ns.o
+ .data 0xc0112040 0x0 MemoryManager/Mem.ns.o
+ .data 0xc0112040 0x0 MemoryManager/PhysMem.ns.o
+ .data 0xc0112040 0x0 MemoryManager/GDT.ns.o
+ .data 0xc0112040 0x0 MemoryManager/PageDirectory.class.o
+ .data 0xc0112040 0x0 MemoryManager/PageAlloc.ns.o
+ .data 0xc0112040 0x0 DeviceManager/Disp.ns.o
+ .data 0xc0112040 0x0 DeviceManager/Dev.ns.o
+ .data 0xc0112040 0x0 DeviceManager/Time.ns.o
+ .data 0xc0112040 0x100 DeviceManager/Kbd.ns.o
+ 0xc0112040 Kbd::ctrlkeys
+ .data 0xc0112140 0x0 TaskManager/Process.class.o
+ .data 0xc0112140 0x0 TaskManager/Thread.class.o
+ .data 0xc0112140 0x4 TaskManager/Task.ns.o
+ 0xc0112140 Task::nextpid
+ .data 0xc0112144 0x0 TaskManager/Mutex.class.o
+ .data 0xc0112144 0x0 VTManager/VirtualTerminal.class.o
+ .data 0xc0112144 0x0 VTManager/VirtualTerminal-kbd.class.o
+ .data 0xc0112144 0x0 VTManager/VT.ns.o
+ .data 0xc0112144 0x0 Library/Bitset.class.o
+ .data 0xc0112144 0x0 Library/String.class.o
+ .data 0xc0112144 0x0 Library/wchar.class.o
+ .data 0xc0112144 0x0 VFS/Partition.class.o
+ .data 0xc0112144 0x0 VFS/Part.ns.o
+ .data 0xc0112144 0x0 SyscallManager/IDT.ns.o
+ .data 0xc0112144 0x0 Devices/Display/VGATextOutput.class.o
+ .data 0xc0112144 0x0 Devices/Keyboard/PS2Keyboard.class.o
+ .data 0xc0112144 0x0 Devices/Floppy/FloppyController.class.o
+ .data 0xc0112144 0x0 Devices/Floppy/FloppyDrive.class.o
+ .data 0xc0112144 0x0 Devices/Timer.class.o
+
+.bss 0xc0118000 0x14800 load address 0x00118000
+ 0xc0118000 sbss = .
*(COMMON)
*(.bss)
- .bss 0xc010f160 0x4000 Core/loader.wtf.o
- .bss 0xc0113160 0x800 Core/kmain.wtf.o
- 0xc0113760 keymapFR_shiftaltgr
- 0xc0113160 keymapFR_normal
- 0xc0113560 keymapFR_altgr
- 0xc0113360 keymapFR_shift
- .bss 0xc0113960 0x4 Core/cppsupport.wtf.o
- 0xc0113960 __dso_handle
- .bss 0xc0113964 0x0 Core/Sys.ns.o
- .bss 0xc0113964 0x0 Core/CMem.ns.o
- .bss 0xc0113964 0x1c MemoryManager/Mem.ns.o
- 0xc0113978 Mem::heapStart
- 0xc0113965 Mem::pagingEnabled
- 0xc011396c Mem::kheapFree
- 0xc011397c Mem::heapEnd
- 0xc0113964 Mem::kheapUsable
- 0xc0113968 Mem::placementAddress
- 0xc0113970 Mem::heapIndex
- .bss 0xc0113980 0xc MemoryManager/PhysMem.ns.o
- 0xc0113980 kernelPageDirectory
- 0xc0113988 PhysMem::frames
- 0xc0113984 PhysMem::nframes
- *fill* 0xc011398c 0x14 00
- .bss 0xc01139a0 0x2e MemoryManager/GDT.ns.o
- 0xc01139c8 GDT::gdt_ptr
- 0xc01139a0 GDT::gdt_entries
- *fill* 0xc01139ce 0x2 00
- .bss 0xc01139d0 0x0 MemoryManager/PageDirectory.class.o
- .bss 0xc01139d0 0x12 MemoryManager/PageAlloc.ns.o
- 0xc01139e0 PageAlloc::usable
- 0xc01139d0 PageAlloc::freePage
- 0xc01139dc PageAlloc::freec
- 0xc01139e1 PageAlloc::locked
- *fill* 0xc01139e2 0x2 00
- .bss 0xc01139e4 0xc DeviceManager/Disp.ns.o
- 0xc01139e4 Disp::mode
- *fill* 0xc01139f0 0x10 00
- .bss 0xc0113a00 0x60 DeviceManager/Dev.ns.o
- 0xc0113a00 Dev::devices
- 0xc0113a20 Dev::irqHandler
- .bss 0xc0113a60 0x4 DeviceManager/Time.ns.o
- 0xc0113a60 Time::timer
- .bss 0xc0113a64 0x18 DeviceManager/Kbd.ns.o
- 0xc0113a6c Kbd::keymapAltgr
- 0xc0113a74 Kbd::kbdstatus
- 0xc0113a78 Kbd::focusedVT
- 0xc0113a68 Kbd::keymapShift
- 0xc0113a64 Kbd::keymapNormal
- 0xc0113a70 Kbd::keymapShiftAltgr
- .bss 0xc0113a7c 0x0 TaskManager/Process.class.o
- .bss 0xc0113a7c 0x0 TaskManager/Thread.class.o
- .bss 0xc0113a7c 0x20 TaskManager/Task.ns.o
- 0xc0113a7c Task::processes
- 0xc0113a8c Task::currentThread
- 0xc0113a94 Task::idleThread
- 0xc0113a98 Task::currentThreadId
- 0xc0113a84 Task::threads
- 0xc0113a90 Task::currentProcess
- .bss 0xc0113a9c 0x0 TaskManager/Mutex.class.o
- .bss 0xc0113a9c 0x0 VTManager/VirtualTerminal.class.o
- .bss 0xc0113a9c 0x0 VTManager/VirtualTerminal-kbd.class.o
- .bss 0xc0113a9c 0x8 VTManager/VT.ns.o
- 0xc0113a9c VT::mappedVTs
- .bss 0xc0113aa4 0x0 Library/Bitset.class.o
- .bss 0xc0113aa4 0x0 Library/String.class.o
- *fill* 0xc0113aa4 0x1c 00
- .bss 0xc0113ac0 0x200 Library/wchar.class.o
- 0xc0113ac0 wchar::CP437
- .bss 0xc0113cc0 0x806 SyscallManager/IDT.ns.o
- 0xc0113cc0 IDT::idt_entries
- 0xc01144c0 IDT::idt_ptr
- *fill* 0xc01144c6 0x2 00
- .bss 0xc01144c8 0x0 Devices/Display/VGATextOutput.class.o
- .bss 0xc01144c8 0x0 Devices/Keyboard/PS2Keyboard.class.o
- .bss 0xc01144c8 0x0 Devices/Timer.class.o
- 0xc01144c8 ebss = .
- 0xc01144c8 end = .
- 0xc01144c8 _end = .
- 0xc01144c8 __end = .
+ .bss 0xc0118000 0x4000 Core/loader.wtf.o
+ .bss 0xc011c000 0x800 Core/kmain.wtf.o
+ 0xc011c600 keymapFR_shiftaltgr
+ 0xc011c000 keymapFR_normal
+ 0xc011c400 keymapFR_altgr
+ 0xc011c200 keymapFR_shift
+ .bss 0xc011c800 0x4 Core/cppsupport.wtf.o
+ 0xc011c800 __dso_handle
+ .bss 0xc011c804 0x0 Core/Sys.ns.o
+ .bss 0xc011c804 0x0 Core/CMem.ns.o
+ .bss 0xc011c804 0x1c MemoryManager/Mem.ns.o
+ 0xc011c818 Mem::heapStart
+ 0xc011c805 Mem::pagingEnabled
+ 0xc011c80c Mem::kheapFree
+ 0xc011c81c Mem::heapEnd
+ 0xc011c804 Mem::kheapUsable
+ 0xc011c808 Mem::placementAddress
+ 0xc011c810 Mem::heapIndex
+ .bss 0xc011c820 0xc MemoryManager/PhysMem.ns.o
+ 0xc011c820 kernelPageDirectory
+ 0xc011c828 PhysMem::frames
+ 0xc011c824 PhysMem::nframes
+ *fill* 0xc011c82c 0x14 00
+ .bss 0xc011c840 0x2e MemoryManager/GDT.ns.o
+ 0xc011c868 GDT::gdt_ptr
+ 0xc011c840 GDT::gdt_entries
+ *fill* 0xc011c86e 0x2 00
+ .bss 0xc011c870 0x0 MemoryManager/PageDirectory.class.o
+ .bss 0xc011c870 0x12 MemoryManager/PageAlloc.ns.o
+ 0xc011c880 PageAlloc::usable
+ 0xc011c870 PageAlloc::freePage
+ 0xc011c87c PageAlloc::freec
+ 0xc011c881 PageAlloc::locked
+ *fill* 0xc011c882 0x2 00
+ .bss 0xc011c884 0xc DeviceManager/Disp.ns.o
+ 0xc011c884 Disp::mode
+ *fill* 0xc011c890 0x10 00
+ .bss 0xc011c8a0 0x60 DeviceManager/Dev.ns.o
+ 0xc011c8a0 Dev::devices
+ 0xc011c8c0 Dev::irqHandler
+ .bss 0xc011c900 0x4 DeviceManager/Time.ns.o
+ 0xc011c900 Time::timer
+ .bss 0xc011c904 0x18 DeviceManager/Kbd.ns.o
+ 0xc011c90c Kbd::keymapAltgr
+ 0xc011c914 Kbd::kbdstatus
+ 0xc011c918 Kbd::focusedVT
+ 0xc011c908 Kbd::keymapShift
+ 0xc011c904 Kbd::keymapNormal
+ 0xc011c910 Kbd::keymapShiftAltgr
+ .bss 0xc011c91c 0x0 TaskManager/Process.class.o
+ .bss 0xc011c91c 0x0 TaskManager/Thread.class.o
+ .bss 0xc011c91c 0x20 TaskManager/Task.ns.o
+ 0xc011c91c Task::processes
+ 0xc011c92c Task::currentThread
+ 0xc011c934 Task::idleThread
+ 0xc011c938 Task::currentThreadId
+ 0xc011c924 Task::threads
+ 0xc011c930 Task::currentProcess
+ .bss 0xc011c93c 0x0 TaskManager/Mutex.class.o
+ .bss 0xc011c93c 0x0 VTManager/VirtualTerminal.class.o
+ .bss 0xc011c93c 0x0 VTManager/VirtualTerminal-kbd.class.o
+ .bss 0xc011c93c 0x8 VTManager/VT.ns.o
+ 0xc011c93c VT::mappedVTs
+ .bss 0xc011c944 0x0 Library/Bitset.class.o
+ .bss 0xc011c944 0x0 Library/String.class.o
+ *fill* 0xc011c944 0x1c 00
+ .bss 0xc011c960 0x200 Library/wchar.class.o
+ 0xc011c960 wchar::CP437
+ .bss 0xc011cb60 0x0 VFS/Partition.class.o
+ .bss 0xc011cb60 0x10 VFS/Part.ns.o
+ 0xc011cb68 Part::partitions
+ 0xc011cb60 Part::devices
+ *fill* 0xc011cb70 0x10 00
+ .bss 0xc011cb80 0x806 SyscallManager/IDT.ns.o
+ 0xc011cb80 IDT::idt_entries
+ 0xc011d380 IDT::idt_ptr
+ *fill* 0xc011d386 0x2 00
+ .bss 0xc011d388 0x0 Devices/Display/VGATextOutput.class.o
+ .bss 0xc011d388 0x0 Devices/Keyboard/PS2Keyboard.class.o
+ *fill* 0xc011d388 0x2c78 00
+ .bss 0xc0120000 0xc800 Devices/Floppy/FloppyController.class.o
+ 0xc0120000 FloppyController::dmaMutex
+ 0xc0128000 FloppyController::dmabuff
+ .bss 0xc012c800 0x0 Devices/Floppy/FloppyDrive.class.o
+ .bss 0xc012c800 0x0 Devices/Timer.class.o
+ 0xc012c800 ebss = .
+ 0xc012c800 end = .
+ 0xc012c800 _end = .
+ 0xc012c800 __end = .
LOAD Core/loader.wtf.o
LOAD Core/kmain.wtf.o
LOAD Core/cppsupport.wtf.o
@@ -1191,14 +1466,18 @@ LOAD VTManager/VT.ns.o
LOAD Library/Bitset.class.o
LOAD Library/String.class.o
LOAD Library/wchar.class.o
+LOAD VFS/Partition.class.o
+LOAD VFS/Part.ns.o
LOAD SyscallManager/IDT.ns.o
LOAD SyscallManager/IDT.wtf.o
LOAD Devices/Display/VGATextOutput.class.o
LOAD Devices/Keyboard/PS2Keyboard.class.o
+LOAD Devices/Floppy/FloppyController.class.o
+LOAD Devices/Floppy/FloppyDrive.class.o
LOAD Devices/Timer.class.o
OUTPUT(Melon.ke elf32-i386)
-.comment 0x00000000 0x262
+.comment 0x00000000 0x2aa
.comment 0x00000000 0x1f Core/loader.wtf.o
.comment 0x0000001f 0x12 Core/kmain.wtf.o
.comment 0x00000031 0x12 Core/cppsupport.wtf.o
@@ -1225,11 +1504,15 @@ OUTPUT(Melon.ke elf32-i386)
.comment 0x000001c5 0x12 Library/Bitset.class.o
.comment 0x000001d7 0x12 Library/String.class.o
.comment 0x000001e9 0x12 Library/wchar.class.o
- .comment 0x000001fb 0x12 SyscallManager/IDT.ns.o
- .comment 0x0000020d 0x1f SyscallManager/IDT.wtf.o
- .comment 0x0000022c 0x12 Devices/Display/VGATextOutput.class.o
- .comment 0x0000023e 0x12 Devices/Keyboard/PS2Keyboard.class.o
- .comment 0x00000250 0x12 Devices/Timer.class.o
+ .comment 0x000001fb 0x12 VFS/Partition.class.o
+ .comment 0x0000020d 0x12 VFS/Part.ns.o
+ .comment 0x0000021f 0x12 SyscallManager/IDT.ns.o
+ .comment 0x00000231 0x1f SyscallManager/IDT.wtf.o
+ .comment 0x00000250 0x12 Devices/Display/VGATextOutput.class.o
+ .comment 0x00000262 0x12 Devices/Keyboard/PS2Keyboard.class.o
+ .comment 0x00000274 0x12 Devices/Floppy/FloppyController.class.o
+ .comment 0x00000286 0x12 Devices/Floppy/FloppyDrive.class.o
+ .comment 0x00000298 0x12 Devices/Timer.class.o
.note.GNU-stack
0x00000000 0x0
@@ -1280,10 +1563,18 @@ OUTPUT(Melon.ke elf32-i386)
.note.GNU-stack
0x00000000 0x0 Library/wchar.class.o
.note.GNU-stack
+ 0x00000000 0x0 VFS/Partition.class.o
+ .note.GNU-stack
+ 0x00000000 0x0 VFS/Part.ns.o
+ .note.GNU-stack
0x00000000 0x0 SyscallManager/IDT.ns.o
.note.GNU-stack
0x00000000 0x0 Devices/Display/VGATextOutput.class.o
.note.GNU-stack
0x00000000 0x0 Devices/Keyboard/PS2Keyboard.class.o
.note.GNU-stack
+ 0x00000000 0x0 Devices/Floppy/FloppyController.class.o
+ .note.GNU-stack
+ 0x00000000 0x0 Devices/Floppy/FloppyDrive.class.o
+ .note.GNU-stack
0x00000000 0x0 Devices/Timer.class.o
diff --git a/Source/Kernel/Melon.ke b/Source/Kernel/Melon.ke
index e3ce11d..e5468b7 100755
--- a/Source/Kernel/Melon.ke
+++ b/Source/Kernel/Melon.ke
Binary files differ
diff --git a/Source/Kernel/Ressources/keymap-fr.wtf.c b/Source/Kernel/Ressources/keymap-fr.wtf.c
index da22dfb..0662b85 100644
--- a/Source/Kernel/Ressources/keymap-fr.wtf.c
+++ b/Source/Kernel/Ressources/keymap-fr.wtf.c
@@ -33,7 +33,7 @@ wchar keymapFR_altgr[128] = {
/* 0x70 */ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
};
-wchar keymapFR_shiftaltgr[128] = { //TODO
+wchar keymapFR_shiftaltgr[128] = {
/* 0x00 */ "", "", "¡", "⅛", "£", "$", "⅜", "⅝", "⅞", "™", "±", "°", "¿", "˛", "", "",
/* 0x10 */ "Æ", "<", "¢", "®", "Ŧ", "¥", "↑", "ı", "Ø", "Þ", "°", "¯", "", "", "Ω", "§",
/* 0x20 */ "Ð", "ª", "Ŋ", "Ħ", "J", "&", "Ł", "º", "ˇ", "¬", "", "˘", "Ł", ">", "©", "‘",
diff --git a/Source/Kernel/VFS/.Part.ns.cpp.swp b/Source/Kernel/VFS/.Part.ns.cpp.swp
new file mode 100644
index 0000000..3b639ab
--- /dev/null
+++ b/Source/Kernel/VFS/.Part.ns.cpp.swp
Binary files differ
diff --git a/Source/Kernel/VFS/Part.ns.cpp b/Source/Kernel/VFS/Part.ns.cpp
new file mode 100644
index 0000000..6408dbd
--- /dev/null
+++ b/Source/Kernel/VFS/Part.ns.cpp
@@ -0,0 +1,59 @@
+#include "Part.ns.h"
+
+namespace Part {
+
+Vector<BlockDevice*> devices;
+Vector<Partition*> partitions;
+
+void readPartitionTable(BlockDevice *dev) { //TODO : read partition table from device
+ partitions.push(new Partition(dev, 0, 0, dev->blocks())); //Insert whole device as a partition
+}
+
+void registerDevice(BlockDevice *dev) {
+ unregisterDevice(dev);
+
+ asm volatile("cli");
+
+ readPartitionTable(dev);
+
+ bool inserted = false;
+ for (u32int i = 0; i < devices.size(); i++) {
+ if (devices[i] == 0) {
+ devices[i] = dev;
+ inserted = true;
+ break;
+ }
+ }
+ if (!inserted) devices.push(dev);
+
+ asm volatile("sti");
+}
+
+void unregisterDevice(BlockDevice *dev) {
+ asm volatile("cli");
+ //Unregister && delete partitions
+ for (u32int i = 0; i < partitions.size(); i++) {
+ if (partitions[i]->getDevice() == dev) {
+ delete partitions[i];
+ partitions[i] = partitions.back();
+ partitions.pop();
+ i--;
+ }
+ }
+ //Unregister device
+ for (u32int i = 0; i < devices.size(); i++) {
+ if (devices[i] == dev) devices[i] = 0;
+ }
+ if (!devices.empty() && devices.back() == 0) devices.pop();
+
+ asm volatile("sti");
+}
+
+u32int getDeviceID(BlockDevice* dev) {
+ for (u32int i = 0; i < devices.size(); i++) {
+ if (devices[i] == dev) return i;
+ }
+ return (u32int) - 1;
+}
+
+}
diff --git a/Source/Kernel/VFS/Part.ns.h b/Source/Kernel/VFS/Part.ns.h
new file mode 100644
index 0000000..07a45f9
--- /dev/null
+++ b/Source/Kernel/VFS/Part.ns.h
@@ -0,0 +1,18 @@
+#ifndef DEF_PART_NS_H
+#define DEF_PART_NS_H
+
+#include <Devices/BlockDevice.proto.h>
+#include <Library/Vector.class.h>
+#include <VFS/Partition.class.h>
+
+namespace Part {
+ extern Vector<BlockDevice*> devices;
+ extern Vector<Partition*> partitions;
+
+ void registerDevice(BlockDevice* dev);
+ void unregisterDevice(BlockDevice* dev);
+
+ u32int getDeviceID(BlockDevice* dev);
+}
+
+#endif
diff --git a/Source/Kernel/VFS/Partition.class.cpp b/Source/Kernel/VFS/Partition.class.cpp
new file mode 100644
index 0000000..0c7832b
--- /dev/null
+++ b/Source/Kernel/VFS/Partition.class.cpp
@@ -0,0 +1,25 @@
+#include "Partition.class.h"
+
+Partition::Partition(BlockDevice* dev, u8int partnumber, u64int startblock, u64int blockcount) {
+ m_device = dev;
+ m_partnumber = partnumber;
+ m_startblock = startblock;
+ m_blockcount = blockcount;
+}
+
+bool Partition::readBlocks(u64int startblock, u32int count, u8int *data) {
+ if (startblock + count > m_startblock + m_blockcount) return false;
+ return m_device->readBlocks(startblock - m_startblock, count, data);
+}
+
+bool Partition::writeBlocks(u64int startblock, u32int count, u8int *data) {
+ if (startblock + count > m_startblock + m_blockcount) return false;
+ return m_device->writeBlocks(startblock - m_startblock, count, data);
+}
+
+//Accessors
+BlockDevice* Partition::getDevice() { return m_device; }
+u64int Partition::getStartBlock() { return m_startblock; }
+u64int Partition::getBlockCount() { return m_blockcount; }
+u8int Partition::getPartNumber() { return m_partnumber; }
+u32int Partition::getBlockSize() { return m_device->blockSize(); }
diff --git a/Source/Kernel/VFS/Partition.class.h b/Source/Kernel/VFS/Partition.class.h
new file mode 100644
index 0000000..e9087bf
--- /dev/null
+++ b/Source/Kernel/VFS/Partition.class.h
@@ -0,0 +1,28 @@
+#ifndef DEF_PARTITION_CLASS_H
+#define DEF_PARTITION_CLASS_H
+
+#include <Devices/BlockDevice.proto.h>
+
+class Partition {
+ private:
+ BlockDevice* m_device;
+ u64int m_startblock, m_blockcount;
+ u8int m_partnumber; //Partition number in partition table of device
+
+ public:
+ Partition(BlockDevice* dev, u8int partnumber, u64int startblock, u64int blockcount);
+
+ bool readBlocks(u64int startblock, u32int count, u8int *data);
+ bool writeBlocks(u64int startblock, u32int count, u8int *data);
+
+ //Accessors :
+ BlockDevice* getDevice();
+ u64int getStartBlock();
+ u64int getBlockCount();
+ u8int getPartNumber();
+ u32int getBlockSize();
+ inline u64int blocks() { return getBlockCount(); }
+};
+
+#endif
+
diff --git a/Source/Kernel/VTManager/VirtualTerminal.class.cpp b/Source/Kernel/VTManager/VirtualTerminal.class.cpp
index 7864afd..4c0df95 100644
--- a/Source/Kernel/VTManager/VirtualTerminal.class.cpp
+++ b/Source/Kernel/VTManager/VirtualTerminal.class.cpp
@@ -158,6 +158,7 @@ void VirtualTerminal::writeDec(s32int i, bool updatecsr) {
}
void VirtualTerminal::writeHex(u32int i, bool updatecsr) {
+ if (m_cols < 60) return;
write("0x", false);
char hexdigits[] = "0123456789ABCDEF";
for (u32int j = 0; j < 8; j++) {
@@ -166,3 +167,30 @@ void VirtualTerminal::writeHex(u32int i, bool updatecsr) {
}
if (updatecsr) updateCursor();
}
+
+void VirtualTerminal::hexDump(u8int *ptr, u32int sz) {
+ if (m_cols < 76) return; //Not enough space
+ write("HEX Dump, from "); writeHex((u32int)ptr); write("\n");
+ char hexdigits[] = "0123456789ABCDEF";
+ for (u32int i = 0; i < sz; i += 16) {
+ writeHex(i);
+ write(" ");
+ for (u32int j = 0; j < 16; j++) {
+ u8int b = ptr[i + j];
+ if (j > 7) put(" ");
+ put(hexdigits[b >> 4]);
+ put(hexdigits[b & 0xF]);
+ if (j < 8) put(" ");
+ }
+ write(" ");
+ for (u32int j = 0; j < 16; j++) {
+ u8int b = ptr[i + j];
+ if (b >= 0x20 && b < 128) {
+ put(wchar(b));
+ } else {
+ put(".");
+ }
+ }
+ if (m_cols > 76) write("\n");
+ }
+}
diff --git a/Source/Kernel/VTManager/VirtualTerminal.class.h b/Source/Kernel/VTManager/VirtualTerminal.class.h
index 6a14080..4e5fe86 100644
--- a/Source/Kernel/VTManager/VirtualTerminal.class.h
+++ b/Source/Kernel/VTManager/VirtualTerminal.class.h
@@ -49,6 +49,8 @@ class VirtualTerminal {
void write(String s, bool updatecsr = true);
void writeDec(s32int i, bool updatecsr = true);
void writeHex(u32int i, bool updatecsr = true);
+
+ void hexDump(u8int* ptr, u32int sz);
inline VirtualTerminal& operator<<(String s) { write(s); return *this; }
//inline VirtualTerminal& operator<<(wchar c) { put(c); return *this; }