From 345ef6c9f3f68ea1e857890f538f3a2fbce14e5a Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 18 Aug 2005 22:00:00 -0400 Subject: [PATCH] Import backup from 2005-08-18 --- .bochsrc | 2 +- Makefile | 9 +- apps/Makefile | 2 + apps/test1.app | Bin 0 -> 33 bytes apps/test1.asm | 14 +++ apps/test2.app | Bin 0 -> 33 bytes apps/test2.asm | 14 +++ build.txt | 2 +- grub.flp | Bin 1474560 -> 1474560 bytes kernel/Makefile | 38 +++++--- kernel/Makefile.bak | 29 +++++-- kernel/fs/VFSMount.cpp | 3 +- kernel/fs/VFSMount.h | 6 +- kernel/fs/sysfs/sysfs.cpp | 44 ++++++++++ kernel/fs/sysfs/sysfs.h | 37 ++++++++ kernel/fs/sysfs/sysfs_entry.cpp | 22 +++++ kernel/fs/sysfs/sysfs_entry.h | 30 +++++++ kernel/fs/vfs.cpp | 25 ++++-- kernel/fs/vfs.h | 27 +++++- kernel/gdt.inc | 35 ++------ kernel/hash_primes.txt | 1 + kernel/idt.inc | 8 +- kernel/kernel.c | 19 +++- kernel/kernel.h | 31 ++++++- kernel/lang/vector.h | 2 + kernel/mm/vmm.c | 20 ++++- kernel/mm/vmm.h | 3 + kernel/proc/proc.c | 149 ++++++++++++++++++++++++++++++++ kernel/proc/proc.h | 37 ++++++++ kernel/sys/io.h | 33 +++++-- kernel/sys/pci.cpp | 61 +++++++++++++ kernel/sys/pci.h | 75 ++++++++++++++++ kernel/sys/pci_classes.c | 112 ++++++++++++++++++++++++ menu.lst | 2 + rmmod/rmmod.asm | 1 - 35 files changed, 804 insertions(+), 89 deletions(-) create mode 100644 apps/test1.app create mode 100644 apps/test1.asm create mode 100644 apps/test2.app create mode 100644 apps/test2.asm create mode 100644 kernel/fs/sysfs/sysfs.cpp create mode 100644 kernel/fs/sysfs/sysfs.h create mode 100644 kernel/fs/sysfs/sysfs_entry.cpp create mode 100644 kernel/fs/sysfs/sysfs_entry.h create mode 100644 kernel/hash_primes.txt create mode 100644 kernel/proc/proc.c create mode 100644 kernel/proc/proc.h create mode 100644 kernel/sys/pci.cpp create mode 100644 kernel/sys/pci.h create mode 100644 kernel/sys/pci_classes.c diff --git a/.bochsrc b/.bochsrc index 80a00d7..f5f75c1 100644 --- a/.bochsrc +++ b/.bochsrc @@ -24,7 +24,7 @@ ips: 500000 text_snapshot_check: 0 mouse: enabled=0 private_colormap: enabled=0 -i440fxsupport: enabled=0 +i440fxsupport: enabled=1 clock: sync=realtime, time0=local # no ne2k newharddrivesupport: enabled=1 diff --git a/Makefile b/Makefile index b228031..01077e6 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ UMOUNT=sudo umount # Do not print "Entering directory ..." MAKEFLAGS += --no-print-directory -.PHONY: all clean initrd apps grub_image install install_img depend copy_image +.PHONY: all clean initrd apps grub_image install install_img depend copy_image bochs bochsq all: make -C kernel @@ -57,6 +57,7 @@ install_img: copy_image install install_img: -mkdir $(FLOPPY_MOUNT) $(MOUNT) -t ext2 $(MOUNT_FLAGS) $(FDEV) $(FLOPPY_MOUNT) + -cp apps/*.app $(FLOPPY_MOUNT) -cp kernel/kernel.bin $(FLOPPY_MOUNT) -cp rmmod/rmmod.bin $(FLOPPY_MOUNT) -cp menu.lst $(FLOPPY_MOUNT)/boot/grub @@ -77,6 +78,12 @@ initrd: depend: make -C kernel depend +bochs: + bochs + +bochsq: + echo 'c' | bochs -q + wordcount: find . -regex '\(.*\.[ch]\)\|\(.*\.asm\)\|\(.*\.inc\)\|\(.*\.cpp\)' | xargs cat | wc diff --git a/apps/Makefile b/apps/Makefile index cd5fa82..97b138c 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -1,3 +1,5 @@ all: make -C hash + nasm -f bin test1.asm -o test1.app + nasm -f bin test2.asm -o test2.app diff --git a/apps/test1.app b/apps/test1.app new file mode 100644 index 0000000000000000000000000000000000000000..4af19304907cce6ede221bcbce8cf5b3cf5e55d0 GIT binary patch literal 33 hcmeb95B6nZU|{@IHU)| zX2yKHIZ9c8ey92&iaFuDLd9%5aaODiE<4ook8NDbqPt6e%b&hk_qm?hsJ?7(YiIIr zK>$3s#maj7KYmpLJo;!{#4hmUqg>4|Wdc0=Xk5e=@ZzIf%P$9f{_3M~QEvlpKFam{ zGTj5-eKal(Hh@nbrOGc8UXEP6GV0o>F$$rX delta 450 zcmZ|GEl&eM6oui_-B~D5=(H4)EgzHckyM~a@QXsgFQ`J0tgXXNgTPKQYJ;sMX{bP8 znqW{EOjQknl0eZoPC7GnZ1N;K@4Z*+w$|-_MI_e=aBpiuB@g@4tTZ?g=Q901ox~8p z9n+ZyepiE{@ge>n+ak^9(>@P_*|ANVdD`nv;*8H9PA@z+Et=<|t(fByr z13p8P%5Ao|IrZ_zs9U2-6j4lq5?Y`|D$^1z(+X8+mDZ?Al4?|^b!yPYqfwik%RiBs Bl?VU; diff --git a/kernel/Makefile b/kernel/Makefile index 7bc1b40..2923250 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -9,6 +9,7 @@ NASM_FLAGS=-f aout # C/C++ Information: CPPFLAGS=-fleading-underscore -fno-builtin -nostdlib -nostartfiles -nodefaultlibs -I. -Wall +# -S -masm=intel CC=gcc CXX=g++ CXXFLAGS=-fno-rtti -fno-exceptions @@ -19,16 +20,20 @@ LDFLAGS=-nodefaultlibs -nostdlib --no-demangle -T link.ld # Files OBJS=boot.o lang/lang_a.o \ - kernel.o mm/mm.o mm/vmm.o lang/conv.o display/kout.o display/display.o \ - sys/pic.o char/keyboard.o lang/lang.o \ + kernel.o mm/mm.o mm/vmm.o lang/conv.o display/kout.o \ + display/display.o sys/pic.o char/keyboard.o lang/lang.o \ + sys/pci_classes.o proc/proc.o \ lang/string.o lang/new.o char/misc_char.o char/vconsole.o \ devices.o block/ramdisk.o fs/vfs.o fs/FileSystem.o fs/VFSMount.o \ - fs/ext2/ext2.o -CSRC=kernel.c mm/mm.c mm/vmm.c lang/conv.c display/kout.c display/display.c \ - sys/pic.c char/keyboard.c lang/lang.c + fs/ext2/ext2.o fs/sysfs/sysfs.o fs/sysfs/sysfs_entry.o \ + sys/pci.o +CSRC=kernel.c mm/mm.c mm/vmm.c lang/conv.c display/kout.c \ + display/display.c sys/pic.c char/keyboard.c lang/lang.c \ + sys/pci_classes.c proc/proc.c CXXSRC=lang/string.cpp lang/new.cpp char/misc_char.cpp char/vconsole.cpp \ - block/ramdisk.cpp devices.cpp fs/vfs.cpp fs/FileSystem.o fs/VFSMount.o \ - fs/ext2/ext2.cpp + block/ramdisk.cpp devices.cpp fs/vfs.cpp fs/FileSystem.o fs/VFSMount.o\ + fs/ext2/ext2.cpp fs/sysfs/sysfs.cpp fs/sysfs/sysfs_entry.cpp \ + sys/pci.cpp .PHONY: all depend clean html @@ -46,7 +51,8 @@ lang/lang_a.o: lang/lang.asm $(NASM) $(NASM_FLAGS) -l lang.lst lang/lang.asm -o lang/lang_a.o clean: - -rm -f $(OBJS) *.bin *.map *.lst *.out *~ fs/*~ sys/*~ block/*~ char/*~ lang/*~ mm/*~ display/*~ + -rm -f $(OBJS) *.bin *.map *.lst *.out + -find . -name '*~' | xargs rm -f html: -rm -rf html @@ -73,6 +79,9 @@ sys/pic.o: hos_defines.h sys/pic.h sys/io.h char/keyboard.o: hos_defines.h char/keyboard.h sys/io.h functions.h char/keyboard.o: lang/conv.h display/kout.h display/display.h devices.h lang/lang.o: lang/lang.h hos_defines.h +sys/pci_classes.o: hos_defines.h sys/pci.h +proc/proc.o: hos_defines.h proc/proc.h mm/mm.h kernel.h multiboot.h mm/vmm.h +proc/proc.o: lang/lang.h lang/string.o: lang/string.h lang/lang.h hos_defines.h lang/new.o: hos_defines.h mm/vmm.h multiboot.h char/misc_char.o: hos_defines.h devices.h char/misc_char.h sys/io.h @@ -84,6 +93,13 @@ block/ramdisk.o: lang/lang.h block/ramdisk.h devices.h devices.o: hos_defines.h devices.h char/misc_char.h char/misc_char.h devices.o: char/vconsole.h block/ramdisk.h fs/vfs.o: hos_defines.h display/kout.h fs/vfs.h devices.h lang/string.h -fs/vfs.o: fs/ext2/ext2.h fs/vfs.h lang/vector.h -fs/ext2/ext2.o: display/kout.h hos_defines.h fs/ext2/ext2.h fs/vfs.h -fs/ext2/ext2.o: devices.h +fs/vfs.o: fs/FileSystem.h fs/VFSMount.h fs/FileSystem.h fs/vfs.h +fs/vfs.o: fs/ext2/ext2.h lang/vector.h +fs/ext2/ext2.o: display/kout.h hos_defines.h mm/vmm.h multiboot.h lang/lang.h +fs/ext2/ext2.o: fs/ext2/ext2.h fs/vfs.h devices.h +fs/sysfs/sysfs.o: display/kout.h hos_defines.h fs/vfs.h devices.h +fs/sysfs/sysfs.o: fs/sysfs/sysfs.h fs/FileSystem.h lang/vector.h +fs/sysfs/sysfs.o: lang/string.h fs/sysfs/sysfs_entry.h +fs/sysfs/sysfs_entry.o: fs/sysfs/sysfs_entry.h lang/vector.h hos_defines.h +fs/sysfs/sysfs_entry.o: lang/string.h +sys/pci.o: hos_defines.h display/kout.h sys/io.h sys/pci.h lang/vector.h diff --git a/kernel/Makefile.bak b/kernel/Makefile.bak index cab05d8..37889c0 100644 --- a/kernel/Makefile.bak +++ b/kernel/Makefile.bak @@ -9,6 +9,7 @@ NASM_FLAGS=-f aout # C/C++ Information: CPPFLAGS=-fleading-underscore -fno-builtin -nostdlib -nostartfiles -nodefaultlibs -I. -Wall +# -S -masm=intel CC=gcc CXX=g++ CXXFLAGS=-fno-rtti -fno-exceptions @@ -19,14 +20,20 @@ LDFLAGS=-nodefaultlibs -nostdlib --no-demangle -T link.ld # Files OBJS=boot.o lang/lang_a.o \ - kernel.o mm/mm.o mm/vmm.o lang/conv.o display/kout.o display/display.o \ - sys/pic.o char/keyboard.o lang/lang.o \ + kernel.o mm/mm.o mm/vmm.o lang/conv.o display/kout.o \ + display/display.o sys/pic.o char/keyboard.o lang/lang.o \ + sys/pci_classes.o proc/proc.o \ lang/string.o lang/new.o char/misc_char.o char/vconsole.o \ - devices.o block/ramdisk.o fs/vfs.o fs/ext2/ext2.o -CSRC=kernel.c mm/mm.c mm/vmm.c lang/conv.c display/kout.c display/display.c \ - sys/pic.c char/keyboard.c lang/lang.c + devices.o block/ramdisk.o fs/vfs.o fs/FileSystem.o fs/VFSMount.o \ + fs/ext2/ext2.o fs/sysfs/sysfs.o fs/sysfs/sysfs_entry.o \ + sys/pci.o +CSRC=kernel.c mm/mm.c mm/vmm.c lang/conv.c display/kout.c \ + display/display.c sys/pic.c char/keyboard.c lang/lang.c \ + sys/pci_classes.c proc/proc.c CXXSRC=lang/string.cpp lang/new.cpp char/misc_char.cpp char/vconsole.cpp \ - block/ramdisk.cpp devices.cpp fs/vfs.cpp fs/ext2/ext2.cpp + block/ramdisk.cpp devices.cpp fs/vfs.cpp fs/FileSystem.o fs/VFSMount.o\ + fs/ext2/ext2.cpp fs/sysfs/sysfs.cpp fs/sysfs/sysfs_entry.cpp \ + sys/pci.cpp .PHONY: all depend clean html @@ -44,7 +51,8 @@ lang/lang_a.o: lang/lang.asm $(NASM) $(NASM_FLAGS) -l lang.lst lang/lang.asm -o lang/lang_a.o clean: - -rm -f $(OBJS) *.bin *.map *.lst *.out *~ fs/*~ sys/*~ block/*~ char/*~ lang/*~ mm/*~ display/*~ + -rm -f $(OBJS) *.bin *.map *.lst *.out + -find . -name '*~' | xargs rm -f html: -rm -rf html @@ -71,6 +79,8 @@ sys/pic.o: hos_defines.h sys/pic.h sys/io.h char/keyboard.o: hos_defines.h char/keyboard.h sys/io.h functions.h char/keyboard.o: lang/conv.h display/kout.h display/display.h devices.h lang/lang.o: lang/lang.h hos_defines.h +proc/proc.o: hos_defines.h proc/proc.h mm/mm.h kernel.h multiboot.h mm/vmm.h +proc/proc.o: lang/lang.h lang/string.o: lang/string.h lang/lang.h hos_defines.h lang/new.o: hos_defines.h mm/vmm.h multiboot.h char/misc_char.o: hos_defines.h devices.h char/misc_char.h sys/io.h @@ -82,6 +92,7 @@ block/ramdisk.o: lang/lang.h block/ramdisk.h devices.h devices.o: hos_defines.h devices.h char/misc_char.h char/misc_char.h devices.o: char/vconsole.h block/ramdisk.h fs/vfs.o: hos_defines.h display/kout.h fs/vfs.h devices.h lang/string.h +fs/vfs.o: fs/FileSystem.h fs/VFSMount.h fs/FileSystem.h fs/vfs.h fs/vfs.o: fs/ext2/ext2.h lang/vector.h -fs/ext2/ext2.o: display/kout.h hos_defines.h fs/ext2/ext2.h fs/vfs.h -fs/ext2/ext2.o: devices.h lang/string.h +fs/ext2/ext2.o: display/kout.h hos_defines.h mm/vmm.h multiboot.h lang/lang.h +fs/ext2/ext2.o: fs/ext2/ext2.h fs/vfs.h devices.h diff --git a/kernel/fs/VFSMount.cpp b/kernel/fs/VFSMount.cpp index 7631f6d..3116ae3 100644 --- a/kernel/fs/VFSMount.cpp +++ b/kernel/fs/VFSMount.cpp @@ -14,13 +14,14 @@ extern "C" { #include "lang/string.h" #include "fs/vfs.h" -VFSMount::VFSMount(device_t dev, FileSystem *fs, string mountPoint, inode_num_t mountInode) +VFSMount::VFSMount(device_t dev, FileSystem *fs, string mountPoint, inode_num_t mountInode, inode_num_t thisInode) { myDev = dev; myFS = fs; myRefs = 0; myMountPoint = mountPoint; myMountInode = mountInode; + myThisInode = thisInode; } VFSMount::~VFSMount() diff --git a/kernel/fs/VFSMount.h b/kernel/fs/VFSMount.h index c34e9ac..bd442a2 100644 --- a/kernel/fs/VFSMount.h +++ b/kernel/fs/VFSMount.h @@ -14,15 +14,15 @@ class VFSMount { -protected: +public: device_t myDev; FileSystem *myFS; int myRefs; string myMountPoint; inode_num_t myMountInode; + inode_num_t myThisInode; -public: - VFSMount(device_t dev, FileSystem *fs, string mountPoint, inode_num_t mountInode); + VFSMount(device_t dev, FileSystem *fs, string mountPoint, inode_num_t mountInode, inode_num_t thisInode); ~VFSMount(); }; diff --git a/kernel/fs/sysfs/sysfs.cpp b/kernel/fs/sysfs/sysfs.cpp new file mode 100644 index 0000000..baa0f75 --- /dev/null +++ b/kernel/fs/sysfs/sysfs.cpp @@ -0,0 +1,44 @@ +// sysfs.cpp +// sysfs filesystem driver for HOS +// Author: Josh Holtrop +// Date: 06/27/05 +// Modified: 06/27/05 + +#define _HOS_CPP_ _HOS_CPP_ + +extern "C" { +#include "display/kout.h" +} + +#include "fs/vfs.h" +#include "sysfs.h" +#include "sysfs_entry.h" + +int sysfs_init() +{ + vfs_register("sysfs", sysfs__mount_func); + return 0; +} + +FileSystem *sysfs__mount_func(device_t dev) +{ + if (dev) + kprintf("sysfs: warning: device parameter ignored\n"); + return new Sysfs(); +} + +Sysfs::Sysfs() +{ + myEntries.add(Sysfs_Entry(SYSFS_FILE, "timer", SYSFS_TIMER)); + +} + +Sysfs::~Sysfs() +{ + +} + +u32_t Sysfs::getRootInodeNumber() +{ + return 2; +} diff --git a/kernel/fs/sysfs/sysfs.h b/kernel/fs/sysfs/sysfs.h new file mode 100644 index 0000000..71ac6ce --- /dev/null +++ b/kernel/fs/sysfs/sysfs.h @@ -0,0 +1,37 @@ +// sysfs.h +// sysfs filesystem driver for HOS +// Author: Josh Holtrop +// Date: 06/27/05 +// Modified: 06/27/05 + +#ifndef __HOS_SYSFS_H__ +#define __HOS_SYSFS_H__ __HOS_SYSFS_H__ + +#define SYSFS_TIMER 1 + +#ifdef _HOS_CPP_ + +#include "fs/FileSystem.h" +#include "fs/vfs.h" +#include "lang/vector.h" +#include "lang/string.h" +#include "sysfs_entry.h" + +int sysfs_init(); +FileSystem *sysfs__mount_func(device_t dev); + +class Sysfs : public FileSystem +{ +protected: + vector myEntries; + +public: + Sysfs(); + ~Sysfs(); + u32_t getRootInodeNumber(); +}; + +#endif + +#endif + diff --git a/kernel/fs/sysfs/sysfs_entry.cpp b/kernel/fs/sysfs/sysfs_entry.cpp new file mode 100644 index 0000000..2d9bf7f --- /dev/null +++ b/kernel/fs/sysfs/sysfs_entry.cpp @@ -0,0 +1,22 @@ +// sysfs_entry.cpp +// sysfs filesystem driver for HOS +// Author: Josh Holtrop +// Date: 06/27/05 +// Modified: 06/27/05 + +#define _HOS_CPP_ _HOS_CPP_ + +#include "sysfs_entry.h" +#include "lang/string.h" + +Sysfs_Entry::Sysfs_Entry(int type, string name, int id) +{ + myType = type; + myName = name; + myID = id; +} + +Sysfs_Entry::~Sysfs_Entry() +{ +} + diff --git a/kernel/fs/sysfs/sysfs_entry.h b/kernel/fs/sysfs/sysfs_entry.h new file mode 100644 index 0000000..59ec427 --- /dev/null +++ b/kernel/fs/sysfs/sysfs_entry.h @@ -0,0 +1,30 @@ +// sysfs_entry.h +// sysfs filesystem driver for HOS +// Author: Josh Holtrop +// Date: 06/27/05 +// Modified: 06/27/05 + +#ifndef __HOS_SYSFS_ENTRY_H__ +#define __HOS_SYSFS_ENTRY_H__ __HOS_SYSFS_ENTRY_H__ + +#include "lang/vector.h" +#include "lang/string.h" + +#define SYSFS_DIR 1 +#define SYSFS_FILE 2 + +class Sysfs_Entry +{ +protected: + int myType; + string myName; + int myID; + vector myChildren; + +public: + Sysfs_Entry(int type, string name, int id); + ~Sysfs_Entry(); +}; + +#endif + diff --git a/kernel/fs/vfs.cpp b/kernel/fs/vfs.cpp index 1611894..57e4cf6 100644 --- a/kernel/fs/vfs.cpp +++ b/kernel/fs/vfs.cpp @@ -19,7 +19,6 @@ extern "C" { #include "lang/string.h" #include "devices.h" -inode_num_t rootInode; vector *mountPoints; vector *fses; @@ -31,7 +30,7 @@ int vfs_init() return 0; } -int vfs_register(char *fs, FileSystem *(*mount_func)(device_t)) +int vfs_register(char *fs, mount_func_t mount_func) { string fsName(fs); if (vfs_get_mount_func(fsName)) @@ -57,15 +56,18 @@ int vfs_mount(device_t device, char *fsType, char *mountPoint) FileSystem *fs = vfs_attempt_mount(device, fsType); if (fs == NULL) return -2; - rootInode = fs->getRootInodeNumber(); - mountPoints->add(VFSMount(device, fs, mountPt, 0)); + mountPoints->add(VFSMount(device, fs, mountPt, 0, fs->getRootInodeNumber())); return 0; } - else - { - // TODO: mount a second filesystem - } - return 500; + inode_num_t mtInode = vfs_get_inode(mountPt); + if (mtInode == 0) + return -3; + FileSystem *fs = vfs_attempt_mount(device, fsType); + if (fs == NULL) + return -2; + inode_num_t thisInode = ((u64_t)(mountPoints->size()) << 32) | fs->getRootInodeNumber(); + mountPoints->add(VFSMount(device, fs, mountPt, mtInode, thisInode)); + return 0; } FileSystem *vfs_attempt_mount(device_t device, char *fsType) @@ -77,6 +79,11 @@ FileSystem *vfs_attempt_mount(device_t device, char *fsType) return NULL; } +inode_num_t vfs_get_inode(const string & path) +{ + return 0; +} + mount_func_t vfs_get_mount_func(const string & fsName) { for (unsigned int i = 0; i < fses->size(); i++) diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h index 65c567c..849b0fd 100644 --- a/kernel/fs/vfs.h +++ b/kernel/fs/vfs.h @@ -34,6 +34,23 @@ #include "hos_defines.h" #include "devices.h" + +typedef struct +{ + u16_t type; // file type, of VFS_FILE_TYPE_* + u32_t size; + u32_t inode; + u16_t permissions; + u16_t uid; + u16_t gid; + u32_t atime; + u32_t mtime; + u32_t ctime; + u16_t links; + u32_t dev; +} vfs_stat_t; + + typedef u64_t inode_num_t; #ifdef _HOS_CPP_ @@ -42,6 +59,7 @@ extern "C" { int vfs_init(); int vfs_mount(device_t device, char *fsType, char *mountPoint); +int vfs_stat(char *name, vfs_stat_t *buff); #ifdef _HOS_CPP_ } @@ -50,17 +68,18 @@ int vfs_mount(device_t device, char *fsType, char *mountPoint); #include "fs/FileSystem.h" #include "fs/VFSMount.h" -typedef FileSystem *(*mount_func_t)(device_t); - typedef struct { string name; - mount_func_t mount_func; + FileSystem *(*mount_func)(device_t); } FSHandle; +typedef FileSystem *(*mount_func_t)(device_t); + FileSystem *vfs_attempt_mount(device_t device, char *fsType); -int vfs_register(char *fs, FileSystem *(*mount_func)(device_t)); +int vfs_register(char *fs, mount_func_t mount_func); mount_func_t vfs_get_mount_func(const string & fsName); +inode_num_t vfs_get_inode(const string & path); #endif diff --git a/kernel/gdt.inc b/kernel/gdt.inc index 67d676e..12a137a 100644 --- a/kernel/gdt.inc +++ b/kernel/gdt.inc @@ -9,6 +9,7 @@ gdtr: gdt: dd 0 dd 0 + KERNEL_CODE equ $-gdt dw 0xffff ;limit 15:0 dw 0x0000 ;base 15:0 @@ -16,6 +17,7 @@ KERNEL_CODE equ $-gdt db 0x9A ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 db 0x00 ;base 31:24 + KERNEL_DATA equ $-gdt dw 0xffff ;limit 15:0 dw 0x0000 ;base 15:0 @@ -23,6 +25,8 @@ KERNEL_DATA equ $-gdt db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 db 0x00 ;base 31:24 + + USER_CODE equ $-gdt dw 0xffff ;limit 15:0 dw 0x0000 ;base 15:0 @@ -30,6 +34,7 @@ USER_CODE equ $-gdt db 0xFA ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 db 0x00 ;base 31:24 + USER_DATA equ $-gdt dw 0xffff ;limit 15:0 dw 0x0000 ;base 15:0 @@ -37,34 +42,8 @@ USER_DATA equ $-gdt db 0xF2 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 db 0x00 ;base 31:24 -VESA_CODE equ $-gdt - dw 0xffff ;limit 15:0 - dw 0x0000 ;base 15:0 - db 0x00 ;base 23:16 - db 0x9A ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16 - db 0x00 ;base 31:24 -VESA_DATA equ $-gdt - dw 0xffff ;limit 15:0 - dw 0x0000 ;base 15:0 - db 0x00 ;base 23:16 - db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16 - db 0x00 ;base 31:24 -VIDEO_TEXT equ $-gdt - dw 0x7FFF ;limit 15:0 - dw 0x8000 ;base 15:0 - db 0x0B ;base 23:16 - db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16 - db 0x00 ;base 31:24 -VIDEO_GRAPHICS equ $-gdt - dw 0xFFFF ;limit 15:0 - dw 0x0000 ;base 15:0 - db 0x0A ;base 23:16 - db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16 - db 0x00 ;base 31:24 + + gdt_end: diff --git a/kernel/hash_primes.txt b/kernel/hash_primes.txt new file mode 100644 index 0000000..3454eae --- /dev/null +++ b/kernel/hash_primes.txt @@ -0,0 +1 @@ +53 97 193 389 769 1543 3079 6151 12289 24593 49157 diff --git a/kernel/idt.inc b/kernel/idt.inc index 9d75ba9..d4612dc 100644 --- a/kernel/idt.inc +++ b/kernel/idt.inc @@ -70,11 +70,15 @@ isr_main: pusha push ds push es - + push fs + push gs + push esp push eax ;interrupt number call _isr - add esp, 4 + add esp, 8 + pop gs + pop fs pop es pop ds popa diff --git a/kernel/kernel.c b/kernel/kernel.c index 96d2b71..db70f4d 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -1,7 +1,7 @@ // kernel.h // Author: Josh Holtrop // Date: 08/16/04 -// Modified: 03/19/05 +// Modified: 08/18/05 // This is the main kernel initialization and boot-strapping file #include "kernel.h" @@ -21,6 +21,8 @@ #include "block/ramdisk.h" #include "fs/vfs.h" #include "fs/ext2/ext2.h" +#include "sys/pci.h" +#include "proc/proc.h" mb_info_t mb_info_block; mb_mmap_t mb_mmap[MAX_MMAP]; @@ -129,6 +131,7 @@ void k_init() kprintf("Kernel load size: %d (0x%x) bytes (%d kb)\n", kernel_size(), kernel_size(), kernel_size() >> 10); kprintf("Kernel memory size: %d (0x%x) bytes (%d kb)\n", kernel_size_used(), kernel_size_used(), kernel_size_used() >> 10); + k_check(pci_init(), "pci_init() failed!"); k_check(vfs_init(), "vfs_init() failed!"); int i; @@ -143,6 +146,13 @@ void k_init() kprintf("initrd (%dkb) loaded\n", (mb_modules[i].mod_end - mb_modules[i].mod_start) >> 10); k_check(vfs_mount(DEV(MAJOR_RAMDISK, initrd_minor), "ext2", "/"), "Kernel panic: Could not mount initrd to /!"); } + if (((hos_module_header_t*)(mb_modules[i].mod_start))->mod_type == 2) + { + create_task(mb_modules[i].mod_start, + mb_modules[i].mod_end - mb_modules[i].mod_end, + 0, + ((hos_module_header_t*)(mb_modules[i].mod_start))->init); + } } /* vfs_open_file_t *root = vfs_open_dir("////"); @@ -187,14 +197,14 @@ void k_init() criticalCounter--; } -void isr(u32_t num) +void isr(u32_t num, int_stack_t *stack_frame) { criticalCounter++; switch (num) { case 0x20: // timer - (*(u16_t *)CONSOLE_MEMORY)++; timer++; + proc_sched(stack_frame); pic_eoi(); break; case 0x21: // keyboard @@ -202,7 +212,8 @@ void isr(u32_t num) pic_eoi(); break; case 0x30: - kprintf("User interrupt requested\n"); + if (stack_frame->eax == 1) + kputc(stack_frame->ebx); break; default: kprintf("Unhandled interrupt #%d, CR2 = 0x%x!\n", num, read_cr2()); diff --git a/kernel/kernel.h b/kernel/kernel.h index 78ccbb5..a8d3406 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -1,7 +1,7 @@ // kernel.h // Author: Josh Holtrop // Date: 08/16/04 -// Modified: 01/04/05 +// Modified: 08/18/05 #ifndef __HOS_KERNEL_H__ #define __HOS_KERNEL_H__ __HOS_KERNEL_H__ @@ -9,17 +9,42 @@ #include "hos_defines.h" #include "multiboot.h" -typedef struct { +typedef struct +{ void *vid_addr; // address of LFB, 0 if console mode u32_t width; // width in pixels or columns if vid_mem == 0 u32_t height; // height in pixels or columns if vid_mem == 0 u32_t bpp; // bits per pixel - 15/16/24/32 } __attribute__ ((packed)) real_mode_param_t; + pusha + push ds + push es + push fs + push gs + push esp + +typedef struct +{ + u32_t gs; + u32_t fs; + u32_t es; + u32_t ds; + u32_t edi; /* pusha */ + u32_t esi; + u32_t ebp; + u32_t esp; + u32_t ebx; + u32_t edx; + u32_t ecx; + u32_t int_num; /* The eax that pusha pushed is int # */ + u32_t eax; /* We saved the real eax manually */ +} int_stack_t; + /* returns true to callee if we should jump to a real mode module */ mb_module_t *k_mbsave(mb_info_t *mbinfo, unsigned int mb_magic); void _init(); -void isr(); +void isr(u32_t num, int_stack_t *stack_frame); void k_enter_critical(); // functions for implementing "atomic actions" void k_leave_critical(); void k_check(int val, char *msg); diff --git a/kernel/lang/vector.h b/kernel/lang/vector.h index b26a535..6e22b84 100644 --- a/kernel/lang/vector.h +++ b/kernel/lang/vector.h @@ -9,6 +9,8 @@ #ifndef __HOS_VECTOR__ #define __HOS_VECTOR__ __HOS_VECTOR__ +#include "hos_defines.h" + template class vector { diff --git a/kernel/mm/vmm.c b/kernel/mm/vmm.c index 0995bdc..521450f 100644 --- a/kernel/mm/vmm.c +++ b/kernel/mm/vmm.c @@ -18,7 +18,6 @@ int vmm_coalesceEntry(u32_t queue, HeapEntry_t *newHE); void vmm_heb_init(HeapEntryBlock_t *heb); void vmm_addToQueue(u32_t queue, HeapEntry_t *preceeding, HeapEntry_t *he); int vmm_countHeapEntries(HeapEntry_t *he); -int vmm_unmapp(void *addr); HeapEntry_t *vmm_followChain(HeapEntry_t *he); HeapEntry_t *vmm_getUnusedEntry(); HeapEntry_t *vmm_stripUnusedEntry(); @@ -57,10 +56,16 @@ void vmm_init() /* Allocate a physical page and map the virtual address to it, return physical address allocated or NULL */ int vmm_map(void *virt) +{ + u32_t dum; + return vmm_map_addr(virt, &dum); +} + +int vmm_map_addr(void *virt, u32_t *phys_addr) { if (mm_freepages < 10) return -1; - return vmm_map1((u32_t)virt, mm_palloc()); + return vmm_map1((u32_t)virt, *phys_addr = mm_palloc()); } @@ -191,6 +196,12 @@ int kfree(void *addr) // This function allocates a virtual page and maps it to a physical page void *vmm_palloc() +{ + u32_t dum; + return vmm_palloc_addr(&dum); +} + +void *vmm_palloc_addr(u32_t *phys_addr) { k_enter_critical(); HeapEntry_t *he = heapEntryQueues[VMM_HE_HOLE].head->next; @@ -201,7 +212,7 @@ void *vmm_palloc() { vmm_removeHeapEntry(VMM_HE_HOLE, he); vmm_addToQueue(VMM_HE_USED, &heapEntryHeadNodes[VMM_HE_USED], he); - if (vmm_map(he->base)) + if (vmm_map_addr(he->base, phys_addr)) he->base = NULL; k_leave_critical(); return he->base; @@ -220,7 +231,7 @@ void *vmm_palloc() he->base = wilderness->base + wilderness->length; he->length = 4096; vmm_addToQueue(VMM_HE_USED, &heapEntryHeadNodes[VMM_HE_USED], he); - if (vmm_map(he->base)) + if (vmm_map_addr(he->base, phys_addr)) he->base = NULL; k_leave_critical(); return he->base; @@ -236,6 +247,7 @@ int vmm_pfree(void *addr) if (vmm_unmapp(addr)) return -1; mm_pfree(pbase); + return 0; } int vmm_unmapp(void *addr) diff --git a/kernel/mm/vmm.h b/kernel/mm/vmm.h index 8f4f20d..bc7b1ae 100644 --- a/kernel/mm/vmm.h +++ b/kernel/mm/vmm.h @@ -40,11 +40,14 @@ typedef struct { void vmm_init(); void *kmalloc(u32_t size); int kfree(void *addr); +int vmm_unmapp(void *addr); void *vmm_palloc(); +void *vmm_palloc_addr(u32_t *phys_addr); int vmm_pfree(void *addr); void *kcalloc(unsigned int number, unsigned int size); int vmm_map(void *virt); +int vmm_map_addr(void *virt, u32_t *phys_addr); int vmm_map1(unsigned int virt, unsigned int physical); int vmm_mapn(unsigned int virt, unsigned int physical, unsigned int n); void vmm_unmap1(unsigned int virt); diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c new file mode 100644 index 0000000..611d8d6 --- /dev/null +++ b/kernel/proc/proc.c @@ -0,0 +1,149 @@ +// proc.c +// Author: Josh Holtrop +// Date; 08/18/05 +// Modified: 08/18/05 + +extern int mm_freepages; + +#include "hos_defines.h" +#include "proc.h" +#include "mm/mm.h" +#include "mm/vmm.h" +#include "lang/lang.h" +#include "kernel.h" + +u32_t cur_task = 0; +u32_t n_processes = 0; +process_t *processes[3]; + +int proc_init() +{ + return 0; +} + +void proc_sched(int_stack_t *stack_frame) +{ + cur_task = (cur_task + 1) & 1; + write_cr3(processes[cur_task] +} + +u32_t create_task(void *base, u32_t image_size, u32_t bss_size, void *entry); +{ + process_t *proc = create_process(vase, image_size, bss_size, entry); + processes[n_processes] = proc; + return n_processes++; +} + +process_t *create_process(void *base, u32_t image_size, u32_t bss_size, void *entry); +{ + if (mm_freepages < pages + bsspages + 25) + return 0; + process_t *process = New(process_t); /* Allocate process_t struct */ + create_address_space(process); + create_process_stack(process); + int i; + u32_t *ptr32 = process->v_page_dir = vmm_palloc(); + for (i = 0; i < 1024; i++) + *ptr32++ = 0; + u32_t code_data_pages = (image_size >> 12) + + ((image_size & 0x3FF) ? 1 : 0); + u32_t bss_pages = (bss_size >> 12) + ((bss_size & 0x3FF) ? 1 : 0); + /* Load program at address 0 */ + copy_into_address_space(0, base, code_data_pages, process); + zero_address_space(code_data_pages << 12, bss_pages, process); + ptr32 = process->v_page_dir; + for (i = 0; i < 1024; i++) + if (*ptr32) + vmm_unmapp(*ptr32); + vmm_unmapp(process->v_page_dir); + process->v_page_dir = 0; + return process; +} + +void create_address_space(process_t *p) +{ + /* Allocate a new page directory */ + p->page_dir = vmm_palloc_addr(&p->p_page_dir); + int i; + u32_t *ptr32 = p->page_dir; + for (i = 0; i < 768; i++) /* zero 3 gigs */ + *ptr32++ = 0; + memcpyd(ptr32, (void *)0xFFFFF000, 256); /* 1 gig kernel mem */ +} + +void create_process_stack(process_t *p) +{ + u32_t p_stack_table, p_stack; + u32_t *v_stack_table = vmm_palloc_addr(&p_stack_table); + void *v_stack = vmm_palloc_addr(&p_stack); + int i; + u32_t *ptr32 = v_stack_table; + for (int i = 0; i < 1023; i++) + *ptr32++ = 0; + v_stack_table[1032] = p_stack | 0x7; /* user permissions */ + p->page_dir[511] = p_stack_table | 0x7; + vmm_unmapp(v_stack_table); + vmm_unmapp(v_stack); + p->esp = 0x80000000; /* Stack at 2GB */ +} + +/* Copy pages into new address space (v_page_dir must be set up) */ +void copy_into_address_space(u32_t dest_addr, + void *src_addr, + u32_t pages, + process_t *p) +{ + u32_t pde, pte; + void *page; + while (pages) + { + pde = dest_addr >> 22; + pte = (dest_addr >> 12) & 0x3FF; + u32_t p_page_addr; + if (!p->v_page_dir[pde]) + { + /* Time for a new page table & page directory entry! */ + p->v_page_dir[pde] = vmm_palloc_addr(&p_page_addr); + p->page_dir[pde] = p_page_addr | 0x7; + vmm_unmapp(p->v_page_dir[pde]); + } + page = vmm_palloc_addr(&p_page_addr); + ((u32_t *)(p->v_page_dir[pde]))[pte] = p_page_addr | 0x7; + memcpyd(page, src_addr, 1024); + vmm_unmapp(page); + dest_addr += 4096; + src_addr += 4096; + pages--; + } +} + +/* Zeros pages into new address space (v_page_dir must be set up) */ +void zero_address_space(u32_t dest_addr, u32_t pages, process_t *p) +{ + u32_t pde, pte; + void *page; + while (pages) + { + pde = dest_addr >> 22; + pte = (dest_addr >> 12) & 0x3FF; + u32_t p_page_addr; + if (!p->v_page_dir[pde]) + { + /* Time for a new page table & page directory entry! */ + p->v_page_dir[pde] = vmm_palloc_addr(&p_page_addr); + p->page_dir[pde] = p_page_addr | 0x7; + vmm_unmapp(p->v_page_dir[pde]); + } + page = vmm_palloc_addr(&p_page_addr); + ((u32_t *)(p->v_page_dir[pde]))[pte] = p_page_addr | 0x7; + memsetd(page, 0, 1024); + vmm_unmapp(page); + dest_addr += 4096; + pages--; + } +} + +u32_t fork(process_t *p) +{ + return 0; +} diff --git a/kernel/proc/proc.h b/kernel/proc/proc.h new file mode 100644 index 0000000..6084a94 --- /dev/null +++ b/kernel/proc/proc.h @@ -0,0 +1,37 @@ +// proc.h +// Author: Josh Holtrop +// Date; 08/18/05 +// Modified: 08/18/05 + +#ifndef __HOS_PROC_H__ +#define __HOS_PROC_H__ __HOS_PROC_H__ + +#include "hos_defines.h" +#include "kernel.h" + +typedef struct +{ + u32_t *page_dir; /* Page directory with physical PT addys */ + u32_t *v_page_dir; /* Virtual page table addresses for init */ + u32_t p_page_dir; /* Physical address of page directory */ + u32_t size; /* Process size, bytes from 0 through bss */ + u32_t esp; /* Process stack pointer */ + int_stack_frame_t stack_frame; +} process_t; + +int proc_init(int_stack_t *stack_frame); +void proc_sched(); +u32_t create_task(void *base, u32_t image_size, u32_t bss_size, void *entry); +process_t *create_process(void *base, u32_t image_size, u32_t bss_size, void *entry); +void create_address_space(process_t *p); +void create_process_stack(process_t *p); +void copy_into_address_space(u32_t dest_addr, + void *src_addr, + u32_t pages, + process_t *p); +void zero_address_space(u32_t dest_addr, u32_t pages, process_t *p); +u32_t fork(process_t *p); + + +#endif + diff --git a/kernel/sys/io.h b/kernel/sys/io.h index b77bef1..78b4c94 100644 --- a/kernel/sys/io.h +++ b/kernel/sys/io.h @@ -13,25 +13,44 @@ //inline unsigned char inportb(unsigned short port); //Writes a byte out to a port -static inline void outportb(unsigned int port, unsigned char value) // Output a byte to a port +static inline void outportb(unsigned int port, unsigned int value) // Output a byte to a port { - asm volatile ("outb %%al,%%dx"::"d" (port), "a" (value)); + asm volatile ("outb %%al,%%dx"::"d" (port), "a" (value)); } //Writes a word out to a port static inline void outportw(unsigned int port, unsigned int value) // Output a word to a port { - asm volatile ("outw %%ax,%%dx"::"d" (port), "a" (value)); + asm volatile ("outw %%ax,%%dx"::"d" (port), "a" (value)); +} + +//Writes a dword out to a port +static inline void outportd(unsigned int port, unsigned int value) // Output a word to a port +{ + asm volatile ("outl %%eax,%%dx"::"d" (port), "a" (value)); } //Reads a byte from a port -static inline unsigned char inportb(unsigned short port) +static inline unsigned char inportb(unsigned int port) { unsigned char ret_val; + asm volatile("inb %w1,%b0" : "=a"(ret_val) : "d"(port)); + return ret_val; +} - asm volatile("inb %w1,%b0" - : "=a"(ret_val) - : "d"(port)); +//Reads a word from a port +static inline unsigned short inportw(unsigned int port) +{ + unsigned int ret_val; + asm volatile("inw %w1,%w0" : "=a"(ret_val) : "d"(port)); + return ret_val; +} + +//Reads a dword from a port +static inline unsigned int inportd(unsigned int port) +{ + unsigned int ret_val; + asm volatile("inl %w1,%0" : "=a"(ret_val) : "d"(port)); return ret_val; } diff --git a/kernel/sys/pci.cpp b/kernel/sys/pci.cpp new file mode 100644 index 0000000..2d77e40 --- /dev/null +++ b/kernel/sys/pci.cpp @@ -0,0 +1,61 @@ +// pci.cpp +// Author: Josh Holtrop +// Date: 07/13/05 +// Modified: 07/17/05 + +#define _HOS_CPP_ + +extern "C" { +#include "hos_defines.h" +#include "display/kout.h" +#include "sys/io.h" +} + +#include "pci.h" +#include "lang/vector.h" + +vector *pci_devices; + +int pci_init() +{ + pci_devices = new vector; + pci_scanBus(0); + return 0; +} + +void pci_scanBus(u32_t bus) +{ + pci_header_t pciHdr; + u32_t dev, func, off, reg, numFuncs; + for (dev = 0; dev < 32; dev++) + { + numFuncs = 1; + for (func = 0; func < 8; func++) + { + reg = pci_readConfigRegister(bus, dev, func, 0); + if (reg != 0 && reg != 0xFFFFFFFF) + { + for (off = 0; off < 0x40; off += 4) + *((u32_t *)(((u32_t)&pciHdr)+off)) = pci_readConfigRegister(bus, dev, func, off); + pci_devices->add(pciHdr); + if (func == 0 && (pciHdr.header & 0x80)) + numFuncs = 8; + kprintf("PCI device %d.%d.%d:\t(%s)\n", bus, dev, func, pci_getDeviceClass(pciHdr.cls, pciHdr.subclass, pciHdr.progif)); + if ((pciHdr.header & 0x7F) == 1) + pci_scanBus(pciHdr.h1_bus1); + } + } + } +} + +u32_t pci_readConfigRegister(u32_t bus, u32_t dev, u32_t func, u32_t offset) +{ + outportd(PCI_CONFIG_ADDRESS, + 0x80000000 | + ((bus & 0xFF) << 16) | + ((dev & 0x1F) << 11) | + ((func & 0x7) << 8) | + (offset & 0xFC)); + return inportd(PCI_CONFIG_DATA); +} + diff --git a/kernel/sys/pci.h b/kernel/sys/pci.h new file mode 100644 index 0000000..c1903e7 --- /dev/null +++ b/kernel/sys/pci.h @@ -0,0 +1,75 @@ +// pci.h +// Author: Josh Holtrop +// Date: 07/13/05 +// Modified: 07/13/05 + +#ifndef __HOS_PCI__ +#define __HOS_PCI__ __HOS_PCI__ + +#define PCI_CONFIG_ADDRESS 0xCF8 +#define PCI_CONFIG_DATA 0xCFC +#define PCI_HEADER_MF_MASK 0x80 + +#include "hos_defines.h" + +typedef struct +{ + u8_t subclass; + u8_t progif; + char *desc; +} pci_class_t; + +typedef struct +{ + u16_t vendorID; /* 0x00 Vender ID Number */ + u16_t deviceID; /* 0x02 Device ID Number */ + u16_t command; /* 0x04 Command Register */ + u16_t status; /* 0x06 Status Register */ + u8_t revision; /* 0x08 Revision ID */ + u8_t progif; /* 0x09 Programming Interface */ + u8_t subclass; /* 0x0A Subclass Number */ + u8_t cls; /* 0x0B PCI Device Class */ + u8_t cacheLineSize; /* 0x0C Cache Line Size (for DMA) */ + u8_t latency; /* 0x0D Latency Timer (PCI Bus cycles) */ + u8_t header; /* 0x0E bit7:multifunc, 0-6: header format */ + u8_t bist; /* 0x0F Built-In Self Test Result */ + /* Header-specific fields */ + u32_t bar0; /* 0x10 */ + u32_t bar1; /* 0x14 */ + union { /* 0x18 */ + u32_t bar2; + struct { + u8_t h1_bus0; + u8_t h1_bus1; + u8_t h1_secBus; + u8_t h1_secLatency; + }; + }; + u32_t bar3; /* 0x1C */ + u32_t bar4; /* 0x20 */ + u32_t bar5; /* 0x24 */ + u32_t cardbusCIS; /* 0x28 ro */ + u16_t ssVendorID; /* 0x2C */ + u16_t ssID; /* 0x2E */ + u32_t expansionAddr; /* 0x30 */ + u32_t reserved[2]; /* 0x34 */ + u8_t irq; /* 0x3C IRQ Number, 0 if none */ + u8_t intPin; /* 0x3D Interrupt Pin, 0 if none, ro */ + u8_t minGrant; /* 0x3E 250ns units, ro */ + u8_t maxLatency; /* 0x3F 250ns units, ro */ +} pci_header_t; + +#ifdef _HOS_CPP_ +extern "C" { +#endif + +int pci_init(); +u32_t pci_readConfigRegister(u32_t bus, u32_t dev, u32_t func, u32_t offset); +char *pci_getDeviceClass(u8_t cls, u8_t sub, u8_t progif); + void pci_scanBus(u32_t bus); + +#ifdef _HOS_CPP_ +} +#endif + +#endif diff --git a/kernel/sys/pci_classes.c b/kernel/sys/pci_classes.c new file mode 100644 index 0000000..fc4cdba --- /dev/null +++ b/kernel/sys/pci_classes.c @@ -0,0 +1,112 @@ +// pci_classes.c +// Author: Josh Holtrop +// Date: 07/21/05 +// Modified: 07/21/05 +// Had to be a C file because g++ doesn't like pci_classes declaration + +#include "hos_defines.h" +#include "pci.h" + +pci_class_t* pci_classes[] = +{ + (pci_class_t[]) { + {1, 1, "Generic PCI VGA Device"}, + {0xFF, 0xFF, "Generic PCI Device"} + }, + (pci_class_t[]) { + {0, 0, "SCSI Controller"}, + {1, 0xFF, "IDE Controller"}, + {2, 0, "Floppy Disk Controller"}, + {3, 0, "IPI Controller"}, + {4, 0, "RAID Controller"}, + {0xFF, 0xFF, "Generic Mass Storage Controller"} + }, + (pci_class_t[]) { + {0, 0, "Ethernet Controller"}, + {1, 0, "Token Ring Network Controller"}, + {2, 0, "FDDI Controller"}, + {3, 0, "ATM Controller"}, + {0xFF, 0xFF, "Generic Network Controller"} + }, + (pci_class_t[]) { + {0, 0, "VGA Compatible Controller"}, + {0, 1, "8514 Compatible Display Controller"}, + {1, 0, "XGA Controller"}, + {0xFF, 0xFF, "Generic Display Controller"} + }, + (pci_class_t[]) { + {0, 0, "Multimedia Video Device"}, + {0, 0, "Multimedia Audio Device"}, + {0xFF, 0xFF, "Generic Multimedia Device"} + }, + (pci_class_t[]) { + {0, 0, "RAM Controller"}, + {1, 0, "Flash Memory Controller"}, + {0xFF, 0xFF, "Generic Memory Controller"} + }, + (pci_class_t[]) { + {0, 0, "Host/PCI Bridge"}, + {1, 0, "PCI/ISA Bridge"}, + {2, 0, "PCI/EISA Bridge"}, + {3, 0, "PCI/Micro Channel Bridge"}, + {4, 0, "PCI/PCI Bridge"}, + {5, 0, "PCI/PCMCIA Bridge"}, + {6, 0, "PCI/NuBus Bridge"}, + {7, 0, "PCI/CardBus Bridge"}, + {0xFF, 0xFF, "Generic Bridge"} + }, + (pci_class_t[]) { + {0, 0xFF, "Serial Controller"}, + {1, 0xFF, "Parallel Port"}, + {0xFF, 0xFF, "Generic Communications Device"} + }, + (pci_class_t[]) { + {0, 0xFF, "Programmable Interrupt Controller"}, + {1, 0xFF, "DMA Controller"}, + {2, 0xFF, "System Timer"}, + {3, 0xFF, "RTC Controller"}, + {0xFF, 0xFF, "Generic System Peripheral"} + }, + (pci_class_t[]) { + {0, 0, "Keyboard Controller"}, + {1, 0, "Digitizer (Pen)"}, + {2, 0, "Mouse Controller"}, + {0xFF, 0xFF, ""} + }, + (pci_class_t[]) { + {0xFF, 0xFF, "Docking Station"} + }, + (pci_class_t[]) { + {0, 0, "386 Processor"}, + {1, 0, "486 Processor"}, + {2, 0, "Pentium Processor"}, + {0x10, 0, "Alpha Processor"}, + {0x20, 0, "PowerPC Processor"}, + {0x40, 0, "Co-Processor"}, + {0xFF, 0xFF, "Generic Processor"} + }, + (pci_class_t[]) { + {0, 0, "Firewire (IEEE 1394) Controller"}, + {1, 0, "ACCESS Bus Controller"}, + {2, 0, "SSA (Serial Storage Architecture) Controller"}, + {3, 0, "USB Controller"}, + {0xFF, 0xFF, "Generic Serial Bus Controller"} + } +}; + +char *pci_getDeviceClass(u8_t cls, u8_t sub, u8_t progif) +{ + if (cls < sizeof(pci_classes)/sizeof(pci_class_t *)) + { + pci_class_t *pcls = pci_classes[cls]; + for (;;) + { + if ( (pcls->subclass == 0xFF || pcls->subclass == sub) + && (pcls->progif == 0xFF || pcls->progif == progif) ) + return pcls->desc; + pcls++; + } + } + return "Unknown PCI Device"; +} + diff --git a/menu.lst b/menu.lst index 04fa1f0..c44c15c 100644 --- a/menu.lst +++ b/menu.lst @@ -7,3 +7,5 @@ root (fd0) kernel /kernel.bin module /rmmod.bin module /hos_initrd.gz +module /test1.app +module /test2.app diff --git a/rmmod/rmmod.asm b/rmmod/rmmod.asm index 990a22d..4574578 100644 --- a/rmmod/rmmod.asm +++ b/rmmod/rmmod.asm @@ -265,7 +265,6 @@ txt_vesa_end: db "Enter the letter of your selection or 0 for console mode:", 0 txt_novesa: db "VESA not found, using 80x25 console mode... press any key", 10, 0 dat_rmadd: dd 0 -dat_initrd: dd 0 dat_retn: dd 0 vbe_info_block: