2023-03-21 01:03

working
Emanuele HF 3 months ago
parent 3caaeaeacc
commit ff3b9d472c

@ -40,7 +40,8 @@ run: hf-os
qemu-system-$(OS_ARCH) \
-no-reboot \
-m size=128M \
-drive file=/dev/sdb,format=raw,media=disk \
-drive file=/dev/disk/by-id/usb-Generic_Flash_Disk_C8BB4A9A-0:0,format=raw,media=disk \
-drive file=res/hd.bin,format=raw,media=disk \
-rtc base=localtime,clock=host \
-kernel $(BUILD_DIR)/hf-os.bin \
-append "$(VM_CMDLINE)"

@ -4,10 +4,10 @@
#include <arch/generic/interrupt.h>
#include <arch/i386/io.h>
#include <drivers/pci.h>
#include <fs/mbr.h>
#include <misc.h>
#include <utils/bit.h>
#include <utils/crc32.h>
#include <fs/mbr.h>
#define BASE_PRI_IO 0x1F0
#define BASE_PRI_CTRL 0x3F6
@ -125,7 +125,7 @@ void ata_init(uint8_t bus, uint8_t dev, uint8_t func, pci_config_t *p_config) {
return;
}
a_config.base_pri_io = p_config->bar[0] & 0xfffffffc;
a_config.base_pri_io = p_config->bar[0] & 0xfffffffc;
a_config.base_pri_ctrl = p_config->bar[1] & 0xfffffffc;
} else {
a_config.base_pri_io = BASE_PRI_IO;
@ -142,7 +142,7 @@ void ata_init(uint8_t bus, uint8_t dev, uint8_t func, pci_config_t *p_config) {
return;
}
a_config.base_sec_io = p_config->bar[2] & 0xfffffffc;
a_config.base_sec_io = p_config->bar[2] & 0xfffffffc;
a_config.base_sec_ctrl = p_config->bar[3] & 0xfffffffc;
} else {
a_config.base_sec_io = BASE_SEC_IO;
@ -163,18 +163,18 @@ void ata_init(uint8_t bus, uint8_t dev, uint8_t func, pci_config_t *p_config) {
PRINTK("ata: a_config.base_sec_ctrl = %#08x", a_config.base_sec_ctrl);
PRINTK("ata: a_config.base_busmaster = %#08x", a_config.base_busmaster);
PRINTK("ata: detecting devices");
ata_pio_detect(0);
// ata_pio_detect(1);
// ata_pio_detect(2);
// ata_pio_detect(3);
if (a_config.irq_pri != 0) {
irq_register(a_config.irq_pri, ata_irq_handler);
}
if (a_config.irq_sec != 0 && a_config.irq_pri != a_config.irq_sec) {
irq_register(a_config.irq_sec, ata_irq_handler);
}
PRINTK("ata: detecting devices");
ata_pio_detect(0);
ata_pio_detect(1);
// ata_pio_detect(2);
// ata_pio_detect(3);
}
void ata_exit(void) {
@ -229,13 +229,13 @@ static bool ata_pio_detect(uint8_t drive) {
" .magic = %04x\r\n"
"};",
header.disk_id, header.reserved,
header.partitions[0].flags, header.partitions[0].chs_start, header.partitions[0].type,
header.partitions[0].flags, header.partitions[0].chs_start, header.partitions[0].type,
header.partitions[0].chs_end, header.partitions[0].lba_start, header.partitions[0].num_sectors,
header.partitions[1].flags, header.partitions[1].chs_start, header.partitions[1].type,
header.partitions[1].flags, header.partitions[1].chs_start, header.partitions[1].type,
header.partitions[1].chs_end, header.partitions[1].lba_start, header.partitions[1].num_sectors,
header.partitions[2].flags, header.partitions[2].chs_start, header.partitions[2].type,
header.partitions[2].flags, header.partitions[2].chs_start, header.partitions[2].type,
header.partitions[2].chs_end, header.partitions[2].lba_start, header.partitions[2].num_sectors,
header.partitions[3].flags, header.partitions[3].chs_start, header.partitions[3].type,
header.partitions[3].flags, header.partitions[3].chs_start, header.partitions[3].type,
header.partitions[3].chs_end, header.partitions[3].lba_start, header.partitions[3].num_sectors,
header.magic
);

@ -14,6 +14,9 @@
#include <misc.h>
#include <syscall.h>
#define FD_TERM (0 << 12)
#define FD_DISK (1 << 12)
typedef long int ssize_t;
// typedef int mode_t;
@ -22,10 +25,10 @@ ssize_t sys_read(int fd, void *buf, size_t count) {
cb_t *cb = NULL;
switch (fd) {
case 0:
case FD_TERM | 0:
cb = &kb_cb;
break;
case 3:
case FD_TERM | 3:
cb = &serial_cb;
break;
default:
@ -44,9 +47,9 @@ ssize_t sys_read(int fd, void *buf, size_t count) {
ssize_t sys_write(int fd, const void *buf, size_t count) {
switch (fd) {
case 1:
case FD_TERM | 1:
return terminal_write(buf, count);
case 2:
case FD_TERM | 2:
return serial_write(1, buf, count);
}
@ -55,15 +58,24 @@ ssize_t sys_write(int fd, const void *buf, size_t count) {
int sys_open(const char *pathname, int flags /*, mode_t mode */) {
PRINTK("sys_open(%p, %#x, %%#x);", pathname, flags /*, mode */);
if (!strcmp(pathname, "/dev/stdin")) {
return 0;
return FD_TERM | 0;
}
if (!strcmp(pathname, "/dev/stdout")) {
return 1;
return FD_TERM | 1;
}
if (!strcmp(pathname, "/dev/stderr")) {
return 2;
return FD_TERM | 2;
}
if (!strcmp(pathname, "/dev/sda")) {
return FD_DISK | 0;
}
if (!strcmp(pathname, "/dev/sdb")) {
return FD_DISK | 1;
}
return -ENOENT;
}

Loading…
Cancel
Save