Began rewrite of Sydi kernel with new design.
authorethereal <ethereal@ethv.net>
Mon, 6 Jan 2014 09:15:52 +0000 (02:15 -0700)
committerethereal <ethereal@ethv.net>
Mon, 6 Jan 2014 09:15:52 +0000 (02:15 -0700)
93 files changed:
.gitignore
Makefile
TODO [deleted file]
bochs [deleted symlink]
bochsrc.txt [deleted file]
doc/apic [new file with mode: 0644]
doc/boot-process [new file with mode: 0644]
kernel/Makefile
kernel/acpi/system.c [deleted file]
kernel/acpi/system.h [deleted file]
kernel/acpi/tables.c [deleted file]
kernel/acpi/tables.h [deleted file]
kernel/apb/.gitignore [deleted file]
kernel/apb/bootstrap.s [deleted file]
kernel/apb/generate.py [deleted file]
kernel/apic.c [deleted file]
kernel/apic.h [deleted file]
kernel/apic_isrs.s [deleted file]
kernel/boot/multiboot.s
kernel/config.h
kernel/context.c [deleted file]
kernel/context.h [deleted file]
kernel/debug.c [new file with mode: 0644]
kernel/debug.h [new file with mode: 0644]
kernel/elf.c [deleted file]
kernel/elf.h [deleted file]
kernel/gdt.c
kernel/gdt.h
kernel/io.c [new file with mode: 0644]
kernel/io.h [new file with mode: 0644]
kernel/ioapic.c [deleted file]
kernel/ioapic.h [deleted file]
kernel/kernel.h [new file with mode: 0644]
kernel/kernel.ld
kernel/keyboard.c [deleted file]
kernel/keyboard.h [deleted file]
kernel/khash.c [deleted file]
kernel/khash.h [deleted file]
kernel/kheap.c
kernel/kheap.h
kernel/kid.c [deleted file]
kernel/kid.h [deleted file]
kernel/klist.h [deleted file]
kernel/klock.c [deleted file]
kernel/klock.h [deleted file]
kernel/klock_spin.s [deleted file]
kernel/klog.c [deleted file]
kernel/klog.h [deleted file]
kernel/kmain.c
kernel/kphy.c [deleted file]
kernel/kphy.h [deleted file]
kernel/ksem.c [deleted file]
kernel/ksem.h [deleted file]
kernel/ksem_helper.s [deleted file]
kernel/ksynch.c [deleted file]
kernel/ksynch.h [deleted file]
kernel/ktime.c [deleted file]
kernel/ktime.h [deleted file]
kernel/kutil.c [deleted file]
kernel/kutil.h [deleted file]
kernel/msr.c [deleted file]
kernel/msr.h [deleted file]
kernel/pagereg.c [new file with mode: 0644]
kernel/pagereg.h [new file with mode: 0644]
kernel/pit.c [deleted file]
kernel/pit.h [deleted file]
kernel/pmman.c [deleted file]
kernel/pmman.h [deleted file]
kernel/sched.c [deleted file]
kernel/sched.h [deleted file]
kernel/sched_helper.s [deleted file]
kernel/sha256.c [deleted file]
kernel/sha256.h [deleted file]
kernel/smp.c [deleted file]
kernel/smp.h [deleted file]
kernel/smp_id.s [deleted file]
kernel/smp_percpu.h [deleted file]
kernel/string.c [new file with mode: 0644]
kernel/string.h [new file with mode: 0644]
kernel/terminal.c [deleted file]
kernel/terminal.h [deleted file]
kernel/thread.c [deleted file]
kernel/thread.h [deleted file]
kernel/thread_helper.s [deleted file]
kernel/thread_regs.s [deleted file]
kernel/tss.c [deleted file]
kernel/tss.h [deleted file]
kernel/util.c [new file with mode: 0644]
kernel/util.h [new file with mode: 0644]
kernel/vmem.c [new file with mode: 0644]
kernel/vmem.h [new file with mode: 0644]
kernel/vmman.c [deleted file]
kernel/vmman.h [deleted file]

index 7bde876..115a715 100644 (file)
@@ -1,9 +1,11 @@
 .vimrc
+*.swp
 *.o
 
 
 /.bochs
 bochsout.txt
+/temp
 
 sydi.iso
 
index 6c9edb9..aec17c1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,9 @@
+MKISOFS=xorrisofs
 MKISO_OPTIONS=-quiet -R -no-emul-boot -boot-load-size 4 -boot-info-table -A "sydi" -b boot/eltorito.img -o sydi.iso
 ISO_GRAFTS="kernel.bin=kernel/kernel.bin"
 
-BOCHS_PATH=./bochs
-QEMU_PATH=qemu-system-x86_64
+QEMU_PATH=~/qemu/install/bin/qemu-system-x86_64
+QEMU_FLAGS=-m 64 -curses
 
 ISO_TARGET=sydi.iso
 
@@ -14,16 +15,15 @@ kernel:
        $(MAKE) -C kernel
 
 $(ISO_TARGET): kernel
-       mkisofs $(MKISO_OPTIONS) -graft-points $(ISO_GRAFTS) fs
+       $(MKISOFS) $(MKISO_OPTIONS) -graft-points $(ISO_GRAFTS) fs
 
 .PHONY: clean
 clean:
        -rm -f $(ISO_TARGET)
        $(MAKE) -C kernel clean
 
-.PHONY: run debug qemu
-run: all
-       $(BOCHS_PATH) -q
-
-qemu: all
-       $(QEMU_PATH) -cdrom sydi.iso -smp 4
+.PHONY: qemu-iso qemu-mb
+qemu-iso: $(ISO_TARGET)
+       $(QEMU_PATH) $(QEMU_FLAGS) -cdrom sydi.iso
+qemu-mb: kernel
+       $(QEMU_PATH) $(QEMU_FLAGS) -kernel kernel/kernel.bin
diff --git a/TODO b/TODO
deleted file mode 100644 (file)
index 128b52a..0000000
--- a/TODO
+++ /dev/null
@@ -1,4 +0,0 @@
-Sychronization:
-
-ACPI:
-- read interrupt source override entry for PIT
diff --git a/bochs b/bochs
deleted file mode 120000 (symlink)
index 43ffd11..0000000
--- a/bochs
+++ /dev/null
@@ -1 +0,0 @@
-.bochs/bochs-2.6/bochs
\ No newline at end of file
diff --git a/bochsrc.txt b/bochsrc.txt
deleted file mode 100644 (file)
index 9664efc..0000000
+++ /dev/null
@@ -1,1119 +0,0 @@
-# You may now use double quotes around pathnames, in case
-# your pathname includes spaces.
-
-#=======================================================================
-# PLUGIN_CTRL:
-# Controls the presence of optional device plugins. These plugins are loaded
-# directly with this option and some of them install a config option that is
-# only available when the plugin device is loaded. The value "1" means to load
-# the plugin and "0" will unload it (if loaded before).
-#
-# These plugins will be loaded by default (if present): 'biosdev', 'extfpuirq',
-# 'gameport', 'iodebug','parallel', 'serial', 'speaker' and 'unmapped'.
-#
-# These plugins are also supported, but they are usually loaded directly with
-# their bochsrc option: 'e1000', 'es1370', 'ne2k', 'pcidev', 'pcipnic', 'sb16',
-# 'usb_ohci', 'usb_uhci' and 'usb_xhci'.
-#=======================================================================
-#plugin_ctrl: unmapped=0, e1000=1 # unload 'unmapped' and load 'e1000'
-
-#=======================================================================
-# CONFIG_INTERFACE
-#
-# The configuration interface is a series of menus or dialog boxes that
-# allows you to change all the settings that control Bochs's behavior.
-# Depending on the platform there are up to 3 choices of configuration
-# interface: a text mode version called "textconfig" and two graphical versions
-# called "win32config" and "wx".  The text mode version uses stdin/stdout and
-# is always compiled in, unless Bochs is compiled for wx only. The choice
-# "win32config" is only available on win32 and it is the default there.
-# The choice "wx" is only available when you use "--with-wx" on the configure
-# command.  If you do not write a config_interface line, Bochs will
-# choose a default for you.
-#
-# NOTE: if you use the "wx" configuration interface, you must also use
-# the "wx" display library.
-#=======================================================================
-config_interface: textconfig
-#config_interface: win32config
-#config_interface: wx
-
-#=======================================================================
-# DISPLAY_LIBRARY
-#
-# The display library is the code that displays the Bochs VGA screen.  Bochs 
-# has a selection of about 10 different display library implementations for 
-# different platforms.  If you run configure with multiple --with-* options, 
-# the display_library command lets you choose which one you want to run with.
-# If you do not write a display_library line, Bochs will choose a default for
-# you.
-#
-# The choices are: 
-#   x              use X windows interface, cross platform
-#   win32          use native win32 libraries
-#   carbon         use Carbon library (for MacOS X)
-#   macintosh      use MacOS pre-10
-#   amigaos        use native AmigaOS libraries
-#   sdl            use SDL library, cross platform
-#   svga           use SVGALIB library for Linux, allows graphics without X11
-#   term           text only, uses curses/ncurses library, cross platform
-#   rfb            provides an interface to AT&T's VNC viewer, cross platform
-#   wx             use wxWidgets library, cross platform
-#   nogui          no display at all
-#
-# NOTE: if you use the "wx" configuration interface, you must also use
-# the "wx" display library.
-#
-# Specific options:
-# Some display libraries now support specific options to control their
-# behaviour. These options are supported by more than one display library:
-#
-# "gui_debug"   - use GTK debugger gui (sdl, x) / Win32 debugger gui (sdl, win32)
-# "hideIPS"     - disable IPS output in status bar (rfb, sdl, win32, wx, x)
-# "nokeyrepeat" - turn off host keyboard repeat (sdl, win32, x)
-#
-# See the examples below for other currently supported options.
-#=======================================================================
-#display_library: amigaos
-#display_library: carbon
-#display_library: macintosh
-#display_library: nogui
-#display_library: rfb, options="timeout=60" # time to wait for client
-#display_library: sdl, options="fullscreen" # startup in fullscreen mode
-#display_library: term
-#display_library: win32
-#display_library: wx
-display_library: x
-
-#=======================================================================
-# ROMIMAGE:
-# The ROM BIOS controls what the PC does when it first powers on.
-# Normally, you can use a precompiled BIOS in the source or binary
-# distribution called BIOS-bochs-latest. The ROM BIOS is usually loaded
-# starting at address 0xf0000, and it is exactly 64k long. Another option
-# is 128k BIOS which is loaded at address 0xe0000.
-# You can also use the environment variable $BXSHARE to specify the
-# location of the BIOS.
-# The usage of external large BIOS images (up to 512k) at memory top is
-# now supported, but we still recommend to use the BIOS distributed with
-# Bochs. The start address optional, since it can be calculated from image size.
-#=======================================================================
-#romimage: file=$BXSHARE/BIOS-bochs-latest 
-romimage: file=.bochs/bochs-2.6/bios/BIOS-bochs-latest
-#romimage: file=bios/seabios-1.6.3.bin
-#romimage: file=mybios.bin, address=0xfff80000 # 512k at memory top
-
-#=======================================================================
-# CPU:
-# This defines cpu-related parameters inside Bochs:
-#
-#  MODEL:
-#    Selects CPU configuration to emulate from pre-defined list of all
-#    supported configurations. When this option is used, the CPUID option
-#    has no effect anymore.
-#
-#  CPU configurations that can be selected:
-# -----------------------------------------------------------------
-#  pentium_mmx                Intel Pentium MMX
-#  amd_k6_2_chomper           AMD-K6(tm) 3D processor (Chomper)
-#  p2_klamath                 Intel Pentium II (Klamath)
-#  p3_katmai                  Intel Pentium III (Katmai)
-#  p4_willamette              Intel(R) Pentium(R) 4 (Willamette)
-#  core_duo_t2400_yonah       Intel(R) Core(TM) Duo CPU T2400 (Yonah)
-#  atom_n270                  Intel(R) Atom(TM) CPU N270
-#  athlon64_clawhammer        AMD Athlon(tm) 64 Processor 2800+ (Clawhammer)
-#  athlon64_venice            AMD Athlon(tm) 64 Processor 3000+ (Venice)
-#  turion64_tyler             AMD Turion(tm) 64 X2 Mobile TL-60 (Tyler)
-#  phenom_8650_toliman        AMD Phenom X3 8650 (Toliman)
-#  p4_prescott_celeron_336    Intel(R) Celeron(R) 336 (Prescott)
-#  core2_penryn_t9600         Intel Mobile Core 2 Duo T9600 (Penryn)
-#  corei5_lynnfield_750       Intel(R) Core(TM) i5   750 (Lynnfield)
-#  corei5_arrandale_m520      Intel(R) Core(TM) i5 M 520 (Arrandale)
-#  corei7_sandy_bridge_2600k  Intel(R) Core(TM) i7-2600K (Sandy Bridge)
-#  corei7_ivy_bridge_3770k    Intel(R) Core(TM) i7-3770K CPU (Ivy Bridge)
-#
-#  COUNT:
-#    Set the number of processors:cores per processor:threads per core 
-#    when Bochs is compiled for SMP emulation.
-#    Bochs currently supports up to 8 threads running simultaniosly. 
-#    If Bochs is compiled without SMP support, it won't accept values 
-#    different from 1.
-#
-#  QUANTUM:
-#    Maximum amount of instructions allowed to execute by processor before
-#    returning control to another cpu. This option exists only in Bochs 
-#    binary compiled with SMP support.
-#
-#  RESET_ON_TRIPLE_FAULT:
-#    Reset the CPU when triple fault occur (highly recommended) rather than
-#    PANIC. Remember that if you trying to continue after triple fault the 
-#    simulation will be completely bogus !
-#
-#  CPUID_LIMIT_WINNT:
-#    Determine whether to limit maximum CPUID function to 2. This mode is
-#    required to workaround WinNT installation and boot issues.
-#
-#  MSRS:
-#    Define path to user CPU Model Specific Registers (MSRs) specification.
-#    See example in msrs.def.
-#
-#  IGNORE_BAD_MSRS:
-#    Ignore MSR references that Bochs does not understand; print a warning
-#    message instead of generating #GP exception. This option is enabled
-#    by default but will not be avaiable if configurable MSRs are enabled.
-#
-#  MWAIT_IS_NOP:
-#    When this option is enabled MWAIT will not put the CPU into a sleep state.
-#    This option exists only if Bochs compiled with --enable-monitor-mwait.
-#
-#  IPS:
-#    Emulated Instructions Per Second. This is the number of IPS that bochs
-#    is capable of running on your machine. You can recompile Bochs with
-#    --enable-show-ips option enabled, to find your host's capability.
-#    Measured IPS value will then be logged into your log file or shown
-#    in the status bar (if supported by the gui).
-#
-#    IPS is used to calibrate many time-dependent events within the bochs 
-#    simulation.  For example, changing IPS affects the frequency of VGA
-#    updates, the duration of time before a key starts to autorepeat, and
-#    the measurement of BogoMips and other benchmarks.
-#
-#  Examples:
-#
-#  Bochs Machine/Compiler                                 Mips
-# ______________________________________________________________________
-#  2.4.6 3.4Ghz Intel Core i7 2600 with Win7x64/g++ 4.5.2 85 to 95 Mips
-#  2.3.7 3.2Ghz Intel Core 2 Q9770 with WinXP/g++ 3.4     50 to 55 Mips
-#  2.3.7 2.6Ghz Intel Core 2 Duo with WinXP/g++ 3.4       38 to 43 Mips
-#  2.2.6 2.6Ghz Intel Core 2 Duo with WinXP/g++ 3.4       21 to 25 Mips
-#  2.2.6 2.1Ghz Athlon XP with Linux 2.6/g++ 3.4          12 to 15 Mips
-#=======================================================================
-cpu: model=core2_penryn_t9600, count=4, ips=30000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
-cpu: cpuid_limit_winnt=0
-
-#=======================================================================
-# CPUID:
-#
-# This defines features and functionality supported by Bochs emulated CPU.
-# The option has no offect if CPU model was selected in CPU option.
-#
-#  MMX:
-#    Select MMX instruction set support.
-#    This option exists only if Bochs compiled with BX_CPU_LEVEL >= 5.
-#
-#  APIC:
-#    Select APIC configuration (LEGACY/XAPIC/XAPIC_EXT/X2APIC).
-#    This option exists only if Bochs compiled with BX_CPU_LEVEL >= 5.
-#
-#  SEP:
-#    Select SYSENTER/SYSEXIT instruction set support.
-#    This option exists only if Bochs compiled with BX_CPU_LEVEL >= 6.
-#
-#  SSE:
-#    Select SSE instruction set support.
-#    Any of NONE/SSE/SSE2/SSE3/SSSE3/SSE4_1/SSE4_2 could be selected.
-#    This option exists only if Bochs compiled with BX_CPU_LEVEL >= 6.
-#
-#  SSE4A:
-#    Select AMD SSE4A instructions support.
-#    This option exists only if Bochs compiled with BX_CPU_LEVEL >= 6.
-#
-#  AES:
-#    Select AES instruction set support.
-#    This option exists only if Bochs compiled with BX_CPU_LEVEL >= 6.
-#
-#  MOVBE:
-#    Select MOVBE Intel(R) Atom instruction support.
-#    This option exists only if Bochs compiled with BX_CPU_LEVEL >= 6.
-#
-#  ADX:
-#    Select ADCX/ADOX instructions support.
-#    This option exists only if Bochs compiled with BX_CPU_LEVEL >= 6.
-#
-#  XSAVE:
-#    Select XSAVE extensions support.
-#    This option exists only if Bochs compiled with BX_CPU_LEVEL >= 6.
-#
-#  XSAVEOPT:
-#    Select XSAVEOPT instruction support.
-#    This option exists only if Bochs compiled with BX_CPU_LEVEL >= 6.
-#
-#  AVX:
-#    Select AVX/AVX2 instruction set support.
-#    This option exists only if Bochs compiled with --enable-avx option.
-#
-#  AVX_F16C:
-#    Select AVX float16 convert instructions support.
-#    This option exists only if Bochs compiled with --enable-avx option.
-#
-#  AVX_FMA:
-#    Select AVX fused multiply add (FMA) instructions support.
-#    This option exists only if Bochs compiled with --enable-avx option.
-#
-#  BMI:
-#    Select BMI1/BMI2 instructions support.
-#    This option exists only if Bochs compiled with --enable-avx option.
-#
-#  XOP:
-#    Select AMD XOP instructions support.
-#    This option exists only if Bochs compiled with --enable-avx option.
-#
-#  FMA4:
-#    Select AMD four operand FMA instructions support.
-#    This option exists only if Bochs compiled with --enable-avx option.
-#
-#  TBM:
-#    Select AMD Trailing Bit Manipulation (TBM) instructions support.
-#    This option exists only if Bochs compiled with --enable-avx option.
-#
-#  X86-64:
-#    Enable x86-64 and long mode support.
-#    This option exists only if Bochs compiled with x86-64 support.
-#
-#  1G_PAGES:
-#    Enable 1G page size support in long mode.
-#    This option exists only if Bochs compiled with x86-64 support.
-#
-#  PCID:
-#    Enable Process-Context Identifiers (PCID) support in long mode.
-#    This option exists only if Bochs compiled with x86-64 support.
-#
-#  FSGSBASE:
-#    Enable GS/GS BASE access instructions support in long mode.
-#    This option exists only if Bochs compiled with x86-64 support.
-#
-#  SMEP:
-#    Enable Supervisor Mode Execution Protection (SMEP) support.
-#    This option exists only if Bochs compiled with BX_CPU_LEVEL >= 6.
-#
-#  MWAIT:
-#    Select MONITOR/MWAIT instructions support.
-#    This option exists only if Bochs compiled with --enable-monitor-mwait.
-#
-#  VMX:
-#    Select VMX extensions emulation support.
-#    This option exists only if Bochs compiled with --enable-vmx option.
-#
-#  VENDOR_STRING:
-#    Set the CPUID vendor string returned by CPUID(0x0). This should be a
-#    twelve-character ASCII string.  
-#
-#  BRAND_STRING:
-#    Set the CPUID vendor string returned by CPUID(0x80000002 .. 0x80000004).  
-#    This should be at most a forty-eight-character ASCII string.  
-#
-#  FAMILY:
-#    Set model information returned by CPUID. Default family value determined
-#    by configure option --enable-cpu-level.
-#
-#  MODEL:
-#    Set model information returned by CPUID. Default model value is 3.
-#
-#  STEPPING:
-#    Set stepping information returned by CPUID. Default stepping value is 3.
-#=======================================================================
-#cpuid: x86_64=1, mmx=1, sep=1, sse=sse4_2, apic=xapic, aes=1, movbe=1, xsave=1
-#cpuid: family=6, model=0x1a, stepping=5
-
-#=======================================================================
-# MEMORY
-# Set the amount of physical memory you want to emulate.
-#
-# GUEST:
-# Set amount of guest physical memory to emulate. The default is 32MB,
-# the maximum amount limited only by physical address space limitations.
-#
-# HOST:
-# Set amount of host memory you want to allocate for guest RAM emulation.
-# It is possible to allocate less memory than you want to emulate in guest
-# system. This will fake guest to see the non-existing memory. Once guest
-# system touches new memory block it will be dynamically taken from the
-# memory pool. You will be warned (by FATAL PANIC) in case guest already
-# used all allocated host memory and wants more.
-#
-#=======================================================================
-memory: guest=512, host=512
-
-#=======================================================================
-# OPTROMIMAGE[1-4]:
-# You may now load up to 4 optional ROM images. Be sure to use a 
-# read-only area, typically between C8000 and EFFFF. These optional
-# ROM images should not overwrite the rombios (located at
-# F0000-FFFFF) and the videobios (located at C0000-C7FFF).
-# Those ROM images will be initialized by the bios if they contain 
-# the right signature (0x55AA) and a valid checksum.
-# It can also be a convenient way to upload some arbitrary code/data
-# in the simulation, that can be retrieved by the boot loader
-#=======================================================================
-#optromimage1: file=optionalrom.bin, address=0xd0000
-#optromimage2: file=optionalrom.bin, address=0xd1000
-#optromimage3: file=optionalrom.bin, address=0xd2000
-#optromimage4: file=optionalrom.bin, address=0xd3000
-
-#optramimage1: file=/path/file1.img, address=0x0010000
-#optramimage2: file=/path/file2.img, address=0x0020000
-#optramimage3: file=/path/file3.img, address=0x0030000
-#optramimage4: file=/path/file4.img, address=0x0040000
-
-#=======================================================================
-# VGAROMIMAGE
-# You now need to load a VGA ROM BIOS into C0000.
-#=======================================================================
-#vgaromimage: file=bios/VGABIOS-elpin-2.40
-vgaromimage: file=.bochs/bochs-2.6/bios/VGABIOS-lgpl-latest
-#vgaromimage: file=bios/VGABIOS-lgpl-latest-cirrus
-
-#=======================================================================
-# VGA:
-# This defines parameters related to the VGA display
-#
-#   EXTENSION
-#     Here you can specify the display extension to be used. With the value
-#     'none' you can use standard VGA with no extension. Other supported
-#     values are 'vbe' for Bochs VBE and 'cirrus' for Cirrus SVGA support.
-#
-#   UPDATE_FREQ
-#     The VGA update frequency is based on the emulated clock and the default
-#     value is 5. Keep in mind that you must tweak the 'cpu: ips=N' directive
-#     to be as close to the number of emulated instructions-per-second your
-#     workstation can do, for this to be accurate. If the realtime sync is
-#     enabled with the 'clock' option, the value is based on the real time.
-#     This parameter can be changed at runtime.
-#
-# Examples:
-#   vga: extension=cirrus, update_freq=10
-#=======================================================================
-vga: extension=vbe, update_freq=30
-
-#=======================================================================
-# FLOPPYA:
-# Point this to pathname of floppy image file or device
-# This should be of a bootable floppy(image/device) if you're
-# booting from 'a' (or 'floppy').
-#
-# You can set the initial status of the media to 'ejected' or 'inserted'.
-#   floppya: 2_88=path, status=ejected    (2.88M 3.5"  media)
-#   floppya: 1_44=path, status=inserted   (1.44M 3.5"  media)
-#   floppya: 1_2=path, status=ejected     (1.2M  5.25" media)
-#   floppya: 720k=path, status=inserted   (720K  3.5"  media)
-#   floppya: 360k=path, status=inserted   (360K  5.25" media)
-#   floppya: 320k=path, status=inserted   (320K  5.25" media)
-#   floppya: 180k=path, status=inserted   (180K  5.25" media)
-#   floppya: 160k=path, status=inserted   (160K  5.25" media)
-#   floppya: image=path, status=inserted  (guess media type from image size)
-#   floppya: 1_44=vvfat:path, status=inserted  (use directory as VFAT media)
-#   floppya: type=1_44                    (1.44M 3.5" floppy drive, no media)
-#
-# The path should be the name of a disk image file.  On Unix, you can use a raw
-# device name such as /dev/fd0 on Linux.  On win32 platforms, use drive letters
-# such as a: or b: as the path.  The parameter 'image' works with image files
-# only. In that case the size must match one of the supported types.
-# The parameter 'type' can be used to enable the floppy drive without media
-# and status specified. Usually the drive type is set up based on the media type.
-# The optional parameter 'write_protected' can be used to control the media
-# write protect switch. By default it is turned off.
-#=======================================================================
-#floppya: 1_44=/dev/fd0, status=inserted
-#floppya: image=../1.44, status=inserted
-#floppya: 1_44=/dev/fd0H1440, status=inserted
-#floppya: 1_2=../1_2, status=inserted
-#floppya: 1_44=a:, status=inserted
-#floppya: 1_44=a.img, status=inserted, write_protected=1
-#floppya: 1_44=/dev/rfd0a, status=inserted
-
-#=======================================================================
-# FLOPPYB:
-# See FLOPPYA above for syntax
-#=======================================================================
-#floppyb: 1_44=b:, status=inserted
-#floppyb: 1_44=b.img, status=inserted
-
-#=======================================================================
-# ATA0, ATA1, ATA2, ATA3
-# ATA controller for hard disks and cdroms
-#
-# ata[0-3]: enabled=[0|1], ioaddr1=addr, ioaddr2=addr, irq=number
-# 
-# These options enables up to 4 ata channels. For each channel
-# the two base io addresses and the irq must be specified.
-# 
-# ata0 and ata1 are enabled by default with the values shown below
-#
-# Examples:
-#   ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
-#   ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
-#   ata2: enabled=1, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
-#   ata3: enabled=1, ioaddr1=0x168, ioaddr2=0x360, irq=9
-#=======================================================================
-ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
-ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
-ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
-ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9
-
-#=======================================================================
-# ATA[0-3]-MASTER, ATA[0-3]-SLAVE
-#
-# This defines the type and characteristics of all attached ata devices:
-#   type=       type of attached device [disk|cdrom] 
-#   mode=       only valid for disks [flat|concat|external|dll|sparse|vmware3]
-#                                    [vmware4|undoable|growing|volatile|vpc|vvfat]
-#   path=       path of the image / directory
-#   cylinders=  only valid for disks
-#   heads=      only valid for disks
-#   spt=        only valid for disks
-#   status=     only valid for cdroms [inserted|ejected]
-#   biosdetect= type of biosdetection [none|auto], only for disks on ata0 [cmos]
-#   translation=type of translation of the bios, only for disks [none|lba|large|rechs|auto]
-#   model=      string returned by identify device command
-#   journal=    optional filename of the redolog for undoable, volatile and vvfat disks
-#
-# Point this at a hard disk image file, cdrom iso file, or physical cdrom
-# device.  To create a hard disk image, try running bximage.  It will help you
-# choose the size and then suggest a line that works with it.
-#
-# In UNIX it may be possible to use a raw device as a Bochs hard disk, 
-# but WE DON'T RECOMMEND IT.  In Windows there is no easy way.
-#
-# In windows, the drive letter + colon notation should be used for cdroms.
-# Depending on versions of windows and drivers, you may only be able to 
-# access the "first" cdrom in the system.  On MacOSX, use path="drive"
-# to access the physical drive.
-#
-# The path is mandatory for hard disks. Disk geometry autodetection works with
-# images created by bximage if CHS is set to 0/0/0 (cylinders are calculated
-# using  heads=16 and spt=63). For other hard disk images and modes the
-# cylinders, heads, and spt are mandatory. In all cases the disk size reported
-# from the image must be exactly C*H*S*512.
-#
-# Default values are:
-#   mode=flat, biosdetect=auto, translation=auto, model="Generic 1234"
-#
-# The biosdetect option has currently no effect on the bios
-#
-# Examples:
-#   ata0-master: type=disk, mode=flat, path=10M.sample, cylinders=306, heads=4, spt=17
-#   ata0-slave:  type=disk, mode=flat, path=20M.sample, cylinders=615, heads=4, spt=17
-#   ata1-master: type=disk, mode=flat, path=30M.sample, cylinders=615, heads=6, spt=17
-#   ata1-slave:  type=disk, mode=flat, path=46M.sample, cylinders=940, heads=6, spt=17
-#   ata2-master: type=disk, mode=flat, path=62M.sample, cylinders=940, heads=8, spt=17
-#   ata2-slave:  type=disk, mode=flat, path=112M.sample, cylinders=900, heads=15, spt=17
-#   ata3-master: type=disk, mode=flat, path=483M.sample, cylinders=1024, heads=15, spt=63
-#   ata3-slave:  type=cdrom, path=iso.sample, status=inserted
-#=======================================================================
-ata0-master: type=cdrom, path="sydi.iso", status=inserted, biosdetect=auto, model="Generic 1234"
-#ata0-master: type=disk, mode=flat, path="30M.sample"
-#ata0-master: type=disk, mode=flat, path="30M.sample", cylinders=615, heads=6, spt=17
-#ata0-master: type=disk, mode=flat, path="c.img", cylinders=0 # autodetect
-#ata0-slave: type=disk, mode=vvfat, path=/bochs/images/vvfat, journal=vvfat.redolog
-#ata0-slave: type=cdrom, path=D:, status=inserted
-#ata0-slave: type=cdrom, path=/dev/cdrom, status=inserted
-#ata0-slave: type=cdrom, path="drive", status=inserted
-#ata0-slave: type=cdrom, path=/dev/rcd0d, status=inserted 
-
-#=======================================================================
-# BOOT:
-# This defines the boot sequence. Now you can specify up to 3 boot drives,
-# which can be 'floppy', 'disk', 'cdrom' or 'network' (boot ROM).
-# Legacy 'a' and 'c' are also supported.
-# Examples:
-#   boot: floppy
-#   boot: cdrom, disk
-#   boot: network, disk
-#   boot: cdrom, floppy, disk
-#=======================================================================
-#boot: floppy
-boot: cdrom,disk
-
-#=======================================================================
-# CLOCK:
-# This defines the parameters of the clock inside Bochs:
-#
-#  SYNC:
-#  This defines the method how to synchronize the Bochs internal time
-#  with realtime. With the value 'none' the Bochs time relies on the IPS
-#  value and no host time synchronization is used. The 'slowdown' method
-#  sacrifices performance to preserve reproducibility while allowing host
-#  time correlation. The 'realtime' method sacrifices reproducibility to
-#  preserve performance and host-time correlation.
-#  It is possible to enable both synchronization methods.
-#
-#  RTC_SYNC:
-#  If this option is enabled together with the realtime synchronization,
-#  the RTC runs at realtime speed. This feature is disabled by default.
-#
-#  TIME0:
-#  Specifies the start (boot) time of the virtual machine. Use a time 
-#  value as returned by the time(2) system call. If no time0 value is 
-#  set or if time0 equal to 1 (special case) or if time0 equal 'local', 
-#  the simulation will be started at the current local host time.
-#  If time0 equal to 2 (special case) or if time0 equal 'utc',
-#  the simulation will be started at the current utc time.
-#
-# Syntax:
-#  clock: sync=[none|slowdown|realtime|both], time0=[timeValue|local|utc]
-#
-# Example:
-#   clock: sync=none,     time0=local       # Now (localtime)
-#   clock: sync=slowdown, time0=315529200   # Tue Jan  1 00:00:00 1980
-#   clock: sync=none,     time0=631148400   # Mon Jan  1 00:00:00 1990
-#   clock: sync=realtime, time0=938581955   # Wed Sep 29 07:12:35 1999
-#   clock: sync=realtime, time0=946681200   # Sat Jan  1 00:00:00 2000
-#   clock: sync=none,     time0=1           # Now (localtime)
-#   clock: sync=none,     time0=utc         # Now (utc/gmt)
-# 
-# Default value are sync=none, time0=local
-#=======================================================================
-#clock: sync=none, time0=local
-clock: sync=both,time0=utc
-
-
-#=======================================================================
-# FLOPPY_BOOTSIG_CHECK: disabled=[0|1]
-# Enables or disables the 0xaa55 signature check on boot floppies
-# Defaults to disabled=0
-# Examples:
-#   floppy_bootsig_check: disabled=0
-#   floppy_bootsig_check: disabled=1
-#=======================================================================
-floppy_bootsig_check: disabled=0
-
-#=======================================================================
-# LOG:
-# Give the path of the log file you'd like Bochs debug and misc. verbiage
-# to be written to. If you don't use this option or set the filename to
-# '-' the output is written to the console. If you really don't want it,
-# make it "/dev/null" (Unix) or "nul" (win32). :^(
-#
-# Examples:
-#   log: ./bochs.out
-#   log: /dev/tty
-#=======================================================================
-#log: /dev/null
-log: bochsout.txt
-
-#=======================================================================
-# LOGPREFIX:
-# This handles the format of the string prepended to each log line.
-# You may use those special tokens :
-#   %t : 11 decimal digits timer tick
-#   %i : 8 hexadecimal digits of cpu current eip (ignored in SMP configuration)
-#   %e : 1 character event type ('i'nfo, 'd'ebug, 'p'anic, 'e'rror)
-#   %d : 5 characters string of the device, between brackets
-# 
-# Default : %t%e%d
-# Examples:
-#   logprefix: %t-%e-@%i-%d
-#   logprefix: %i%e%d
-#=======================================================================
-#logprefix: %t%e%d
-
-#=======================================================================
-# LOG CONTROLS
-#
-# Bochs has four severity levels for event logging.
-#   panic: cannot proceed.  If you choose to continue after a panic, 
-#          don't be surprised if you get strange behavior or crashes.
-#   error: something went wrong, but it is probably safe to continue the
-#          simulation.
-#   info: interesting or useful messages.
-#   debug: messages useful only when debugging the code.  This may
-#          spit out thousands per second.
-#
-# For events of each level, you can choose to exit Bochs ('fatal'), 'report'
-# or 'ignore'. On some guis you have the additional choice 'ask'. A gui dialog
-# appears asks how to proceed.
-#
-# It is also possible to specify the 'action' to do for each Bochs facility
-# separately (e.g. crash on panics from everything except the cdrom, and only
-# report those). See the 'log function' module list in the user documentation.
-#
-# If you are experiencing many panics, it can be helpful to change
-# the panic action to report instead of fatal.  However, be aware
-# that anything executed after a panic is uncharted territory and can 
-# cause bochs to become unstable.  The panic is a "graceful exit," so
-# if you disable it you may get a spectacular disaster instead.
-#=======================================================================
-panic: action=ask
-error: action=report
-info: action=report
-#debug: action=ignore#, pci=report # report BX_DEBUG from module 'pci'
-
-#=======================================================================
-# DEBUGGER_LOG:
-# Give the path of the log file you'd like Bochs to log debugger output.
-# If you really don't want it, make it /dev/null or '-'. :^(
-#
-# Examples:
-#   debugger_log: ./debugger.out
-#=======================================================================
-#debugger_log: /dev/null
-#debugger_log: debugger.out
-debugger_log: -
-
-#=======================================================================
-# COM1, COM2, COM3, COM4:
-# This defines a serial port (UART type 16550A). In the 'term' you can specify
-# a device to use as com1. This can be a real serial line, or a pty.  To use
-# a pty (under X/Unix), create two windows (xterms, usually).  One of them will
-# run bochs, and the other will act as com1. Find out the tty the com1
-# window using the `tty' command, and use that as the `dev' parameter.
-# Then do `sleep 1000000' in the com1 window to keep the shell from
-# messing with things, and run bochs in the other window.  Serial I/O to
-# com1 (port 0x3f8) will all go to the other window.
-# In socket* and pipe* (win32 only) modes Bochs becomes either socket/named pipe
-# client or server. In client mode it connects to an already running server (if
-# connection fails Bochs treats com port as not connected). In server mode it
-# opens socket/named pipe and waits until a client application connects to it
-# before starting simulation. This mode is useful for remote debugging (e.g.
-# with gdb's "target remote host:port" command or windbg's command line option
-# -k com:pipe,port=\\.\pipe\pipename). Note: 'socket' is a shorthand for
-# 'socket-client' and 'pipe' for 'pipe-client'. Socket modes use simple TCP
-# communication, pipe modes use duplex byte mode pipes.
-# Other serial modes are 'null' (no input/output), 'file' (output to a file
-# specified as the 'dev' parameter), 'raw' (use the real serial port - under
-# construction for win32), 'mouse' (standard serial mouse - requires
-# mouse option setting 'type=serial', 'type=serial_wheel' or 'type=serial_msys').
-#
-# Examples:
-#   com1: enabled=1, mode=null
-#   com1: enabled=1, mode=mouse
-#   com2: enabled=1, mode=file, dev=serial.out
-#   com3: enabled=1, mode=raw, dev=com1
-#   com3: enabled=1, mode=socket-client, dev=localhost:8888
-#   com3: enabled=1, mode=socket-server, dev=localhost:8888
-#   com4: enabled=1, mode=pipe-client, dev=\\.\pipe\mypipe
-#   com4: enabled=1, mode=pipe-server, dev=\\.\pipe\mypipe
-#=======================================================================
-#com1: enabled=1, mode=term, dev=/dev/ttyp9
-
-
-#=======================================================================
-# PARPORT1, PARPORT2:
-# This defines a parallel (printer) port. When turned on and an output file is
-# defined the emulated printer port sends characters printed by the guest OS
-# into the output file. On some platforms a device filename can be used to
-# send the data to the real parallel port (e.g. "/dev/lp0" on Linux, "lpt1" on
-# win32 platforms).
-#
-# Examples:
-#   parport1: enabled=1, file="parport.out"
-#   parport2: enabled=1, file="/dev/lp0"
-#   parport1: enabled=0
-#=======================================================================
-parport1: enabled=0, file="parport.out"
-
-#=======================================================================
-# SB16:
-# This defines the SB16 sound emulation. It can have several of the
-# following properties.
-# All properties are in the format sb16: property=value
-# enabled:
-#      This optional property controls the presence of the SB16 emulation.
-#      The emulation is turned on unless this property is used and set to 0.
-# midi: The filename is where the midi data is sent. This can be a
-#       device or just a file if you want to record the midi data.
-# midimode:
-#      0=no data
-#      1=output to device (system dependent. midi denotes the device driver)
-#      2=SMF file output, including headers
-#      3=output the midi data stream to the file (no midi headers and no
-#        delta times, just command and data bytes)
-# wave: This is the device/file where wave output is stored
-# wavemode:
-#      0=no data
-#      1=output to device (system dependent. wave denotes the device driver)
-#      2=VOC file output, incl. headers
-#      3=output the raw wave stream to the file
-# log:  The file to write the sb16 emulator messages to.
-# loglevel:
-#      0=no log
-#      1=resource changes, midi program and bank changes
-#      2=severe errors
-#      3=all errors
-#      4=all errors plus all port accesses
-#      5=all errors and port accesses plus a lot of extra info
-# dmatimer:
-#      microseconds per second for a DMA cycle.  Make it smaller to fix
-#      non-continuous sound.  750000 is usually a good value.  This needs a
-#      reasonably correct setting for the IPS parameter of the CPU option.
-#
-# Examples for output devices:
-#   sb16: midimode=1, midi="", wavemode=1, wave=""           # win32
-#   sb16: midimode=1, midi=alsa:128:0, wavemode=1, wave=alsa # Linux with ALSA
-#   sb16: wavemode=1, wave=sdl # use SDL audio (if present) for output
-#=======================================================================
-#sb16: midimode=1, midi=/dev/midi00, wavemode=1, wave=/dev/dsp, loglevel=2, log=sb16.log, dmatimer=600000
-
-#=======================================================================
-# ES1370:
-# This defines the ES1370 sound emulation. The parameter 'enabled' controls the
-# presence of the device. The 'wavedev' parameter is similar to the 'wave'
-# parameter of the SB16 soundcard. The emulation supports recording and playback
-# (except DAC1+DAC2 output at the same time).
-#
-# Examples:
-#   es1370: enabled=1, wavedev=""    # win32
-#   es1370: enabled=1, wavedev=alsa  # Linux with ALSA
-#   es1370: enabled=1, wavedev=sdl   # use SDL audio (if present) for output
-#=======================================================================
-#es1370: enabled=1, wavedev=alsa
-
-#=======================================================================
-# KEYBOARD:
-# This defines parameters related to the emulated keyboard
-#
-#   TYPE:
-#     Type of keyboard return by a "identify keyboard" command to the
-#     keyboard controller. It must be one of "xt", "at" or "mf".
-#     Defaults to "mf". It should be ok for almost everybody. A known
-#     exception is french macs, that do have a "at"-like keyboard.
-#
-#   SERIAL_DELAY:
-#     Approximate time in microseconds that it takes one character to
-#     be transferred from the keyboard to controller over the serial path.
-#
-#   PASTE_DELAY:
-#     Approximate time in microseconds between attempts to paste
-#     characters to the keyboard controller. This leaves time for the
-#     guest os to deal with the flow of characters.  The ideal setting
-#     depends on how your operating system processes characters.  The
-#     default of 100000 usec (.1 seconds) was chosen because it works 
-#     consistently in Windows.
-#     If your OS is losing characters during a paste, increase the paste
-#     delay until it stops losing characters.
-#
-#   KEYMAP:
-#     This enables a remap of a physical localized keyboard to a
-#     virtualized us keyboard, as the PC architecture expects.
-#
-# Examples:
-#   keyboard: type=mf, serial_delay=200, paste_delay=100000
-#   keyboard: keymap=gui/keymaps/x11-pc-de.map
-#=======================================================================
-#keyboard: type=mf, serial_delay=250
-
-#=======================================================================
-# MOUSE:
-# This defines parameters for the emulated mouse type, the initial status
-# of the mouse capture and the runtime method to toggle it.
-#
-#  TYPE:
-#  With the mouse type option you can select the type of mouse to emulate.
-#  The default value is 'ps2'. The other choices are 'imps2' (wheel mouse
-#  on PS/2), 'serial', 'serial_wheel' and 'serial_msys' (one com port requires
-#  setting 'mode=mouse'). To connect a mouse to an USB port, see the 'usb_uhci',
-#  'usb_ohci' or 'usb_xhci' options (requires PCI and USB support).
-#
-#  ENABLED:
-#  The Bochs gui creates mouse "events" unless the 'enabled' option is
-#  set to 0. The hardware emulation itself is not disabled by this.
-#  Unless you have a particular reason for enabling the mouse by default,
-#  it is recommended that you leave it off. You can also toggle the mouse
-#  usage at runtime (RFB, SDL, Win32, wxWidgets and X11 - see below).
-#
-#  TOGGLE:
-#  The default method to toggle the mouse capture at runtime is to press the
-#  CTRL key and the middle mouse button ('ctrl+mbutton'). This option allows
-#  to change the method to 'ctrl+f10' (like DOSBox), 'ctrl+alt' (like QEMU)
-#  or 'f12' (replaces win32 'legacyF12' option).
-#
-# Examples:
-#   mouse: enabled=1
-#   mouse: type=imps2, enabled=1
-#   mouse: type=serial, enabled=1
-#   mouse: enabled=0, toggle=ctrl+f10
-#=======================================================================
-mouse: enabled=0
-
-#=======================================================================
-# private_colormap: Request that the GUI create and use it's own
-#                   non-shared colormap.  This colormap will be used
-#                   when in the bochs window.  If not enabled, a
-#                   shared colormap scheme may be used.  Not implemented
-#                   on all GUI's.
-#
-# Examples:
-#   private_colormap: enabled=1
-#   private_colormap: enabled=0
-#=======================================================================
-private_colormap: enabled=0
-
-#=======================================================================
-# fullscreen: ONLY IMPLEMENTED ON AMIGA
-#             Request that Bochs occupy the entire screen instead of a 
-#             window.
-#
-# Examples:
-#   fullscreen: enabled=0
-#   fullscreen: enabled=1
-#=======================================================================
-#fullscreen: enabled=0
-#screenmode: name="sample"
-
-#=======================================================================
-# ne2k: NE2000 compatible ethernet adapter
-#
-# Format:
-# ne2k: enabled=1, ioaddr=IOADDR, irq=IRQ, mac=MACADDR, ethmod=MODULE,
-#       ethdev=DEVICE, script=SCRIPT, bootrom=BOOTROM
-#
-# IOADDR, IRQ: You probably won't need to change ioaddr and irq, unless there
-# are IRQ conflicts. These arguments are ignored when assign the ne2k to a
-# PCI slot.
-#
-# MAC: The MAC address MUST NOT match the address of any machine on the net.
-# Also, the first byte must be an even number (bit 0 set means a multicast
-# address), and you cannot use ff:ff:ff:ff:ff:ff because that's the broadcast
-# address.  For the ethertap module, you must use fe:fd:00:00:00:01.  There may
-# be other restrictions too.  To be safe, just use the b0:c4... address.
-#
-# ETHDEV: The ethdev value is the name of the network interface on your host
-# platform.  On UNIX machines, you can get the name by running ifconfig.  On
-# Windows machines, you must run niclist to get the name of the ethdev.
-# Niclist source code is in misc/niclist.c and it is included in Windows 
-# binary releases.
-#
-# SCRIPT: The script value is optional, and is the name of a script that 
-# is executed after bochs initialize the network interface. You can use 
-# this script to configure this network interface, or enable masquerading.
-# This is mainly useful for the tun/tap devices that only exist during
-# Bochs execution. The network interface name is supplied to the script
-# as first parameter.
-#
-# BOOTROM: The bootrom value is optional, and is the name of the ROM image
-# to load. Note that this feature is only implemented for the PCI version of
-# the NE2000.
-#
-# If you don't want to make connections to any physical networks,
-# you can use the following 'ethmod's to simulate a virtual network.
-#   null: All packets are discarded, but logged to a few files.
-#   vde:  Virtual Distributed Ethernet
-#   vnet: ARP, ICMP-echo(ping), DHCP and read/write TFTP are simulated.
-#         The virtual host uses 192.168.10.1.
-#         DHCP assigns 192.168.10.2 to the guest.
-#         TFTP uses the 'ethdev' value for the root directory and doesn't
-#         overwrite files.
-#
-#=======================================================================
-# ne2k: ioaddr=0x300, irq=9, mac=fe:fd:00:00:00:01, ethmod=fbsd, ethdev=en0 #macosx
-# ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:00, ethmod=fbsd, ethdev=xl0
-# ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:00, ethmod=linux, ethdev=eth0
-# ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:01, ethmod=win32, ethdev=MYCARD
-# ne2k: ioaddr=0x300, irq=9, mac=fe:fd:00:00:00:01, ethmod=tap, ethdev=tap0
-# ne2k: ioaddr=0x300, irq=9, mac=fe:fd:00:00:00:01, ethmod=tuntap, ethdev=/dev/net/tun0, script=./tunconfig
-# ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:01, ethmod=null, ethdev=eth0
-# ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:01, ethmod=vde, ethdev="/tmp/vde.ctl"
-# ne2k: ioaddr=0x300, irq=9, mac=b0:c4:20:00:00:01, ethmod=vnet, ethdev="c:/temp"
-# ne2k: mac=b0:c4:20:00:00:01, ethmod=slirp, script=/usr/local/bin/slirp, bootrom=ne2k_pci.rom
-
-#=======================================================================
-# pcipnic: Bochs/Etherboot pseudo-NIC
-#
-# Format:
-# pcipnic: enabled=1, mac=MACADDR, ethmod=MODULE, ethdev=DEVICE, script=SCRIPT,
-#          bootrom=BOOTROM
-#
-# The pseudo-NIC accepts the same syntax (for mac, ethmod, ethdev, script,
-# bootrom) and supports the same networking modules as the NE2000 adapter.
-#=======================================================================
-#pcipnic: enabled=1, mac=b0:c4:20:00:00:00, ethmod=vnet
-
-#=======================================================================
-# e1000: Intel(R) 82540EM Gigabit Ethernet adapter
-#
-# Format:
-# e1000: enabled=1, mac=MACADDR, ethmod=MODULE, ethdev=DEVICE, script=SCRIPT
-#        bootrom=BOOTROM
-#
-# The E1000 accepts the same syntax (for mac, ethmod, ethdev, script, bootrom)
-# and supports the same networking modules as the NE2000 adapter.
-#=======================================================================
-#e1000: enabled=1, mac=52:54:00:12:34:56, ethmod=slirp, script=/usr/local/bin/slirp
-
-#=======================================================================
-# USER_SHORTCUT:
-# This defines the keyboard shortcut to be sent when you press the "user"
-# button in the headerbar. The shortcut string is a combination of maximum
-# 3 key names (listed below) separated with a '-' character.
-# Valid key names:
-# "alt", "bksl", "bksp", "ctrl", "del", "down", "end", "enter", "esc",
-# "f1", ... "f12", "home", "ins", "left", "menu", "minus", "pgdwn", "pgup",
-# "plus", "right", "shift", "space", "tab", "up", "win", "print" and "power".
-#
-# Example:
-#   user_shortcut: keys=ctrl-alt-del
-#=======================================================================
-#user_shortcut: keys=ctrl-alt-del
-
-#=======================================================================
-# PCI:
-# This option controls the presence of a PCI chipset in Bochs. Currently it only
-# supports the i440FX chipset. You can also specify the devices connected to
-# PCI slots. Up to 5 slots are available. For these combined PCI/ISA devices
-# assigning to slot is mandatory if you want to emulate the PCI model: cirrus,
-# ne2k and pcivga. These PCI-only devices are also supported, but they are
-# auto-assigned if you don't use the slot configuration: e1000, es1370, pcidev,
-# pcipnic, usb_ohci and usb_xhci.
-#
-# Example:
-#   pci: enabled=1, chipset=i440fx, slot1=pcivga, slot2=ne2k
-#=======================================================================
-pci: enabled=1, chipset=i440fx
-
-#=======================================================================
-# USB_UHCI:
-# This option controls the presence of the USB root hub which is a part
-# of the i440FX PCI chipset. With the portX parameter you can connect devices
-# to the hub (currently supported: 'mouse', 'tablet', 'keypad', 'disk', 'cdrom'
-# 'hub' and 'printer').
-#
-# The optionsX parameter can be used to assign specific options to the device
-# connected to the corresponding USB port. Currently this feature is only used
-# to set the speed reported by device and by the 'disk' device to specify
-# an alternative redolog file of some image modes.
-#
-# If you connect the mouse or tablet to one of the ports, Bochs forwards the
-# mouse movement data to the USB device instead of the selected mouse type.
-# When connecting the keypad to one of the ports, Bochs forwards the input of
-# the numeric keypad to the USB device instead of the PS/2 keyboard.
-#
-# To connect a 'flat' mode image as an USB hardisk you can use the 'disk' device
-# with the path to the image separated with a colon. To use other disk image modes
-# similar to ATA disks the syntax 'disk:mode:filename' must be used (see below).
-#
-# To emulate an USB cdrom you can use the 'cdrom' device name and the path to
-# an ISO image or raw device name also separated with a colon. An option to
-# insert/eject media is available in the runtime configuration.
-#
-# The device name 'hub' connects an external hub with max. 8 ports (default: 4)
-# to the root hub. To specify the number of ports you have to add the value
-# separated with a colon. Connecting devices to the external hub ports is only
-# available in the runtime configuration.
-#
-# The device 'printer' emulates the HP Deskjet 920C printer. The PCL data is
-# sent to a file specified in bochsrc.txt. The current code appends the PCL
-# code to the file if the file already existed. It would probably be nice to
-# overwrite the file instead, asking user first.
-#=======================================================================
-#usb_uhci: enabled=1
-#usb_uhci: enabled=1, port1=mouse, port2=disk:usbstick.img
-#usb_uhci: enabled=1, port1=hub:7, port2=disk:growing:usbdisk.img
-#usb_uhci: enabled=1, port2=disk:undoable:usbdisk.img, options1=journal:redo.log
-#usb_uhci: enabled=1, port1=printer:printdata.bin, port2=cdrom:image.iso
-
-#=======================================================================
-# USB_OHCI:
-# This option controls the presence of the USB OHCI host controller with a
-# 2-port hub. The portX option accepts the same device types with the same
-# syntax as the UHCI controller (see above).
-#=======================================================================
-#usb_ohci: enabled=1
-#usb_ohci: enabled=1, port1=printer:usbprinter.bin
-
-#=======================================================================
-# USB_XHCI:
-# This option controls the presence of the experimental USB xHCI host controller
-# with a 4-port hub. The portX option accepts the same device types with the
-# same syntax as the UHCI controller (see above).
-#=======================================================================
-#usb_xhci: enabled=1
-
-#=======================================================================
-# CMOSIMAGE:
-# This defines image file that can be loaded into the CMOS RAM at startup.
-# The rtc_init parameter controls whether initialize the RTC with values stored
-# in the image. By default the time0 argument given to the clock option is used.
-# With 'rtc_init=image' the image is the source for the initial time.
-#
-# Example:
-#   cmosimage: file=cmos.img, rtc_init=image
-#=======================================================================
-#cmosimage: file=cmos.img, rtc_init=time0
-
-#=======================================================================
-# MAGIC_BREAK:
-# This enables the "magic breakpoint" feature when using the debugger.
-# The useless cpu instruction XCHG BX, BX causes Bochs to enter the
-# debugger mode. This might be useful for software development.
-#
-# Example:
-#   magic_break: enabled=1
-#=======================================================================
-magic_break: enabled=1
-
-#=======================================================================
-# PORT_E9_HACK:
-# The 0xE9 port doesn't exists in normal ISA architecture. However, we
-# define a convention here, to display on the console of the system running
-# Bochs anything that is written to it. The idea is to provide debug output
-# very early when writing BIOS or OS code for example, without having to
-# bother with setting up a serial port or etc. Reading from port 0xE9 will
-# will return 0xe9 to let you know if the feature is available.
-# Leave this 0 unless you have a reason to use it.
-#
-# Example:
-#   port_e9_hack: enabled=1
-#=======================================================================
-#port_e9_hack: enabled=1
-
-#=======================================================================
-# DEBUG_SYMBOLS:
-# This loads symbols from the specified file for use in Bochs' internal
-# debugger. Symbols are loaded into global context. This is equivalent to
-# issuing ldsym debugger command at start up.
-#
-# Example:
-#   debug_symbols: file="kernel.sym"
-#   debug_symbols: file="kernel.sym", offset=0x80000000
-#=======================================================================
-#debug_symbols: file="kernel.sym"
-
-#=======================================================================
-# other stuff
-#=======================================================================
-#load32bitOSImage: os=nullkernel, path=../kernel.img, iolog=../vga_io.log
-#load32bitOSImage: os=linux, path=../linux.img, iolog=../vga_io.log, initrd=../initrd.img
-#print_timestamps: enabled=1
-
-#-------------------------
-# PCI host device mapping
-#-------------------------
-#pcidev: vendor=0x1234, device=0x5678
-
-#=======================================================================
-# GDBSTUB:
-# Enable GDB stub. See user documentation for details.
-# Default value is enabled=0.
-#=======================================================================
-#gdbstub: enabled=0, port=1234, text_base=0, data_base=0, bss_base=0
-
-#=======================================================================
-# USER_PLUGIN:
-# Load user-defined plugin. This option is available only if Bochs is
-# compiled with plugin support. Maximum 8 different plugins are supported.
-# See the example in the Bochs sources how to write a plugin device.
-#=======================================================================
-#user_plugin: name=testdev
-
-#=======================================================================
-# for Macintosh, use the style of pathnames in the following
-# examples.
-#
-# vgaromimage: :bios:VGABIOS-elpin-2.40
-# romimage: file=:bios:BIOS-bochs-latest, address=0xf0000
-# floppya: 1_44=[fd:], status=inserted
-#=======================================================================
-
-#=======================================================================
-# MEGS
-# Set the number of Megabytes of physical memory you want to emulate. 
-# The default is 32MB, most OS's won't need more than that.
-# The maximum amount of memory supported is 2048Mb.
-# The 'MEGS' option is deprecated. Use 'MEMORY' option instead.
-#=======================================================================
-#megs: 256
-#megs: 128
-#megs: 64
-#megs: 32
-#megs: 16
-#megs: 8
diff --git a/doc/apic b/doc/apic
new file mode 100644 (file)
index 0000000..186b9ee
--- /dev/null
+++ b/doc/apic
@@ -0,0 +1,9 @@
+Prototype:
+    void register_interrupt_handler(kid_t module, void (*func)());
+
+Idea:
+- swaps to appropriate module
+- calls func
+- returns from interrupt
+
+That is to say, the function is executed from an interrupt context.
diff --git a/doc/boot-process b/doc/boot-process
new file mode 100644 (file)
index 0000000..643ccb5
--- /dev/null
@@ -0,0 +1,32 @@
+Fundamental setup:
++ physical memory manager
++ virtual memory manager
++ GDT
++ kernel stack
++ kernel heap
+- ID system
+- local APIC manager / interrupt handling system
+- monotonic kernel timer
+- thread scheduler
+- module loader
+
+Hardware registry:
+- initialize ACPICA
+- walk ACPI tables to find hwreg info
+- walk ACPI structures to find hwreg info
+- walk PCI bus to find hwreg info
+- setup IOAPIC
+- IRQ handling system
+
+Clock:
+- read RTC, find offset from kernel timer
+
+SMP:
+- ask hwreg for SMP CPU list
+- set up bootstrap code in physical memory
+- send SIPIs
+- APs:
+    - enter protected mode
+    - load GDT
+    - setup APIC
+    - enter thread scheduler
index 515f57d..babd035 100644 (file)
@@ -6,23 +6,19 @@ CFLAGS=-W -Wall -Wextra -nostdlib -nodefaultlibs -mcmodel=large -m64 \
        -Werror -Wno-error=unused-variable -Wno-error=unused-function \
        -Wno-error=unused-parameter \
        -I`pwd`
-LDFLAGS=-nostdlib -nodefaultlibs
+LDFLAGS=-nostdlib -nodefaultlibs -m elf_x86_64
 
 KERNEL_OUTPUT=kernel.bin
 
 LDSCRIPT=kernel.ld
 
-KERNEL_SOURCES=boot/multiboot.s $(wildcard *.c) $(wildcard *.s) $(wildcard acpi/*.c)
+KERNEL_SOURCES=boot/multiboot.s $(wildcard *.c) $(wildcard *.s)
 
 OBJECTS=$(KERNEL_SOURCES:.c=.o)
 OBJECTS := $(OBJECTS:.s=.o)
 
 .PHONY: all
-all: $(KERNEL_OUTPUT) apb/bootstrap.h
-
-apb/bootstrap.h: apb/bootstrap.s
-       $(NASM) -f bin apb/bootstrap.s -o apb/bootstrap
-       apb/generate.py APB_BOOTSTRAP apb/bootstrap > apb/bootstrap.h
+all: $(KERNEL_OUTPUT)
 
 .c.o:
        $(CC) $(CFLAGS) -c $< -o $@
@@ -32,10 +28,10 @@ apb/bootstrap.h: apb/bootstrap.s
 $(KERNEL_OUTPUT): $(OBJECTS) $(LOADER_SOURCES) $(LDSCRIPT)
        $(LD) $(LDFLAGS) -T $(LDSCRIPT) -o kernel.bin $(OBJECTS)
 
--include depend
-depend: apb/bootstrap.h
+depend: $(KERNEL_SOURCES)
        gcc -MM $(CFLAGS) $(KERNEL_SOURCES) > depend
+-include depend
 
 .PHONY: clean
 clean:
-       -rm -f $(OBJECTS) $(KERNEL_OUTPUT) depend apb/bootstrap apb/bootstrap.h
+       -rm -f $(OBJECTS) $(KERNEL_OUTPUT) depend
diff --git a/kernel/acpi/system.c b/kernel/acpi/system.c
deleted file mode 100644 (file)
index 73b0656..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "system.h"
-
-void acpi_sys_init(void) {
-    
-}
diff --git a/kernel/acpi/system.h b/kernel/acpi/system.h
deleted file mode 100644 (file)
index 0a021d6..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef ACPI_SYSTEM_H
-#define ACPI_SYSTEM_H
-
-void acpi_sys_init(void);
-
-#endif
diff --git a/kernel/acpi/tables.c b/kernel/acpi/tables.c
deleted file mode 100644 (file)
index 7f91815..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-#include "tables.h"
-#include "kutil.h"
-#include "config.h"
-#include "klog.h"
-#include "kphy.h"
-
-const uint8_t *acpi_rsdp;
-uint64_t acpi_rsdp_address, acpi_rsdt_address;
-uint64_t acpi_ssdt_address;
-acpi_revision_t acpi_revision;
-
-acpi_apic_t acpi_apics[ACPI_MAX_APICS];
-uint32_t acpi_apic_count;
-
-acpi_ioapic_t acpi_ioapics[ACPI_MAX_IOAPICS];
-uint32_t acpi_ioapic_count;
-
-static void acpi_search_rsdp_bios();
-static void acpi_search_rsdp_ebda();
-static int acpi_check_rsdp(uint64_t address);
-static void acpi_parse_rsdp();
-static void acpi_parse_rsdt();
-static void acpi_parse_madt();
-
-void acpi_tables_init(void) {
-    acpi_rsdp = NULL;
-    acpi_rsdp_address = 0;
-
-    acpi_search_rsdp_bios();
-    if(acpi_rsdp_address == 0) acpi_search_rsdp_ebda();
-
-    if(acpi_rsdp_address == 0) {
-        klog("Couldn't find ACPI RSDP anywhere, aborting.");
-        __asm__ __volatile__("hlt");
-    }
-    klog("Found ACPI RSDP at %p", acpi_rsdp_address);
-
-    acpi_parse_rsdp();
-    acpi_parse_rsdt();
-}
-
-static void acpi_search_rsdp_bios() {
-    const char *signature = "RSD PTR ";
-
-    for(uint64_t offset = 0; offset < 0x20000; offset += 16) {
-        if(kphy_cmp(0xe0000 + offset, signature, 8) == 0) {
-            if(acpi_check_rsdp(0xe0000 + offset)) continue;
-
-            acpi_rsdp_address = 0xe0000 + offset;
-            return;
-        }
-    }
-}
-
-static void acpi_search_rsdp_ebda() {
-    const char *signature = "RSD PTR ";
-    uint64_t ebda_start = kphy_r16(0x40e) << 4;
-
-    for(uint64_t offset = 0; offset < 0x400; offset += 16) {
-        if(kphy_cmp(ebda_start + offset, signature, 8) == 0) {
-            if(acpi_check_rsdp(ebda_start + offset)) continue;
-
-            acpi_rsdp_address = ebda_start + offset;
-            return;
-        }
-    }
-}
-
-static int acpi_check_rsdp(uint64_t address) {
-    uint8_t sum = 0;
-    for(int i = 0; i < 20; i ++) {
-        sum += kphy_r8(address + i);
-    }
-    return sum;
-}
-
-static void acpi_parse_rsdp() {
-    // find ACPI version
-    uint8_t rev = kphy_r8(acpi_rsdp_address + ACPI_RSDP_REV_OFF);
-    if(rev == 0) acpi_revision = ACPI_REV_1;
-    else {
-        acpi_revision = ACPI_REV_UNKNOWN;
-        klog("Warning: only ACPI 1.0 currently supported.");
-        khang();
-    }
-
-    // grab RSDT address
-    acpi_rsdt_address = kphy_r32(acpi_rsdp_address + ACPI_RSDP_RSDT_OFF);
-}
-
-static void acpi_parse_rsdt() {
-    uint32_t rsdt_len = kphy_r32(acpi_rsdt_address + ACPI_RSDT_LEN_OFF);
-
-    uint32_t table_count = (rsdt_len-ACPI_RSDT_ENTRIES_OFF)/4;
-    //klog("There are %i ACPI table(s)", table_count);
-
-    for(uint32_t i = 0; i < table_count; i ++) {
-        uint32_t table_addr = kphy_r32(acpi_rsdt_address
-            + ACPI_RSDT_ENTRIES_OFF + (i*4));
-
-        char sig[5];
-        kphy_read(table_addr, sig, 4);
-        sig[4] = 0;
-
-        // is this the MADT?
-        if(kmemcmp(sig, "APIC", 4) == 0) {
-            acpi_parse_madt(table_addr);
-        }
-        else if(kmemcmp(sig, "SSDT", 4) == 0) {
-            acpi_ssdt_address = table_addr;
-        }
-        else {
-            klog("Unhandled ACPI table with signature \"%s\"", sig);
-        }
-    }
-}
-
-static void acpi_parse_madt(uint32_t madt_address) {
-    acpi_ioapic_count = 0;
-    acpi_apic_count = 0;
-
-    uint32_t madt_len = kphy_r32(madt_address + ACPI_MADT_LEN_OFF);
-
-    uint32_t table_size = madt_len - ACPI_MADT_ENTRIES_OFF;
-    //klog("MADT table size: %x (%x for entries)", madt_len, table_size);
-
-    // already know interrupt controller address via APIC MSR
-    //klog("Local interrupt controller at: %p", *(uint32_t *)(PHY_MAP_BASE
-        //+ madt_address + ACPI_MADT_LOCAL_OFF));
-
-    uint32_t offset = ACPI_MADT_ENTRIES_OFF;
-    while(offset < table_size + ACPI_MADT_ENTRIES_OFF) {
-        uint64_t entry_type = kphy_r8(madt_address + offset);
-        uint64_t entry_size = kphy_r8(madt_address + offset + 1);
-
-        //klog("APIC table entry, type is %x and size is %x", entry_type, entry_size);
-
-        // for now just interested in where the I/O APIC is . . .
-        // Local APIC entry
-        if(entry_type == 0) {
-            acpi_apics[acpi_apic_count].procid = kphy_r8(madt_address + offset
-                + ACPI_MADT_APIC_PROCID_OFF);
-            acpi_apics[acpi_apic_count].apicid = kphy_r8(madt_address + offset
-                + ACPI_MADT_APIC_APICID_OFF);
-            acpi_apics[acpi_apic_count].enabled =
-                (kphy_r32(madt_address + offset + ACPI_MADT_APIC_FLAGS_OFF)
-                    & ACPI_MADT_APIC_FLAGS_ENABLED) > 0;
-
-            acpi_apic_count ++;
-        }
-        // I/O APIC entry
-        else if(entry_type == 1) {
-            acpi_ioapics[acpi_ioapic_count].id = kphy_r8(madt_address + offset
-                + ACPI_MADT_IOAPIC_ID_OFF);
-
-            acpi_ioapics[acpi_ioapic_count].phyaddr = kphy_r32(madt_address
-                + offset + ACPI_MADT_IOAPIC_ADDR_OFF);
-            acpi_ioapics[acpi_ioapic_count].base = kphy_r32(madt_address
-                + offset + ACPI_MADT_IOAPIC_BASE_OFF);
-
-            acpi_ioapic_count ++;
-        }
-
-        offset += entry_size;
-    }
-}
diff --git a/kernel/acpi/tables.h b/kernel/acpi/tables.h
deleted file mode 100644 (file)
index 20272f2..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef ACPI_TABLES_H
-#define ACPI_TABLES_H
-
-#include <stdint.h>
-
-#define ACPI_RSDP_CHECKSUM_OFF 8
-#define ACPI_RSDP_REV_OFF 15
-#define ACPI_RSDP_RSDT_OFF 16
-
-#define ACPI_RSDT_LEN_OFF 4
-#define ACPI_RSDT_ENTRIES_OFF 36
-
-#define ACPI_MADT_LEN_OFF 4
-#define ACPI_MADT_LOCAL_OFF 36
-#define ACPI_MADT_ENTRIES_OFF 44
-#define ACPI_MADT_APIC_PROCID_OFF 2
-#define ACPI_MADT_APIC_APICID_OFF 3
-#define ACPI_MADT_APIC_FLAGS_OFF 4
-#define ACPI_MADT_IOAPIC_ID_OFF 2
-#define ACPI_MADT_IOAPIC_ADDR_OFF 4
-#define ACPI_MADT_IOAPIC_BASE_OFF 8
-
-#define ACPI_MADT_APIC_FLAGS_ENABLED 1
-
-#define ACPI_MAX_APICS 8
-#define ACPI_MAX_IOAPICS 2
-
-typedef enum {
-    ACPI_REV_1,
-    ACPI_REV_UNKNOWN
-} acpi_revision_t;
-
-typedef struct {
-    uint8_t procid;
-    uint32_t apicid;
-    uint8_t enabled;
-} acpi_apic_t;
-
-typedef struct {
-    uint8_t id;
-    uint32_t phyaddr;
-    uint32_t base;
-} acpi_ioapic_t;
-
-extern acpi_apic_t acpi_apics[ACPI_MAX_APICS];
-extern uint32_t acpi_apic_count;
-
-extern acpi_ioapic_t acpi_ioapics[ACPI_MAX_IOAPICS];
-extern uint32_t acpi_ioapic_count;
-
-void acpi_tables_init(void);
-
-#endif
diff --git a/kernel/apb/.gitignore b/kernel/apb/.gitignore
deleted file mode 100644 (file)
index 9df0b15..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-bootstrap
-bootstrap.h
diff --git a/kernel/apb/bootstrap.s b/kernel/apb/bootstrap.s
deleted file mode 100644 (file)
index 9e2bd2a..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-[section .ap_bootstrap]
-
-[org 0x8000]
-; real-mode portion
-[bits 16]
-       cli
-       jmp     apb_entry
-
-; some global variables
-align 8
-lm_entry: dq 0
-pml4_value: dd 0
-gdt_value: dd 0
-stack_spinlock: dw 0
-stack_count: dw 0
-
-; temporary GDT, will be replaced with kernel-wide one later
-GDT:                           ; Global Descriptor Table (64-bit).
-       .null: equ $ - GDT      ; The null descriptor.
-       dw 0                    ; Limit (low).
-       dw 0                    ; Base (low).
-       db 0                    ; Base (middle)
-       db 0                    ; Access.
-       db 0                    ; Granularity.
-       db 0                    ; Base (high).
-       .code64: equ $ - GDT    ; The 64-bit code descriptor.
-       dw 0                    ; Limit (low).
-       dw 0                    ; Base (low).
-       db 0                    ; Base (middle)
-       db 10011000b            ; Access.
-       db 00100000b            ; Granularity.
-       db 0                    ; Base (high).
-       .data64: equ $ - GDT    ; The 64-bit data descriptor.
-       dw 0                    ; Limit (low).
-       dw 0                    ; Base (low).
-       db 0                    ; Base (middle)
-       db 10010010b            ; Access.
-       db 00000000b            ; Granularity.
-       db 0                    ; Base (high).
-       .code32: equ $ - GDT    ; The 32-bit code descriptor.
-       dw 0xffff               ; Limit (low).
-       dw 0                    ; Base (low).
-       db 0                    ; Base (middle).
-       db 10011000b            ; Access.
-       db 11001111b            ; Granularity/limit (high).
-       db 0                    ; Base (high).
-       .data32: equ $ - GDT    ; The 32-bit data descriptor.
-       dw 0xffff               ; Limit (low).
-       dw 0                    ; Base (low).
-       db 0                    ; Base (middle).
-       db 10010010b            ; Access.
-       db 11001111b            ; Granularity/limit (high).
-       db 0                    ; Base (high).
-       .pointer:               ; The GDT-pointer.
-       dw $ - GDT - 1          ; Limit.
-       dq GDT                  ; Base.
-
-; the main code.
-apb_entry:
-       ; wait for spinlock
-       .slock:
-       lock bts word [stack_spinlock], 0
-       jnc     .eslock
-       pause
-       jmp     .slock
-
-       .eslock:
-
-       xor     eax, eax
-       mov     ax, word [stack_count]
-       inc     ax
-       mov     word [stack_count], ax
-       
-       mov     esp, eax
-       ; allocate 256 byte stack per CPU
-       shl     esp, 8
-       ; . . . starting at 0x9000
-       add     esp, 0x9000
-
-       ; we have a unique stack, allow next processor past spinlock . . .
-       mov     word [stack_spinlock], 0
-
-       ; load GDT
-       lgdt    [GDT.pointer]
-       ; enable protected mode bit in cr0
-       mov     eax, cr0
-       or      al, 1
-       mov     cr0, eax
-       ; jump to 32-bit pmode code
-
-       jmp     0x18:apb_pmode
-
-[bits 32]
-apb_pmode:
-       ; in protected mode, set up ss/ds
-       mov     eax, 0x20
-       mov     ss, ax
-       mov     ds, ax
-
-       ; now for long mode.
-
-       ; Set PAE paging bit.
-       mov     eax, cr4
-       or      eax, 1 << 5
-       mov     cr4, eax
-
-       ; Set PGE (global pages) bit.
-       mov     eax, cr4
-       or      eax, 1<<7
-       mov     cr4, eax
-       
-       ; Set the 9th bit of the EFER MSR to enable long mode.
-       mov     ecx, 0xc0000080
-       rdmsr
-       or      eax, 1<<8
-       wrmsr
-
-       ; set cr3 register
-       mov     eax, dword [pml4_value]
-       mov     cr3, eax
-       
-       ; Actually enable paging . . .
-       mov     eax, cr0
-       or      eax, 1<<31
-       mov     cr0, eax
-
-       ; Now time to jump...
-       jmp     0x08:trampoline
-
-[BITS 64]
-trampoline:
-       mov     r9, qword [lm_entry]
-       jmp     r9
diff --git a/kernel/apb/generate.py b/kernel/apb/generate.py
deleted file mode 100755 (executable)
index ff10ce9..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env python3
-
-import sys
-
-prefix = sys.argv[1]
-ifname = sys.argv[2]
-
-f = open(ifname, "rb")
-
-gen = ""
-l = 0
-for s in f:
-    for c in s:
-        gen += "\\x" + hex(c)[2:]
-        l += 1
-print("#define " + prefix + " \"" + gen + "\"")
-print("#define " + prefix + "_LEN " + str(l))
diff --git a/kernel/apic.c b/kernel/apic.c
deleted file mode 100644 (file)
index 2b2db33..0000000
+++ /dev/null
@@ -1,349 +0,0 @@
-#include "apic.h"
-#include "klog.h"
-#include "kutil.h"
-#include "config.h"
-#include "msr.h"
-#include "gdt.h"
-#include "kheap.h"
-#include "kphy.h"
-#include "ioapic.h"
-
-extern void apic_empty_isr(void);
-extern uint64_t apic_isr_table[256];
-
-static uint64_t apic_regs;
-static uint64_t *apic_idt;
-
-static uint64_t apic_rtc_ticks;
-static uint64_t apic_ratio;
-
-static apic_isr_t apic_isrs[256];
-
-static void apic_remap_pic(void);
-static void apic_enable(void);
-static void apic_load_idt(uint64_t address, uint64_t addressable);
-static void apic_set_idt(uint64_t index, uint64_t entry, uint8_t dpl,
-    uint8_t isl);
-static void apic_setup_idt(void);
-static void apic_setup_timer();
-
-void apic_init(void) {
-    klog("Enabling APIC . . .");
-    for(int i = 0; i < 256; i ++) apic_isrs[i] = NULL;
-
-    apic_remap_pic();
-    apic_enable();
-
-    apic_setup_idt();
-    apic_load_idt((uint64_t)apic_idt, 256*8);
-
-    //ioapic_set_irq(1, apic_get_id(), 0x20 + 1);
-    //klog("ioapic_max_irq: %i", ioapic_max_irq());
-    for(uint8_t irq = 0; irq < ioapic_max_irq(); irq ++) {
-        ioapic_set_irq(irq, apic_get_id(), 0x20 + irq);
-        ioapic_mask_irq(irq, 1);
-    }
-
-    apic_setup_timer();
-}
-
-void apic_init_ap(void) {
-    apic_enable();
-
-    apic_load_idt((uint64_t)apic_idt, 256*8);
-
-    apic_setup_timer();
-}
-
-void apic_disable_interrupts(void) {
-    __asm__("cli");
-}
-
-void apic_enable_interrupts(void) {
-    __asm__("sti");
-}
-
-uint32_t apic_get_register32(uint32_t which) {
-    return kphy_r32(apic_regs + which);
-}
-
-void apic_set_register32(uint32_t which, uint32_t value) {
-    kphy_w32(apic_regs + which, value);
-}
-
-static void apic_remap_pic(void) {
-    // code stolen from OSdev wiki
-    uint8_t a1, a2;
-       a1 = kinb(0x21);
-       a2 = kinb(0xa1);
-
-    koutb(0x20, 0x11);
-    kiowait();
-    koutb(0xa0, 0x11);
-    kiowait();
-
-    koutb(0x21, 0xe0);
-    kiowait();
-    koutb(0xa1, 0xe8);
-    kiowait();
-
-    koutb(0x21, 4);
-    kiowait();
-    koutb(0xa1, 2);
-    kiowait();
-
-    koutb(0x21, 1);
-    kiowait();
-    koutb(0xa1, 1);
-    kiowait();
-
-    koutb(0x21, a1);
-    koutb(0xa1, a2);
-
-    kiowait();
-
-    // now disable the PIC
-    koutb(0xa1, 0xff);
-    kiowait();
-    koutb(0x21, 0xff);
-    kiowait();
-}
-
-static void apic_enable() {
-    uint64_t apic_base;
-
-    if(kcpuid_bitcheck(1, 96 + 9) == 0) {
-        klog("No APIC present on CPU!");
-        __asm__("hlt");
-    }
-
-    apic_base = msr_read(MSR_APIC_BASE);
-    // ensure APIC is enabled.
-    apic_base |= (1<<11);
-    msr_write(MSR_APIC_BASE, apic_base);
-    apic_regs = (apic_base >> 12) << 12;
-
-    // enable APIC (bit 8) in spurious vector (0xf0)
-    apic_set_register32(0xf0, apic_get_register32(0xf0) | (1<<8));
-}
-
-static void apic_load_idt(uint64_t address, uint64_t addressable) {
-    //uint64_t idt_pointer = address | (addressable & 0xff);
-    uint8_t ptr[10];
-    *(uint16_t *)(ptr + 0) = addressable;
-    *(uint64_t *)(ptr + 2) = address;
-    __asm__("lidt [rax]" : : "a"(ptr));
-}
-
-static void apic_set_idt(uint64_t index, uint64_t entry, uint8_t dpl,
-    uint8_t ist) {
-
-    // clear IDT entries
-    apic_idt[index*2] = 0;
-    apic_idt[index*2 + 1] = 0;
-
-    // lower 16 bits of entry point
-    apic_idt[index*2] = entry & 0xffff;
-    // entry point CS selector
-    apic_idt[index*2] |= GDT_KERNEL_CS << 16;
-    // interrupt stack table
-    apic_idt[index*2] |= (ist & 0x7ULL) << 32;
-    // type (0xe is interrupt gate, by Table 3-2 in Intel vol 3A)
-    apic_idt[index*2] |= 0xeULL << (32 + 8);
-    // DPL
-    apic_idt[index*2] |= (dpl & 0x03ULL) << (32 + 13);
-    // present
-    apic_idt[index*2] |= 1ULL << (32+15);
-    // entry offset second 16 bits
-    apic_idt[index*2] |= ((entry >> 16) & 0xffff) << (32 + 16);
-    // entry offset upper 32 bits
-    apic_idt[index*2 + 1] |= (entry >> 32) & 0xffffffff;
-}
-
-static void apic_setup_idt(void) {
-    // 256 different interrupts, 16 bytes each = 4096 bytes.
-    apic_idt = kheap_alloc_aligned(4096, 4096);
-    // initialize everything to zero.
-    for(int i = 0; i < 512; i ++) {
-        apic_idt[i] = 0;
-    }
-
-    // set up ISR handlers
-    for(int i = 0; i < 256; i ++) {
-        apic_set_idt(i, apic_isr_table[i], 0, 1);
-    }
-}
-
-void apic_isr_callback(uint64_t vector) {
-    uint64_t stack_start = 0xdeadc0dedeadc0de;
-    if(vector < 0x10) {
-        klog("ISR! Vector: %x", vector);
-        __asm__ ("xchg bx,bx");
-    }
-    else if(vector >= 0x20 && vector <= 0x38 && vector != 0x22) {
-        klog("IRQ %i!", vector-0x20);
-    }
-    if(vector == 13 || vector == 14) {
-        klog("Stack:");
-        klog("    %x", *(&stack_start - 9));
-        klog("    %x", *(&stack_start - 10));
-        klog("    %x", *(&stack_start - 11));
-        klog("    %x", *(&stack_start - 12));
-        klog("    %x", *(&stack_start - 13));
-        klog("    %x", *(&stack_start - 14));
-        // infinite loop
-        while(1) {}
-    }
-    if(apic_isrs[vector] != NULL) apic_isrs[vector]();
-    apic_send_eoi();
-}
-
-void apic_isr_gpf(uint64_t cs, uint64_t ip, uint64_t code) {
-    apic_send_eoi();
-}
-
-void apic_set_isr(uint8_t vector, apic_isr_t isr) {
-    apic_isrs[vector] = isr;
-}
-
-apic_isr_t apic_get_isr(uint8_t vector) {
-    return apic_isrs[vector];
-}
-
-void apic_send_eoi() {
-    apic_set_register32(APIC_REG_EOI, 0);
-}
-
-uint32_t apic_get_id() {
-    return apic_get_register32(APIC_REG_ID);
-}
-
-static void apic_setup_timer() {
-    // set divisor to 128
-    apic_set_register32(APIC_REG_TIMER_DIV,
-        (apic_get_register32(APIC_REG_TIMER_DIV) & ~0xb) | 0xa);
-
-    // set timer mode to periodic
-    uint32_t lvt = apic_get_register32(APIC_REG_LVT_TIMER);
-    lvt &= ~(1<<18 | 1<<17);
-    lvt |= 1<<17;
-
-    // set masked
-    lvt |= 1<<16;
-
-    // set vector
-    lvt &= ~0xff;
-    lvt |= APIC_TIMER_INTR;
-
-    apic_set_register32(APIC_REG_LVT_TIMER, lvt);
-
-    // set interval
-    apic_set_register32(APIC_REG_TIMER_INITIAL, APIC_TIMER_INTERVAL);
-}
-
-void apic_enable_timer() {
-    // set unmasked
-    uint32_t lvt = apic_get_register32(APIC_REG_LVT_TIMER);
-    lvt &= ~(1<<16);
-    apic_set_register32(APIC_REG_LVT_TIMER, lvt);
-}
-
-void apic_disable_timer() {
-    // set masked
-    uint32_t lvt = apic_get_register32(APIC_REG_LVT_TIMER);
-    lvt |= 1<<16;
-    apic_set_register32(APIC_REG_LVT_TIMER, lvt);
-}
-
-void apic_send_ipi(uint8_t type, uint8_t apic_dest, uint8_t vector) {
-    uint32_t control = apic_get_register32(APIC_REG_ICR_LOW);
-    // wait until no send is pending
-    while(control & (1<<12)) control = apic_get_register32(APIC_REG_ICR_LOW);
-
-    uint32_t destination = apic_get_register32(APIC_REG_ICR_HIGH);
-    destination &= 0x00ffffff;
-    destination |= (apic_dest << 24);
-    apic_set_register32(APIC_REG_ICR_HIGH, destination);
-
-    // set delivery shorthand to `no shorthand', i.e. use phys destination
-    control &= ~(1<<18 | 1<<19);
-
-    // set to `level trigger' mode -- we're not on a 486
-    control &= ~(1<<15);
-    control |= (1<<14);
-
-    // use physical destination mode
-    control &= ~(1<<11);
-
-    // set IPI type
-    control &= ~(0x700);
-    control |= (type << 8);
-
-    // set IPI vector
-    control &= ~(0xff);
-    control |= vector;
-
-    // send the IPI
-    apic_set_register32(APIC_REG_ICR_LOW, control);
-}
-
-static void apic_ratio_rtc_isr() {
-    apic_rtc_ticks ++;
-    //klog("RTC tick! Count: %i", apic_rtc_ticks);
-
-    koutb(0x70, 0x0C);
-    kinb(0x71);
-}
-
-static void apic_ratio_apic_isr() {
-    // empty
-}
-
-uint64_t apic_find_bus_ratio() {
-    apic_disable_interrupts(); // don't get pre-empted
-    // use RTC to estimate timer ratio
-    apic_rtc_ticks = 0;
-
-    apic_isr_t old_timer_isr = apic_get_isr(APIC_TIMER_INTR);
-    apic_isr_t old_irq8_isr = apic_get_isr(APIC_IRQ_8_INTR);
-
-    apic_set_isr(APIC_TIMER_INTR, apic_ratio_apic_isr);
-    apic_set_isr(APIC_IRQ_8_INTR, apic_ratio_rtc_isr);
-
-    // set rate
-    koutb(0x70, 0x8a);
-    uint8_t prev = kinb(0x71);
-    koutb(0x70, 0x8a);
-    // want 32768 >> 5 = 1024Hz timer
-    koutb(0x71, (prev & ~0xf) | 0x06);
-
-    koutb(0x70, 0x8b);
-    prev = kinb(0x71);
-    koutb(0x70, 0x8b);
-    koutb(0x71, prev | 0x40); // enable RTC interrupt
-
-    apic_set_register32(APIC_REG_TIMER_INITIAL, 0xffffffff);
-    apic_enable_timer();
-    apic_enable_interrupts();
-    while(apic_rtc_ticks < 256) __asm__("pause");
-    apic_disable_interrupts();
-    uint64_t after = apic_get_register32(APIC_REG_TIMER_CURRENT);
-    uint64_t elapsed = 0xffffffff - after;
-
-    // clean up
-    apic_set_isr(APIC_TIMER_INTR, old_timer_isr);
-    apic_set_isr(APIC_IRQ_8_INTR, old_irq8_isr);
-
-    apic_ratio = elapsed >> 1;
-    apic_set_register32(APIC_REG_TIMER_INITIAL, apic_ratio);
-
-    koutb(0x70, 0x8b);
-    prev = kinb(0x71);
-    koutb(0x70, 0x8b);
-    koutb(0x71, prev & ~0x40); // disable RTC interrupt
-    apic_enable_interrupts();
-
-    apic_ratio = elapsed >> 1;
-    klog("apic_ratio: %i", apic_ratio);
-    return 0;
-}
diff --git a/kernel/apic.h b/kernel/apic.h
deleted file mode 100644 (file)
index b13b804..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef APIC_H
-#define APIC_H
-
-#include <stdint.h>
-
-#define APIC_TIMER_INTERVAL 250000
-
-#define APIC_REG_ID 0x20
-#define APIC_REG_EOI 0xb0
-#define APIC_REG_ICR_LOW 0x300
-#define APIC_REG_ICR_HIGH 0x310
-#define APIC_REG_LVT_TIMER 0x320
-#define APIC_REG_TIMER_INITIAL 0x380
-#define APIC_REG_TIMER_CURRENT 0x390
-#define APIC_REG_TIMER_DIV 0x3e0
-
-#define APIC_TIMER_INTR 0x40
-#define APIC_IRQ_0_INTR 0x20
-#define APIC_IRQ_1_INTR 0x21
-#define APIC_IRQ_2_INTR 0x22
-#define APIC_IRQ_3_INTR 0x23
-#define APIC_IRQ_4_INTR 0x24
-#define APIC_IRQ_5_INTR 0x25
-#define APIC_IRQ_6_INTR 0x26
-#define APIC_IRQ_7_INTR 0x27
-#define APIC_IRQ_8_INTR 0x28
-#define APIC_IRQ_9_INTR 0x29
-#define APIC_IRQ_10_INTR 0x2a
-#define APIC_IRQ_11_INTR 0x2b
-#define APIC_IRQ_12_INTR 0x2c
-#define APIC_IRQ_13_INTR 0x2d
-#define APIC_IRQ_14_INTR 0x2e
-#define APIC_IRQ_15_INTR 0x2f
-#define APIC_IRQ_16_INTR 0x30
-#define APIC_IRQ_17_INTR 0x31
-#define APIC_IRQ_18_INTR 0x32
-#define APIC_IRQ_19_INTR 0x33
-#define APIC_IRQ_20_INTR 0x34
-#define APIC_IRQ_21_INTR 0x35
-#define APIC_IRQ_22_INTR 0x36
-#define APIC_IRQ_23_INTR 0x37
-
-#define APIC_IPI_FIXED 0
-#define APIC_IPI_NMI 4
-#define APIC_IPI_INIT 5
-#define APIC_IPI_SIPI 6
-
-typedef void (*apic_isr_t)(void);
-
-void apic_init(void);
-void apic_init_ap(void);
-
-void apic_disable_interrupts(void);
-void apic_enable_interrupts(void);
-
-uint32_t apic_get_register32(uint32_t which);
-void apic_set_register32(uint32_t which, uint32_t value);
-void apic_isr_callback(uint64_t vector);
-void apic_isr_gpf(uint64_t cs, uint64_t ip, uint64_t code);
-
-void apic_set_isr(uint8_t vector, apic_isr_t isr);
-apic_isr_t apic_get_isr(uint8_t vector);
-
-void apic_send_eoi();
-
-uint32_t apic_get_id();
-
-void apic_enable_timer();
-void apic_disable_timer();
-
-void apic_send_ipi(uint8_t type, uint8_t apic_dest, uint8_t vector);
-
-uint64_t apic_find_bus_ratio();
-
-#endif
diff --git a/kernel/apic_isrs.s b/kernel/apic_isrs.s
deleted file mode 100644 (file)
index 92d24a0..0000000
+++ /dev/null
@@ -1,559 +0,0 @@
-[global apic_empty_isr]
-[extern apic_isr_callback]
-
-[extern sched_isr]
-
-apic_empty_isr:
-       iretq
-
-%macro isr_prologue 0
-       ; save registers
-       push    rax
-       push    rcx
-       push    rdx
-       push    rsi
-       push    rdi
-       push    r8
-       push    r9
-       push    r10
-       push    r11
-%endmacro
-
-%macro isr_epilogue 0
-       ; restore registers
-       pop     r11
-       pop     r10
-       pop     r9
-       pop     r8
-       pop     rdi
-       pop     rsi
-       pop     rdx
-       pop     rcx
-       pop     rax
-%endmacro
-
-%macro basic_isr 1
-apic_isr_%1:
-       isr_prologue
-       mov     rdi, %1
-       call    apic_isr_callback
-       isr_epilogue
-       iretq
-%endmacro
-
-basic_isr 0
-basic_isr 1
-basic_isr 2
-basic_isr 3
-basic_isr 4
-basic_isr 5
-basic_isr 6
-basic_isr 7
-basic_isr 8
-basic_isr 9
-basic_isr 10
-basic_isr 11
-basic_isr 12
-basic_isr 13
-basic_isr 14
-basic_isr 15
-basic_isr 16
-basic_isr 17
-basic_isr 18
-basic_isr 19
-basic_isr 20
-basic_isr 21
-basic_isr 22
-basic_isr 23
-basic_isr 24
-basic_isr 25
-basic_isr 26
-basic_isr 27
-basic_isr 28
-basic_isr 29
-basic_isr 30
-basic_isr 31
-basic_isr 32
-basic_isr 33
-basic_isr 34
-basic_isr 35
-basic_isr 36
-basic_isr 37
-basic_isr 38
-basic_isr 39
-basic_isr 40
-basic_isr 41
-basic_isr 42
-basic_isr 43
-basic_isr 44
-basic_isr 45
-basic_isr 46
-basic_isr 47
-basic_isr 48
-basic_isr 49
-basic_isr 50
-basic_isr 51
-basic_isr 52
-basic_isr 53
-basic_isr 54
-basic_isr 55
-basic_isr 56
-basic_isr 57
-basic_isr 58
-basic_isr 59
-basic_isr 60
-basic_isr 61
-basic_isr 62
-basic_isr 63
-; ISR 64 (context-switch timer expired) handled specially
-basic_isr 65
-basic_isr 66
-basic_isr 67
-basic_isr 68
-basic_isr 69
-basic_isr 70
-basic_isr 71
-basic_isr 72
-basic_isr 73
-basic_isr 74
-basic_isr 75
-basic_isr 76
-basic_isr 77
-basic_isr 78
-basic_isr 79
-basic_isr 80
-basic_isr 81
-basic_isr 82
-basic_isr 83
-basic_isr 84
-basic_isr 85
-basic_isr 86
-basic_isr 87
-basic_isr 88
-basic_isr 89
-basic_isr 90
-basic_isr 91
-basic_isr 92
-basic_isr 93
-basic_isr 94
-basic_isr 95
-basic_isr 96
-basic_isr 97
-basic_isr 98
-basic_isr 99
-basic_isr 100
-basic_isr 101
-basic_isr 102
-basic_isr 103
-basic_isr 104
-basic_isr 105
-basic_isr 106
-basic_isr 107
-basic_isr 108
-basic_isr 109
-basic_isr 110
-basic_isr 111
-basic_isr 112
-basic_isr 113
-basic_isr 114
-basic_isr 115
-basic_isr 116
-basic_isr 117
-basic_isr 118
-basic_isr 119
-basic_isr 120
-basic_isr 121
-basic_isr 122
-basic_isr 123
-basic_isr 124
-basic_isr 125
-basic_isr 126
-basic_isr 127
-basic_isr 128
-basic_isr 129
-basic_isr 130
-basic_isr 131
-basic_isr 132
-basic_isr 133
-basic_isr 134
-basic_isr 135
-basic_isr 136
-basic_isr 137
-basic_isr 138
-basic_isr 139
-basic_isr 140
-basic_isr 141
-basic_isr 142
-basic_isr 143
-basic_isr 144
-basic_isr 145
-basic_isr 146
-basic_isr 147
-basic_isr 148
-basic_isr 149
-basic_isr 150
-basic_isr 151
-basic_isr 152
-basic_isr 153
-basic_isr 154
-basic_isr 155
-basic_isr 156
-basic_isr 157
-basic_isr 158
-basic_isr 159
-basic_isr 160
-basic_isr 161
-basic_isr 162
-basic_isr 163
-basic_isr 164
-basic_isr 165
-basic_isr 166
-basic_isr 167
-basic_isr 168
-basic_isr 169
-basic_isr 170
-basic_isr 171
-basic_isr 172
-basic_isr 173
-basic_isr 174
-basic_isr 175
-basic_isr 176
-basic_isr 177
-basic_isr 178
-basic_isr 179
-basic_isr 180
-basic_isr 181
-basic_isr 182
-basic_isr 183
-basic_isr 184
-basic_isr 185
-basic_isr 186
-basic_isr 187
-basic_isr 188
-basic_isr 189
-basic_isr 190
-basic_isr 191
-basic_isr 192
-basic_isr 193
-basic_isr 194
-basic_isr 195
-basic_isr 196
-basic_isr 197
-basic_isr 198
-basic_isr 199
-basic_isr 200
-basic_isr 201
-basic_isr 202
-basic_isr 203
-basic_isr 204
-basic_isr 205
-basic_isr 206
-basic_isr 207
-basic_isr 208
-basic_isr 209
-basic_isr 210
-basic_isr 211
-basic_isr 212
-basic_isr 213
-basic_isr 214
-basic_isr 215
-basic_isr 216
-basic_isr 217
-basic_isr 218
-basic_isr 219
-basic_isr 220
-basic_isr 221
-basic_isr 222
-basic_isr 223
-basic_isr 224
-basic_isr 225
-basic_isr 226
-basic_isr 227
-basic_isr 228
-basic_isr 229
-basic_isr 230
-basic_isr 231
-basic_isr 232
-basic_isr 233
-basic_isr 234
-basic_isr 235
-basic_isr 236
-basic_isr 237
-basic_isr 238
-basic_isr 239
-basic_isr 240
-basic_isr 241
-basic_isr 242
-basic_isr 243
-basic_isr 244
-basic_isr 245
-basic_isr 246
-basic_isr 247
-basic_isr 248
-basic_isr 249
-basic_isr 250
-basic_isr 251
-basic_isr 252
-basic_isr 253
-basic_isr 254
-basic_isr 255
-
-[section .rodata]
-[global apic_isr_table]
-apic_isr_table:
-       dq apic_isr_0
-       dq apic_isr_1
-       dq apic_isr_2
-       dq apic_isr_3
-       dq apic_isr_4
-       dq apic_isr_5
-       dq apic_isr_6
-       dq apic_isr_7
-       dq apic_isr_8
-       dq apic_isr_9
-       dq apic_isr_10
-       dq apic_isr_11
-       dq apic_isr_12
-       dq apic_isr_13
-       dq apic_isr_14
-       dq apic_isr_15
-       dq apic_isr_16
-       dq apic_isr_17
-       dq apic_isr_18
-       dq apic_isr_19
-       dq apic_isr_20
-       dq apic_isr_21
-       dq apic_isr_22
-       dq apic_isr_23
-       dq apic_isr_24
-       dq apic_isr_25
-       dq apic_isr_26
-       dq apic_isr_27
-       dq apic_isr_28
-       dq apic_isr_29
-       dq apic_isr_30
-       dq apic_isr_31
-       dq apic_isr_32
-       dq apic_isr_33
-       dq apic_isr_34
-       dq apic_isr_35
-       dq apic_isr_36
-       dq apic_isr_37
-       dq apic_isr_38
-       dq apic_isr_39
-       dq apic_isr_40
-       dq apic_isr_41
-       dq apic_isr_42
-       dq apic_isr_43
-       dq apic_isr_44
-       dq apic_isr_45
-       dq apic_isr_46
-       dq apic_isr_47
-       dq apic_isr_48
-       dq apic_isr_49
-       dq apic_isr_50
-       dq apic_isr_51
-       dq apic_isr_52
-       dq apic_isr_53
-       dq apic_isr_54
-       dq apic_isr_55
-       dq apic_isr_56
-       dq apic_isr_57
-       dq apic_isr_58
-       dq apic_isr_59
-       dq apic_isr_60
-       dq apic_isr_61
-       dq apic_isr_62
-       dq apic_isr_63
-       dq sched_isr
-       dq apic_isr_65
-       dq apic_isr_66
-       dq apic_isr_67
-       dq apic_isr_68
-       dq apic_isr_69
-       dq apic_isr_70
-       dq apic_isr_71
-       dq apic_isr_72
-       dq apic_isr_73
-       dq apic_isr_74
-       dq apic_isr_75
-       dq apic_isr_76
-       dq apic_isr_77
-       dq apic_isr_78
-       dq apic_isr_79
-       dq apic_isr_80
-       dq apic_isr_81
-       dq apic_isr_82
-       dq apic_isr_83
-       dq apic_isr_84
-       dq apic_isr_85
-       dq apic_isr_86
-       dq apic_isr_87
-       dq apic_isr_88
-       dq apic_isr_89
-       dq apic_isr_90
-       dq apic_isr_91
-       dq apic_isr_92
-       dq apic_isr_93
-       dq apic_isr_94
-       dq apic_isr_95
-       dq apic_isr_96
-       dq apic_isr_97
-       dq apic_isr_98
-       dq apic_isr_99
-       dq apic_isr_100
-       dq apic_isr_101
-       dq apic_isr_102
-       dq apic_isr_103
-       dq apic_isr_104
-       dq apic_isr_105
-       dq apic_isr_106
-       dq apic_isr_107
-       dq apic_isr_108
-       dq apic_isr_109
-       dq apic_isr_110
-       dq apic_isr_111
-       dq apic_isr_112
-       dq apic_isr_113
-       dq apic_isr_114
-       dq apic_isr_115
-       dq apic_isr_116
-       dq apic_isr_117
-       dq apic_isr_118
-       dq apic_isr_119
-       dq apic_isr_120
-       dq apic_isr_121
-       dq apic_isr_122
-       dq apic_isr_123
-       dq apic_isr_124
-       dq apic_isr_125
-       dq apic_isr_126
-       dq apic_isr_127
-       dq apic_isr_128
-       dq apic_isr_129
-       dq apic_isr_130
-       dq apic_isr_131
-       dq apic_isr_132
-       dq apic_isr_133
-       dq apic_isr_134
-       dq apic_isr_135
-       dq apic_isr_136
-       dq apic_isr_137
-       dq apic_isr_138
-       dq apic_isr_139
-       dq apic_isr_140
-       dq apic_isr_141
-       dq apic_isr_142
-       dq apic_isr_143
-       dq apic_isr_144
-       dq apic_isr_145
-       dq apic_isr_146
-       dq apic_isr_147
-       dq apic_isr_148
-       dq apic_isr_149
-       dq apic_isr_150
-       dq apic_isr_151
-       dq apic_isr_152
-       dq apic_isr_153
-       dq apic_isr_154
-       dq apic_isr_155
-       dq apic_isr_156
-       dq apic_isr_157
-       dq apic_isr_158
-       dq apic_isr_159
-       dq apic_isr_160
-       dq apic_isr_161
-       dq apic_isr_162
-       dq apic_isr_163
-       dq apic_isr_164
-       dq apic_isr_165
-       dq apic_isr_166
-       dq apic_isr_167
-       dq apic_isr_168
-       dq apic_isr_169
-       dq apic_isr_170
-       dq apic_isr_171
-       dq apic_isr_172
-       dq apic_isr_173
-       dq apic_isr_174
-       dq apic_isr_175
-       dq apic_isr_176
-       dq apic_isr_177
-       dq apic_isr_178
-       dq apic_isr_179
-       dq apic_isr_180
-       dq apic_isr_181
-       dq apic_isr_182
-       dq apic_isr_183
-       dq apic_isr_184
-       dq apic_isr_185
-       dq apic_isr_186
-       dq apic_isr_187
-       dq apic_isr_188
-       dq apic_isr_189
-       dq apic_isr_190
-       dq apic_isr_191
-       dq apic_isr_192
-       dq apic_isr_193
-       dq apic_isr_194
-       dq apic_isr_195
-       dq apic_isr_196
-       dq apic_isr_197
-       dq apic_isr_198
-       dq apic_isr_199
-       dq apic_isr_200
-       dq apic_isr_201
-       dq apic_isr_202
-       dq apic_isr_203
-       dq apic_isr_204
-       dq apic_isr_205
-       dq apic_isr_206
-       dq apic_isr_207
-       dq apic_isr_208
-       dq apic_isr_209
-       dq apic_isr_210
-       dq apic_isr_211
-       dq apic_isr_212
-       dq apic_isr_213
-       dq apic_isr_214
-       dq apic_isr_215
-       dq apic_isr_216
-       dq apic_isr_217
-       dq apic_isr_218
-       dq apic_isr_219
-       dq apic_isr_220
-       dq apic_isr_221
-       dq apic_isr_222
-       dq apic_isr_223
-       dq apic_isr_224
-       dq apic_isr_225
-       dq apic_isr_226
-       dq apic_isr_227
-       dq apic_isr_228
-       dq apic_isr_229
-       dq apic_isr_230
-       dq apic_isr_231
-       dq apic_isr_232
-       dq apic_isr_233
-       dq apic_isr_234
-       dq apic_isr_235
-       dq apic_isr_236
-       dq apic_isr_237
-       dq apic_isr_238
-       dq apic_isr_239
-       dq apic_isr_240
-       dq apic_isr_241
-       dq apic_isr_242
-       dq apic_isr_243
-       dq apic_isr_244
-       dq apic_isr_245
-       dq apic_isr_246
-       dq apic_isr_247
-       dq apic_isr_248
-       dq apic_isr_249
-       dq apic_isr_250
-       dq apic_isr_251
-       dq apic_isr_252
-       dq apic_isr_253
-       dq apic_isr_254
-       dq apic_isr_255
index 4d14e15..05a7d6d 100644 (file)
@@ -298,8 +298,10 @@ setup_lmode:
        ; Actually enable paging . . .
        mov     eax, cr0
        or      eax, 1<<31
+    ; Enable write-protection (CR0.WP) while we're at it.
+    or eax, 1<<16
        mov     cr0, eax
-       
+
        ; Load the new (provisional, will be replaced later) GDT.
        lgdt    [GDT.pointer]
        
index 9e9e327..32fafeb 100644 (file)
@@ -1,10 +1,14 @@
-#define PHY_KERNEL_START 0x1000000
-/* TODO: this should be auto-calculated! */
-#define PHY_KERNEL_SIZE 0x100000 // reserve 1MB for kernel
+#define SYDI_PHY_KERNEL_START 0x1000000
+extern char _end, _start;
+#define SYDI_PHY_KERNEL_SIZE ((u64_t)(&_end - &_start))
 
-#define PHY_MAP_BASE (uint8_t *)0xffffc00000000000
+#define SYDI_PHY_MAP_BASE (u8_t *)0xffffc00000000000ULL
 
-#define VIRT_KERNEL_START 0xffffffff80000000ULL
-#define VIRT_KERNEL_HEAP  0xffffffffc0000000ULL
+#define SYDI_VIRT_KERNEL_START 0xffffffff80000000ULL
+#define SYDI_VIRT_KERNEL_HEAP  0xffffffffc0000000ULL
+#define SYDI_VIRT_KERNEL_STACK 0xfffffffff0000000ULL
+#define SYDI_VIRT_KERNEL_STACK_SIZE 0x10000 // 64KB stack depth
 
-#define MAX_CPUS 4
+#define SYDI_MAX_CPUS 4
+
+#define SYDI_SERIAL_DEBUG 1
diff --git a/kernel/context.c b/kernel/context.c
deleted file mode 100644 (file)
index f5a52ae..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "context.h"
-#include "vmman.h"
-#include "kheap.h"
-#include "klog.h"
-
-static context_t context_kernel_context;
-
-void context_init(void) {
-    
-}
-
-context_t *context_create(void) {
-    context_t *result = kheap_alloc(sizeof(context_t));
-
-    vmman_init_context(&result->vcontext);
-
-    result->id = 42;
-
-    return result;
-}
-
-void context_switch(context_t *newcontext) {
-    vmman_set_context(&newcontext->vcontext);
-}
diff --git a/kernel/context.h b/kernel/context.h
deleted file mode 100644 (file)
index b40433b..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef CONTEXT_H
-#define CONTEXT_H
-
-#include "vmman.h"
-
-typedef struct {
-    // context ID
-    uint64_t id;
-    // virtual memory context
-    vmman_context_t vcontext;
-    // ring to execute in
-    uint8_t pl;
-    // reference count
-    uint64_t refcount;
-} context_t;
-
-void context_init(void);
-
-context_t *context_create(void);
-
-void context_switch(context_t *newcontext);
-
-#endif
diff --git a/kernel/debug.c b/kernel/debug.c
new file mode 100644 (file)
index 0000000..0ac5a1a
--- /dev/null
@@ -0,0 +1,28 @@
+#include "debug.h"
+#include "io.h"
+#include "string.h"
+
+#define SYDI_COM_PORT 0x3f8
+
+// snprintf buffer, here so that no stack overwriting required later
+char debug_buffer[SYDI_DEBUG_BUFFER_SIZE];
+
+void debug_init() {
+    io_out(SYDI_COM_PORT + 1, 0x00);
+    io_out(SYDI_COM_PORT + 3, 0x80);
+    io_out(SYDI_COM_PORT + 0, 0x03);
+    io_out(SYDI_COM_PORT + 1, 0x00);
+    io_out(SYDI_COM_PORT + 3, 0x03);
+    io_out(SYDI_COM_PORT + 2, 0xc7);
+    io_out(SYDI_COM_PORT + 4, 0x0b);
+}
+
+void debug_serial_string(const char *string) {
+    for(int i = 0; string[i]; i ++) {
+        io_out(SYDI_COM_PORT, (u8_t)string[i]);
+        if(string[i] == '\n') {
+            // send carriage-return as well
+            io_out(SYDI_COM_PORT, '\r');
+        }
+    }
+}
diff --git a/kernel/debug.h b/kernel/debug.h
new file mode 100644 (file)
index 0000000..11f7c0f
--- /dev/null
@@ -0,0 +1,29 @@
+#ifndef SYDI_DEBUG_H
+#define SYDI_DEBUG_H
+
+#include "kernel.h"
+#include "string.h"
+
+void debug_init();
+void debug_serial_string(const char *string);
+
+#define debug_serial(...) \
+    do { \
+        snprintf(debug_buffer, sizeof(debug_buffer), __VA_ARGS__); \
+        debug_serial_string(debug_buffer); \
+        debug_serial_string("\n"); \
+    } while(0)
+
+#define SYDI_DEBUG_BUFFER_SIZE 1024
+extern char debug_buffer[SYDI_DEBUG_BUFFER_SIZE];
+
+#define sydi_debug debug_serial
+#define sydi_assert(condition, message) \
+    do { \
+        if(!(condition)) { \
+            sydi_debug("Assertion failed: " message); \
+            __asm__("hlt"); \
+        } \
+    } while(0)
+
+#endif
diff --git a/kernel/elf.c b/kernel/elf.c
deleted file mode 100644 (file)
index 0f1dc87..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "elf.h"
-#include "kutil.h"
-#include "klog.h"
-
-int elf_load(const void *data, uint64_t data_len, context_t *context) {
-    const elf_header *header = data;
-    if(!kmemcmp(header->ident, "\x7f""ELF", 4)) {
-        klog("Failed to load, ELF magic mismatch");
-        return -1;
-    }
-
-    return 0;
-}
diff --git a/kernel/elf.h b/kernel/elf.h
deleted file mode 100644 (file)
index 67976de..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef ELF_H
-#define ELF_H
-
-#include <stdint.h>
-
-#include "context.h"
-
-typedef struct {
-    uint8_t ident[16];     /* Magic number and other info */
-    uint16_t type;         /* Object file type */
-    uint16_t machine;      /* Architecture */
-    uint32_t version;      /* Object file version */
-    uint64_t entry;        /* Entry point virtual address */
-    uint64_t phoff;        /* Program header table file offset */
-    uint64_t shoff;        /* Section header table file offset */
-    uint32_t flags;        /* Processor-specific flags */
-    uint16_t ehsize;       /* ELF header size in bytes */
-    uint16_t phentsize;    /* Program header table entry size */
-    uint16_t phnum;        /* Program header table entry count */
-    uint16_t shentsize;    /* Section header table entry size */
-    uint16_t shnum;        /* Section header table entry count */
-    uint16_t shstrndx;     /* Section header string table index */
-} elf_header;
-
-typedef struct {
-    uint32_t type;   /* Segment type */
-    uint32_t flags;  /* Segment flags */
-    uint64_t offset; /* Segment file offset */
-    uint64_t vaddr;  /* Segment virtual address */
-    uint64_t paddr;  /* Segment physical address */
-    uint64_t filesz; /* Segment size in file */
-    uint64_t memsz;  /* Segment size in memory */
-    uint64_t align;  /* Segment alignment */
-} elf_pheader;
-
-int elf_load(const void *data, uint64_t data_len, context_t *context);
-
-#endif
index 73f0320..4dad756 100644 (file)
@@ -1,8 +1,7 @@
 #include "gdt.h"
-#include "pmman.h"
 #include "config.h"
-#include "kutil.h"
-#include "klog.h"
+#include "pagereg.h"
+#include "util.h"
 
 uint64_t gdt_address, gdt_elements;
 uint64_t *gdt_memory;
@@ -11,15 +10,14 @@ uint64_t *gdt_tss;
 static void gdt_set_null(uint64_t index);
 static void gdt_set_code(uint64_t index, uint8_t dpl);
 static void gdt_set_data(uint64_t index);
-static void gdt_set_tss(uint64_t index, tss_t tss);
+//static void gdt_set_tss(uint64_t index, tss_t tss);
 
-void gdt_load();
 static void gdt_reload_segs();
 
-void gdt_init(void) {
-       gdt_address = pmman_newlowerpage();
+void gdt_initialize() {
+       gdt_address = pagereg_get();
 
-    gdt_memory = (uint64_t *)(PHY_MAP_BASE + gdt_address);
+    gdt_memory = (uint64_t *)(SYDI_PHY_MAP_BASE + gdt_address);
 
     gdt_elements = 0;
 
@@ -31,12 +29,12 @@ void gdt_init(void) {
     gdt_reload_segs();
 }
 
-void gdt_add_tss(tss_t *tss) {
+/*void gdt_add_tss(tss_t *tss) {
     tss->gdt_index = gdt_elements;
     gdt_set_tss(gdt_elements, *tss);
     // reload GDT.
     gdt_load();
-}
+}*/
 
 static void gdt_set_null(uint64_t index) {
     gdt_memory[index] = 0;
@@ -73,7 +71,7 @@ static void gdt_set_data(uint64_t index) {
     gdt_elements = umax(gdt_elements, index+1);
 }
 
-static void gdt_set_tss(uint64_t index, tss_t tss) {
+/*static void gdt_set_tss(uint64_t index, tss_t tss) {
     // TODO: check for presence of segment descriptor in index+1?
 
     // initialize everything to zero.
@@ -100,7 +98,7 @@ static void gdt_set_tss(uint64_t index, tss_t tss) {
     
     // TSS descriptor is 16 bytes (2 elements) wide.
     gdt_elements = umax(gdt_elements, index+2);
-}
+}*/
 
 void gdt_load() {
     uint8_t gdt_pointer[10];
index c83f321..afb578c 100644 (file)
@@ -1,15 +1,15 @@
-#ifndef GDT_H
-#define GDT_H
+#ifndef SYDI_GDT_H
+#define SYDI_GDT_H
 
-#include "tss.h"
+//#include "tss.h"
 
-#define GDT_KERNEL_CS 0x08
-#define GDT_KERNEL_DS 0x10
-#define GDT_KERNEL_SS GDT_KERNEL_DS
+#define SYDI_GDT_KERNEL_CS 0x08
+#define SYDI_GDT_KERNEL_DS 0x10
+#define SYDI_GDT_KERNEL_SS GDT_KERNEL_DS
 
-void gdt_init(void);
-void gdt_load(void);
+void gdt_initialize();
+void gdt_load();
 
-void gdt_add_tss(tss_t *tss);
+//void gdt_add_tss(tss_t *tss);
 
 #endif
diff --git a/kernel/io.c b/kernel/io.c
new file mode 100644 (file)
index 0000000..5cedcc7
--- /dev/null
@@ -0,0 +1,21 @@
+#include "io.h"
+
+void io_out(int port, u8_t data) {
+    __asm__ __volatile__ (
+        "outb dx, al"
+        :
+        : "d"(port), "a"(data)
+    );
+}
+
+u8_t io_in(int port) {
+    u8_t value;
+    __asm__ __volatile__ (
+        "inb al, dx"
+        : "=a"(value)
+        : "d"(port)
+    );
+
+    return value;
+}
+
diff --git a/kernel/io.h b/kernel/io.h
new file mode 100644 (file)
index 0000000..df5bc40
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef SYDI_IO_H
+#define SYDI_IO_H
+
+#include "kernel.h"
+
+void io_out(int port, u8_t data);
+u8_t io_in(int port);
+
+#endif
diff --git a/kernel/ioapic.c b/kernel/ioapic.c
deleted file mode 100644 (file)
index 924f79c..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-#include "config.h"
-#include "ioapic.h"
-#include "acpi/tables.h"
-#include "klog.h"
-#include "kheap.h"
-#include "kutil.h"
-
-ioapic_t *ioapic_list;
-uint32_t ioapic_count;
-uint8_t ioapic_maxirq;
-
-static int ioapic_for(uint8_t irq);
-static uint32_t ioapic_read(uint8_t which, uint8_t reg);
-static void ioapic_write(uint8_t which, uint8_t reg, uint32_t value);
-
-void ioapic_init() {
-    // duplicate ACPI information, find IRQ count per.
-    ioapic_list = kheap_alloc(sizeof(ioapic_t) * acpi_ioapic_count);
-    ioapic_count = acpi_ioapic_count;
-    
-    ioapic_maxirq = 0;
-    for(uint32_t i = 0; i < acpi_ioapic_count; i ++) {
-        ioapic_list[i].id = acpi_ioapics[i].id;
-        ioapic_list[i].phyaddr = acpi_ioapics[i].phyaddr;
-        ioapic_list[i].base = acpi_ioapics[i].base;
-
-        uint32_t ver = ioapic_read(i, IOAPIC_REG_VER);
-        //uint32_t version = ver & 0xff;
-        uint32_t irqs = ((ver >> 16) & 0xff) + 1;
-
-        ioapic_list[i].len = irqs;
-
-        ioapic_maxirq = umax(ioapic_maxirq, ioapic_list[i].base + irqs);
-    }
-
-    // TODO: sort IOAPIC list
-}
-
-uint8_t ioapic_max_irq() {
-    return ioapic_maxirq;
-}
-
-void ioapic_set_irq(uint8_t irq, uint64_t apic_id, uint8_t vector) {
-    uint8_t which = ioapic_for(irq);
-    irq -= ioapic_list[which].base;
-
-    const uint32_t low_index = 0x10 + irq*2;
-    const uint32_t high_index = 0x10 + irq*2 + 1;
-
-    uint32_t high = ioapic_read(which, high_index);
-    // set APIC ID
-    high &= ~0xff000000;
-    high |= apic_id << 24;
-    ioapic_write(which, high_index, high);
-
-    uint32_t low = ioapic_read(which, low_index);
-
-    // unmask the IRQ
-    low &= ~(1<<16);
-
-    // set to physical delivery mode
-    low &= ~(1<<11);
-
-    // set to fixed delivery mode
-    low &= ~0x700;
-
-    // set delivery vector
-    low &= ~0xff;
-    low |= vector;
-
-    ioapic_write(which, low_index, low);
-}
-
-void ioapic_get_irq(uint8_t irq, uint64_t *apic_id, uint8_t *vector) {
-    uint8_t which = ioapic_for(irq);
-    irq -= ioapic_list[which].base;
-
-    uint32_t hv = ioapic_read(which, 0x10 + (irq*2) + 1);
-    uint32_t lv = ioapic_read(which, 0x10 + (irq*2));
-
-    //klog("get_irq(%i) = (%x, %x)", hv, lv);
-
-    if(apic_id) *apic_id = hv >> 24;
-    if(vector) *vector = lv & 0xff;
-}
-
-void ioapic_mask_irq(uint8_t irq, uint8_t masked) {
-    uint8_t which = ioapic_for(irq);
-    irq -= ioapic_list[which].base;
-
-    uint32_t value = ioapic_read(which, 0x10 + (irq*2));
-    if(masked) value |= 1<<16;
-    else value &= ~(1<<16);
-
-    ioapic_write(which, 0x10 + (irq*2), value);
-}
-
-static int ioapic_for(uint8_t irq) {
-    for(unsigned int i = 0; i < ioapic_count; i ++) {
-        if(ioapic_list[i].base <= irq &&
-            irq < ioapic_list[i].base + ioapic_list[i].len) return i;
-    }
-    return -1;
-}
-
-static uint32_t ioapic_read(uint8_t which, uint8_t reg) {
-    // set register id
-    *(uint32_t *)(PHY_MAP_BASE + ioapic_list[which].phyaddr) = reg;
-    // get register value
-    uint32_t value = *(uint32_t *)(PHY_MAP_BASE + ioapic_list[which].phyaddr
-        + 0x10);
-
-    return value;
-}
-
-static void ioapic_write(uint8_t which, uint8_t reg, uint32_t value) {
-    // set register id
-    *(uint32_t *)(PHY_MAP_BASE + ioapic_list[which].phyaddr) = reg;
-    // set register value
-    *(uint32_t *)(PHY_MAP_BASE + ioapic_list[which].phyaddr + 0x10) = value;
-}
diff --git a/kernel/ioapic.h b/kernel/ioapic.h
deleted file mode 100644 (file)
index 9d36106..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef IOAPIC_H
-#define IOAPIC_H
-
-#include <stdint.h>
-
-#define IOAPIC_REG_ID 0
-#define IOAPIC_REG_VER 1
-
-typedef struct {
-    uint8_t id;
-    uint32_t phyaddr;
-    uint32_t base;
-    uint32_t len;
-} ioapic_t;
-
-void ioapic_init();
-
-uint8_t ioapic_max_irq();
-
-void ioapic_set_irq(uint8_t irq, uint64_t apic_id, uint8_t vector);
-void ioapic_get_irq(uint8_t irq, uint64_t *apic_id, uint8_t *vector);
-void ioapic_mask_irq(uint8_t irq, uint8_t masked);
-
-#endif
diff --git a/kernel/kernel.h b/kernel/kernel.h
new file mode 100644 (file)
index 0000000..d05b6df
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef SYDI_KERNEL_H
+#define SYDI_KERNEL_H
+
+#include <stdint.h>
+
+#define NULL ((void *)0)
+
+typedef uint8_t u8_t;
+typedef uint32_t u32_t;
+typedef uint64_t u64_t;
+
+typedef int64_t s64_t;
+
+#endif
index 79cb6ab..9b8fe52 100644 (file)
@@ -21,6 +21,7 @@ SECTIONS {
        }
        
        . += kernel_vbase - kernel_pbase;
+    _start = .;
        
        .text : AT(ADDR(.text) - kernel_vbase + kernel_pbase) {
                _code = .;
diff --git a/kernel/keyboard.c b/kernel/keyboard.c
deleted file mode 100644 (file)
index 2b8bf40..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#include "keyboard.h"
-#include "apic.h"
-#include "kutil.h"
-#include "klock.h"
-#include "klog.h"
-
-#define KEYBOARD_QUEUE_SIZE 128
-
-uint8_t keyboard_queue[KEYBOARD_QUEUE_SIZE];
-uint64_t keyboard_start, keyboard_end;
-uint64_t keyboard_queue_lock;
-
-uint8_t keyboard_keys[256];
-
-static void keyboard_isr(void);
-
-void keyboard_init() {
-    keyboard_start = keyboard_end = 0;
-
-    keyboard_queue_lock = 0;
-
-    apic_set_isr(APIC_IRQ_1_INTR, keyboard_isr);
-}
-
-static void keyboard_isr(void) {
-    uint8_t code = kinb(0x60);
-
-    klock_acquire(&keyboard_queue_lock);
-
-    uint64_t next = (keyboard_end+1) % KEYBOARD_QUEUE_SIZE;
-    if(next != keyboard_start) {
-        keyboard_end = next;
-        keyboard_queue[next] = code;
-    }
-
-    klock_release(&keyboard_queue_lock);
-
-    unsigned char al = kinb(0x61);
-    al |= 0x82;
-    koutb(0x61, al);
-    al &= 0x7f;
-    koutb(0x61, al);
-}
-
-static int keyboard_nextcode(int *code) {
-    int found = 0;
-    klock_acquire(&keyboard_queue_lock);
-    
-    if(keyboard_start != keyboard_end) {
-        found = 1;
-        *code = keyboard_queue[keyboard_start];
-        keyboard_start = (keyboard_start+1)%(KEYBOARD_QUEUE_SIZE);
-    }
-
-    klock_release(&keyboard_queue_lock);
-    return found;
-}
diff --git a/kernel/keyboard.h b/kernel/keyboard.h
deleted file mode 100644 (file)
index 86b0753..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef KEYBOARD_H
-#define KEYBOARD_H
-
-#include <stdint.h>
-
-void keyboard_init();
-
-#endif
diff --git a/kernel/khash.c b/kernel/khash.c
deleted file mode 100644 (file)
index 0a387c2..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-#include "khash.h"
-#include "kheap.h"
-#include "kutil.h"
-
-void khash_init(khash_t *table, uint64_t cell_count,
-    uint64_t (*hash)(void *key), void *(*extract)(void *entry)) {
-
-    table->hash = hash;
-    table->extract = extract;
-
-    table->cell_count = cell_count;
-    table->cells = kheap_alloc(cell_count * sizeof(void *));
-    table->used = kheap_alloc(cell_count * sizeof(uint8_t));
-    for(uint64_t i = 0; i < cell_count; i ++) {
-        table->cells[i] = NULL;
-        table->used[i] = 0;
-    }
-}
-
-void khash_insert(khash_t *table, void *value) {
-    uint64_t hash = table->hash(table->extract(value));
-
-    uint64_t initial = hash % table->cell_count;
-    uint64_t extra;
-    for(extra = 0; extra < table->cell_count; extra ++) {
-        if(!table->used[(initial + extra) % table->cell_count]) break;
-    }
-    if(extra == table->cell_count) {
-        // make table larger.
-        khash_resize(table, table->cell_count * 2);
-        // call recursively.
-        khash_insert(table, value);
-    }
-
-    table->used[(initial + extra) % table->cell_count] = 1;
-    table->cells[(initial + extra) % table->cell_count] = value;
-}
-
-void *khash_find(khash_t *table, void *key) {
-    uint64_t hash = table->hash(key);
-
-    uint64_t extra;
-    for(extra = 0; extra < table->cell_count; extra ++) {
-        if(!table->used[(hash + extra) % table->cell_count]) return NULL;
-        if(table->extract(table->cells[(hash + extra) % table->cell_count])
-            == key) {
-            return table->cells[(hash + extra) % table->cell_count];
-        }
-    }
-
-    // wasn't found, table entirely full.
-    return NULL;
-}
-
-void khash_resize(khash_t *table, uint64_t new_size) {
-    void **old_cells = table->cells;
-    uint8_t *old_used = table->used;
-    uint64_t old_size = table->cell_count;
-
-    khash_init(table, new_size, table->hash, table->extract);
-
-    for(uint64_t i = 0; i < old_size; i ++) {
-        if(old_used[i]) khash_insert(table, old_cells[i]);
-    }
-    kheap_free(old_cells);
-    kheap_free(old_used);
-}
-
-void *khash_passthrough(void *value) {
-    return value;
-}
-
-uint64_t khash_address(void *key) {
-    return (uint64_t)key;
-}
-
-uint64_t khash_string(void *key) {
-    const char *str = key;
-
-    /* djb2 string hashing algorithm. */
-    uint32_t hash = 5381;
-    int c;
-
-    while((c = *str++)) hash = ((hash << 5) + hash) + c;
-
-    return hash;
-}
diff --git a/kernel/khash.h b/kernel/khash.h
deleted file mode 100644 (file)
index 3cc727c..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef KHASH_H
-#define KHASH_H
-
-#include <stdint.h>
-
-typedef struct khash_t {
-    void **cells;
-    uint8_t *used;
-    uint64_t cell_count;
-
-    uint64_t (*hash)(void *key);
-    void *(*extract)(void *entry);
-} khash_t;
-
-void khash_init(khash_t *table, uint64_t cell_count,
-    uint64_t (*hash)(void *key), void *(*extract)(void *entry));
-
-void khash_insert(khash_t *table, void *value);
-void *khash_find(khash_t *table, void *key);
-
-void khash_resize(khash_t *table, uint64_t new_size);
-
-// utility functions
-void *khash_passthrough(void *value);
-
-uint64_t khash_address(void *key);
-uint64_t khash_string(void *key);
-
-#endif
index 6809416..2a7ec72 100644 (file)
 #include "kheap.h"
-#include "vmman.h"
+#include "vmem.h"
+#include "debug.h"
+#include "util.h"
 #include "config.h"
-#include "klog.h"
-#include "klock.h"
 
-uint64_t kheap_pages;
-uint64_t kheap_lock;
-uint64_t kheap_watermark;
+#define SYDI_KHEAP_MAX_BLOCK_SIZE 12
 
-uint8_t *kheap_memory;
+// NOTE: code assumes this is at most 4GB
+#define SYDI_KHEAP_PER_VSIZE 0x100000 // 128KB heap per block size
 
-static void kheap_add_pages(uint64_t count);
+typedef struct {
+    u64_t pages;
+    u64_t head;
+    u64_t tail;
+    u32_t *start;
+    u64_t elem_size;
+} heap_t;
 
-void kheap_init(void) {
-    kheap_memory = (uint8_t *)VIRT_KERNEL_HEAP;
-    kheap_pages = 0;
-    kheap_add_pages(1);
+static void *kheap_alloc_helper(int which);
+static void kheap_free_helper(int which, void *ptr);
 
-    kheap_lock = 0;
-    kheap_watermark = 0;
-}
+heap_t kheap_heap[SYDI_KHEAP_MAX_BLOCK_SIZE];
 
-// assumes lock acquired already.
-static void kheap_add_pages(uint64_t count) {
-    for(uint64_t i = 0; i < count; i ++) {
-        vmman_back_page(VIRT_KERNEL_HEAP + (kheap_pages++)*0x1000,
-            VMMAN_KERNEL_DATA);
+void kheap_initialize() {
+    for(int i = 0; i < SYDI_KHEAP_MAX_BLOCK_SIZE; i ++) {
+        kheap_heap[i].pages = 0;
+        kheap_heap[i].head = -1;
+        kheap_heap[i].tail = -1;
+        kheap_heap[i].start = (void *)(SYDI_VIRT_KERNEL_HEAP + SYDI_KHEAP_PER_VSIZE*i);
+        kheap_heap[i].elem_size = 1<<i;
     }
 }
 
-void *kheap_alloc(uint64_t size) {
-    klock_acquire(&kheap_lock);
-    if(kheap_watermark + size > kheap_pages * 0x1000) {
-        kheap_add_pages(size / 0x1000 + 1);
-    }
-
-    void *result = kheap_memory + kheap_watermark;
-    kheap_watermark += size;
+void *kheap_alloc(u64_t size) {
+    sydi_assert(size <= 1<<SYDI_KHEAP_MAX_BLOCK_SIZE,
+        "Heap allocation within size bounds");
+    size = round_pow2_up(size);
+    if(size < 4) size = 4;
+    int which = log2(size);
 
-    klock_release(&kheap_lock);
-
-    return result;
+    return kheap_alloc_helper(which);
 }
 
-void *kheap_alloc_aligned(uint64_t size, uint64_t align) {
-    klock_acquire(&kheap_lock);
-    kheap_watermark = (kheap_watermark + align-1) & ~(align-1);
-    if(kheap_watermark + size > kheap_pages * 0x1000) {
-        uint64_t left = kheap_watermark + size - kheap_pages * 0x1000;
-        kheap_add_pages(left / 0x1000 + 1);
+void kheap_free(void *ptr) {
+    for(int i = 0; i+1 < SYDI_KHEAP_MAX_BLOCK_SIZE; i ++) {
+        if((kheap_heap[i+1].start - (u32_t *)ptr) > 0) {
+            kheap_free_helper(i, ptr);
+            return;
+        }
     }
+    kheap_free_helper(SYDI_KHEAP_MAX_BLOCK_SIZE-1, ptr);
+}
+
+static void *kheap_alloc_helper(int which) {
+    heap_t *heap = kheap_heap + which;
 
-    void *result = kheap_memory + kheap_watermark;
-    kheap_watermark += size;
+    // do we need another page?
+    if(heap->head == -1ull) {
+        vmem_kernel_back((u64_t)heap->start + heap->pages*0x1000,
+            VMEM_KERNEL | VMEM_READ | VMEM_WRITE | VMEM_CACHE);
 
-    klock_release(&kheap_lock);
+        for(int i = heap->elem_size; i < 0x1000; i += heap->elem_size) {
+            // set previous to point here
+            heap->start[heap->pages * 0x400 + (i - heap->elem_size)/4] =
+                heap->pages * 0x1000 + i;
+        }
 
-    return result;
+        // set the old tail to point to this new page, if one exists
+        if(heap->tail != -1ull) {
+            heap->start[heap->tail/4] = heap->pages * 0x1000;
+        }
+        // set up new head
+        heap->head = heap->pages * 0x1000;
+        heap->pages ++;
+
+        // set last to point to -1u
+        heap->start[heap->pages * 0x400 - (heap->elem_size/4)] = -1u;
+        // new tail points here
+        heap->tail = heap->pages * 0x1000 - (heap->elem_size);
+    }
+
+    // use current head
+    u32_t use = heap->head;
+    // if tail == head, set tail = -1 (nothing more left)
+    if(heap->head == heap->tail) heap->tail = -1ull;
+    // update existing head
+    heap->head = heap->start[use/4];
+    return heap->start + (use)/4;
 }
 
-void kheap_free(void *memory) {
-    // using watermark allocator, there is no free.
+static void kheap_free_helper(int which, void *ptr) {
+    heap_t *heap = kheap_heap + which;
+
+    // find offset
+    u64_t offset = (u64_t)ptr - (u64_t)heap->start;
+    // if existing tail exists, set its next to this
+    if(heap->tail != -1ull) {
+        heap->start[heap->tail/4] = (u32_t)offset;
+    }
+    // update tail
+    heap->tail = offset;
+    // update head if necessary
+    if(heap->head == -1ull) heap->head = heap->tail;
 }
index 5866789..d1960e4 100644 (file)
@@ -1,12 +1,11 @@
-#ifndef KHEAP_H
-#define KHEAP_H
+#ifndef SYDI_KHEAP_H
+#define SYDI_KHEAP_H
 
-#include <stdint.h>
+#include "kernel.h"
 
-void kheap_init(void);
+void kheap_initialize();
 
-void *kheap_alloc(uint64_t size);
-void *kheap_alloc_aligned(uint64_t size, uint64_t align);
-void kheap_free(void *memory);
+void *kheap_alloc(u64_t size);
+void kheap_free(void *ptr);
 
 #endif
diff --git a/kernel/kid.c b/kernel/kid.c
deleted file mode 100644 (file)
index 85c20a7..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "kid.h"
-
-uint64_t kid_last, kid_count;
-
-void kid_init(void) {
-    kid_last = 0;
-    kid_count = 0;
-}
-
-kid_t kid_new() {
-    kid_last += (kid_count++ * 2 + 31) % 37;
-    return kid_last;
-}
diff --git a/kernel/kid.h b/kernel/kid.h
deleted file mode 100644 (file)
index c667739..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef KID_H
-#define KID_H
-
-#include <stdint.h>
-
-typedef uint64_t kid_t;
-
-void kid_init(void);
-
-kid_t kid_new();
-
-#endif
diff --git a/kernel/klist.h b/kernel/klist.h
deleted file mode 100644 (file)
index 7b90627..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef KLIST_H
-#define KLIST_H
-
-/* kernel linked list implementation. idea stolen from Linux kernel, no copied
-    code though. */
-
-typedef struct klist_t {
-    void *next, *prev;
-} klist_t;
-
-#define klist_traverse(type, head, lname) \
-    for(type *p = (head); p; p = p->lname.next)
-
-
-#define klist_append(type, head, ptr, lname) \
-    do { \
-        if(head == NULL) { \
-            head = ptr; \
-            head->lname.prev = head; \
-            head->lname.next = NULL; \
-        } \
-        else { \
-            type *_tail = head->lname.prev; \
-            _tail->lname.next = ptr; \
-            ptr->lname.prev = _tail; \
-            ptr->lname.next = NULL; \
-            head->lname.prev = ptr; \
-        } \
-    } while(0)
-
-#define klist_prepend(type, head, ptr, lname) \
-    do { \
-        if(head == NULL) { \
-            head = ptr; \
-            head->lname.prev = head; \
-            head->lname.next = NULL; \
-        } \
-        else { \
-            type *_head = head->lname.prev; \
-            ptr->lname.prev = head->lname.prev; \
-            ptr->lname.next = head; \
-            head->lname.prev = ptr; \
-        } \
-    } while(0)
-
-#define klist_remove(type, head, ptr, lname) \
-    do { \
-        type *_p = ptr->lname.prev; \
-        type *_n = ptr->lname.prev; \
-        if(head != ptr) { \
-            if(_p) _p->lname.next = _n; \
-            if(_n) _n->lname.prev = _p; \
-        } \
-        else { \
-            if(_n) _n->lname.prev = _p; \
-            head = _n; \
-        } \
-    } while(0)
-
-#define klist_empty(head) (head == NULL)
-
-#define klist_tail(type, head, lname) head?((type *)head->lname.prev):head
-
-#endif
diff --git a/kernel/klock.c b/kernel/klock.c
deleted file mode 100644 (file)
index 9799401..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "klock.h"
-#include "klog.h"
-
-extern void klock_spin_acquire(uint64_t *spinlock);
-extern uint64_t klock_spin_tryacquire(uint64_t *spinlock);
-
-void klock_acquire(uint64_t *spinlock) {
-    if((uint64_t)spinlock & 0x7) {
-        klog("Spinlock not on qword boundary!");
-        __asm__("hlt");
-    }
-    klock_spin_acquire(spinlock);
-}
-
-int klock_tryacquire(uint64_t *spinlock) {
-    if((uint64_t)spinlock & 0x7) {
-        klog("Spinlock not on qword boundary!");
-        __asm__("hlt");
-    }
-    return klock_spin_tryacquire(spinlock);
-}
-
-void klock_release(uint64_t *spinlock) {
-    if((uint64_t)spinlock & 0x7) {
-        klog("Spinlock not on qword boundary!");
-        __asm__("hlt");
-    }
-    *spinlock = 0;
-}
diff --git a/kernel/klock.h b/kernel/klock.h
deleted file mode 100644 (file)
index b194112..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef KLOCK_H
-#define KLOCK_H
-
-#include <stdint.h>
-
-#define KLOCK_INIT_UNLOCKED 0
-
-void klock_acquire(uint64_t *spinlock);
-int klock_tryacquire(uint64_t *spinlock);
-void klock_release(uint64_t *spinlock);
-
-#endif
diff --git a/kernel/klock_spin.s b/kernel/klock_spin.s
deleted file mode 100644 (file)
index 9fb3edf..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-global klock_spin_acquire
-klock_spin_acquire:
-       ; try to acquire lock.
-       lock bts qword [rdi], 0
-       jnc     .acquired
-
-       ; failed, so it's already locked by something.
-       .loop:
-       ; rep nop on older systems; used as a hint to newer CPUs that this is
-       ; a spinlock loop.
-       pause
-       ; read without locking to avoid unnecessary bus locking.
-       test    qword [rdi], 0
-       jne     .loop
-
-       ; now try locking the bus.
-       lock bts qword [rdi], 0
-       ; . . . but someone else may have grabbed it in the meantime.
-       jc      .loop
-
-       .acquired:
-       ret
-
-global klock_spin_tryacquire
-klock_spin_tryacquire:
-       mov     rax, 0
-       ; try to acquire lock.
-       lock bts qword [rdi], 0
-       jnc     .finish
-
-       ; failed, so return 1.
-       mov     rax, 1
-
-       .finish:
-       ret
diff --git a/kernel/klog.c b/kernel/klog.c
deleted file mode 100644 (file)
index 3e896a1..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-#include <stdarg.h>
-#include <stdint.h>
-
-#include "klog.h"
-#include "terminal.h"
-#include "kutil.h"
-#include "klock.h"
-
-static uint64_t klog_lock;
-
-static int klog_format_int(char *buffer, int value);
-static int klog_format_hex(char *buffer, uint64_t value);
-static int klog_format_string(char *buffer, const char *value);
-
-static void (*klog_print)(const char *string);
-
-void klog_init(void) {
-    klog_print = NULL;
-    klog_lock = 0;
-}
-
-void klog_use_terminal(void) {
-    klog_print = terminal_puts;
-}
-
-void klog(const char *fmt, ...) {
-    if(klog_print == NULL) return;
-
-    klock_acquire(&klog_lock);
-
-    va_list v;
-    va_start(v, fmt);
-
-    // TODO: find a better way to do this.
-    char buffer[256];
-    int i = 0;
-    int bi = 0;
-    while(fmt[i] != 0) {
-        if(fmt[i] != '%') {
-            buffer[bi++] = fmt[i++];
-            continue;
-        }
-        if(fmt[i+1] == 0) break;
-        else if(fmt[i+1] == 'i') {
-            int i = va_arg(v, int);
-
-            bi += klog_format_int(buffer + bi, i);
-        }
-        else if(fmt[i+1] == 'p' || fmt[i+1] == 'x') {
-            uint64_t address = va_arg(v, uint64_t);
-
-            bi += klog_format_hex(buffer + bi, address);
-        }
-        else if(fmt[i+1] == 's') {
-            const char *str = va_arg(v, const char *);
-
-            bi += klog_format_string(buffer + bi, str);
-        }
-        i += 2;
-    }
-
-    buffer[bi] = '\n';
-    buffer[bi+1] = 0;
-
-    klog_print(buffer);
-
-    klock_release(&klog_lock);
-}
-
-static int klog_format_int(char *buffer, int value) {
-    int size = 0;
-    if(value < 0) buffer[size++] = '-';
-    if(value == 0) buffer[size++] = '0';
-
-    while(value > 0) {
-        buffer[size++] = '0' + (value%10);
-        value /= 10;
-    }
-    kmemrev(buffer, size);
-    return size;
-}
-
-static int klog_format_hex(char *buffer, uint64_t value) {
-    int size = 0;
-    buffer[size++] = '0';
-    buffer[size++] = 'x';
-    const char *hex = "0123456789abcdef";
-
-    int zeroStart = 0;
-    for(int j = 0; j < 16; j ++) {
-        buffer[size++] = hex[value & 0xf];
-
-        if(value & 0xf) zeroStart = j+1;
-
-        value >>= 4;
-    }
-    kmemrev(buffer + 2, zeroStart);
-    buffer[2 + zeroStart] = 0;
-
-    if(zeroStart == 0) {
-        buffer[2] = '0';
-        zeroStart ++;
-    }
-
-    return 2 + zeroStart;
-}
-
-static int klog_format_string(char *buffer, const char *value) {
-    int len = 0;
-    while(*value) buffer[len++] = *value++;
-    return len;
-}
diff --git a/kernel/klog.h b/kernel/klog.h
deleted file mode 100644 (file)
index 43ba0ed..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef KLOG_H
-#define KLOG_H
-
-void klog_init(void);
-void klog_use_terminal(void);
-
-void klog(const char *fmt, ...);
-
-#endif
index 92c1252..e396c2e 100644 (file)
 #include <stdint.h>
-
 #include "config.h"
-#include "kutil.h"
-#include "pmman.h"
-#include "klog.h"
-#include "terminal.h"
-#include "apic.h"
-#include "vmman.h"
-#include "smp.h"
+#include "kernel.h"
+#include "debug.h"
 #include "gdt.h"
-#include "tss.h"
+
+#include "pagereg.h"
+#include "vmem.h"
 #include "kheap.h"
-#include "acpi/tables.h"
-#include "ioapic.h"
-#include "keyboard.h"
-#include "context.h"
-#include "sched.h"
-#include "ktime.h"
-#include "pit.h"
+
+static void test();
 
 /* Entry conditions:
     - system in long mode
     - paging enabled
+    - rsp set to a small stack for provisional use.
+    When bootstrap == 1:
     - memory_map points to a (0,0)-terminated list of memory regions as
         (base,size).
-    - video_info points to [address, width, height, depth] tuple.
     - Memory address PHY_MAP_BASE has the first 1GB of physical mapped
-    - rsp set to a small stack for provisional use.
 */
+uint64_t sydi_kmain_bootstrap = 1;
 void kmain(uint64_t *memmap) {
-    char *vidmem = (char *)(PHY_MAP_BASE + 0xb8000);
-
-    for(int i = 0; i < 160; i ++) {
-        for(int j = 0; j < 25; j ++) vidmem[i+j*160] = 0;
-    }
-
-    /* HACK: set SMP CPU count to zero, it needs to be initialized. */
-    {
-        extern uint64_t smp_cpu_count;
-        smp_cpu_count = 0;
+    // if bootstrap processor, then perform kernel initialization.
+    if(sydi_kmain_bootstrap) {
+        // no more bootstrap. Note that no lock required, only one proc active
+        // by here
+        sydi_kmain_bootstrap = 0;
+
+        debug_init();
+
+        // clear video memory
+        char *vidmem = (char *)(SYDI_PHY_MAP_BASE + 0xb8000);
+
+        for(int i = 0; i < 160; i ++) {
+            for(int j = 0; j < 25; j ++) vidmem[i+j*160] = 0;
+        }
+
+        // initialize the important stuff
+        pagereg_initialize(memmap);
+        vmem_initialize();
+        kheap_initialize();
+        gdt_initialize();
+
+        // set up the new stack
+        for(u64_t i = 0; i < SYDI_VIRT_KERNEL_STACK_SIZE; i += 0x1000) {
+            vmem_kernel_back(SYDI_VIRT_KERNEL_STACK + i,
+                VMEM_READ | VMEM_WRITE | VMEM_AGGRESSIVE_CACHE);
+        }
+        __asm__ __volatile__(
+            "mov rsp, rax"
+            : : "a"(SYDI_VIRT_KERNEL_STACK + SYDI_VIRT_KERNEL_STACK_SIZE)
+        );
     }
 
-    apic_disable_interrupts();
-    pmman_init(memmap);
-
-    terminal_init(0xb8000, 80, 25);
-
-    klog_init();
-    klog_use_terminal();
-
-    gdt_init();
-
-    vmman_init();
-
-    kheap_init();
-
-    // set up new stack, old one is only supposed to be temporary
-    void *stack = kheap_alloc(0x2000);
-    __asm__ __volatile__(
-        "mov rsp, rax"
-        : : "a"(stack + 0x2000)
-    );
-    // core functionality initialized, time to start loading modules
-
-    acpi_tables_init();
-
-    ioapic_init();
-
-    apic_init();
-
-    ktime_init();
-
-    klog("Initializing SMP support . . .");
-    smp_init();
-
-    klog("Enabling interrupts . . .");
-    apic_enable_interrupts();
-
-    klog("Initializing keyboard input . . .");
-    keyboard_init();
-
-    klog("Setting up context manager . . .");
-    context_init();
-
-    sched_init();
-
-    thread_t *idle = thread_create_kworker(sched_idle_main, NULL, 0x1000);
-    PERCPU(sched_idle) = idle;
-
-    pit_init();
-
-    pit_install_ktime();
-
-    klog("Finished initialization.");
-
-    apic_set_isr(APIC_TIMER_INTR, sched_swap);
-
-    klog("Enabling timer . . .");
-    apic_enable_timer();
-
-    klog("Waking APs . . .");
-    smp_ap_init();
-
-    klog("Entering scheduling loop . . .");
-    // enter main loop
-    sched_kyield();
-
-    // should never be reached . . .
-    klog("UD2 incoming, should never be reached.");
-
-    __asm__("ud2");
     __asm__("hlt");
 }
diff --git a/kernel/kphy.c b/kernel/kphy.c
deleted file mode 100644 (file)
index 84dfa31..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-#include "kphy.h"
-#include "kutil.h"
-#include "config.h"
-
-uint8_t kphy_r8(uint64_t phy_address) {
-    return *(uint8_t *)(PHY_MAP_BASE + phy_address);
-}
-
-uint16_t kphy_r16(uint64_t phy_address) {
-    return *(uint16_t *)(PHY_MAP_BASE + phy_address);
-}
-
-uint32_t kphy_r32(uint64_t phy_address) {
-    return *(uint32_t *)(PHY_MAP_BASE + phy_address);
-}
-
-uint64_t kphy_r64(uint64_t phy_address) {
-    return *(uint64_t *)(PHY_MAP_BASE + phy_address);
-}
-
-void kphy_w8(uint64_t phy_address, uint8_t value) {
-    *(uint8_t *)(PHY_MAP_BASE + phy_address) = value;
-}
-
-void kphy_w16(uint64_t phy_address, uint16_t value) {
-    *(uint16_t *)(PHY_MAP_BASE + phy_address) = value;
-}
-
-void kphy_w32(uint64_t phy_address, uint32_t value) {
-    *(uint32_t *)(PHY_MAP_BASE + phy_address) = value;
-}
-
-void kphy_w64(uint64_t phy_address, uint64_t value) {
-    *(uint64_t *)(PHY_MAP_BASE + phy_address) = value;
-}
-
-void kphy_read(uint64_t phy_address, void *data, uint64_t size) {
-    kmemcpy(data, PHY_MAP_BASE + phy_address, size);
-}
-
-void kphy_write(uint64_t phy_address, const void *data, uint64_t size) {
-    kmemcpy(PHY_MAP_BASE + phy_address, data, size);
-}
-
-int kphy_cmp(uint64_t phy_address, const void *data, uint64_t size) {
-    return kmemcmp(PHY_MAP_BASE + phy_address, data, size);
-}
diff --git a/kernel/kphy.h b/kernel/kphy.h
deleted file mode 100644 (file)
index d84a84d..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef KPHY_H
-#define KPHY_H
-
-#include <stdint.h>
-
-uint8_t kphy_r8(uint64_t phy_address);
-uint16_t kphy_r16(uint64_t phy_address);
-uint32_t kphy_r32(uint64_t phy_address);
-uint64_t kphy_r64(uint64_t phy_address);
-
-void kphy_w8(uint64_t phy_address, uint8_t value);
-void kphy_w16(uint64_t phy_address, uint16_t value);
-void kphy_w32(uint64_t phy_address, uint32_t value);
-void kphy_w64(uint64_t phy_address, uint64_t value);
-
-void kphy_read(uint64_t phy_address, void *data, uint64_t size);
-void kphy_write(uint64_t phy_address, const void *data, uint64_t size);
-int kphy_cmp(uint64_t phy_address, const void *data, uint64_t size);
-
-#endif
diff --git a/kernel/ksem.c b/kernel/ksem.c
deleted file mode 100644 (file)
index 3f91b64..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "ksem.h"
-#include "smp.h"
-
-extern void ksem_inc_helper(ksynch_t *synch, uint64_t *value);
-extern void ksem_dec_helper(ksynch_t *synch, thread_t *thread,
-    uint64_t *value);
-
-void ksem_inc(ksem_t *sem) {
-    ksem_inc_helper(sem->synch, &sem->value);
-}
-
-void ksem_dec(ksem_t *sem) {
-    ksem_dec_helper(sem->synch, PERCPU(sched_thread), &sem->value);
-}
diff --git a/kernel/ksem.h b/kernel/ksem.h
deleted file mode 100644 (file)
index 0c4dd84..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef KSEM_H
-#define KSEM_H
-
-#include "ksynch.h"
-
-typedef struct ksem_t {
-    ksynch_t *synch;
-    uint64_t value;
-} __attribute__((aligned(16))) ksem_t;
-
-void ksem_inc(ksem_t *sem);
-void ksem_dec(ksem_t *sem);
-
-#endif
diff --git a/kernel/ksem_helper.s b/kernel/ksem_helper.s
deleted file mode 100644 (file)
index 9237e65..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-[bits 64]
-
-[extern ksynch_wait]
-[extern ksynch_wake]
-
-[global ksem_inc_helper]
-ksem_inc_helper:
-       mov     rax, [rsi]
-       mov     rbx, rax
-       inc     rbx
-       lock cmpxchg [rsi], rbx
-       jnz     ksem_inc_helper
-       cmp     rax, 0
-       je .wake
-       ret
-       .wake:
-       mov     rsi, 1
-       call    ksynch_wake
-       ret
-
-[global ksem_dec_helper]
-ksem_dec_helper:
-       mov     rax, [rdx]
-       cmp     rax, 0
-       je      .wait
-       mov     rbx, rax
-       dec     rbx
-       lock    cmpxchg [rdx], rbx
-       jnz     ksem_dec_helper
-       ret
-       .wait:
-       push    rdi
-       push    rsi
-       push    rdx
-       xor     rdx, rdx
-       call    ksynch_wait
-       pop     rdx
-       pop     rsi
-       pop     rdi
-       jmp     ksem_dec_helper
diff --git a/kernel/ksynch.c b/kernel/ksynch.c
deleted file mode 100644 (file)
index 4e9fea3..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#include "ksynch.h"
-#include "kutil.h"
-#include "kheap.h"
-#include "thread.h"
-#include "klock.h"
-
-ksynch_t *ksynch_create() {
-    ksynch_t *result = kheap_alloc(sizeof(ksynch_t));
-    result->waiters = NULL;
-    result->waiter_count = 0;
-
-    return result;
-}
-
-void ksynch_wait(ksynch_t *synch, thread_t *thread, uint64_t *address,
-    uint64_t value) {
-
-    ksynch_wait_t *we = kheap_alloc(sizeof(ksynch_wait_t));
-    we->thread = thread;
-    klist_append(ksynch_wait_t, synch->waiters, we, list);
-
-    klock_acquire(&thread->thread_lock);
-    thread->waiting = synch;
-    thread->status |= THREAD_WAITING;
-    klock_release(&thread->thread_lock);
-
-    if(*address <= value) return;
-}
-
-void ksynch_wake(ksynch_t *synch, uint64_t atmost) {
-    while(atmost > 0 && !klist_empty(synch->waiters)) {
-        ksynch_wait_t *next = synch->waiters;
-        klist_remove(ksynch_wait_t, synch->waiters, synch->waiters, list);
-        thread_t *thread = next->thread;
-
-        klock_acquire(&thread->thread_lock);
-        thread->waiting = NULL;
-        thread->status &= ~THREAD_WAITING;
-        klock_release(&thread->thread_lock);
-
-        atmost --;
-        kheap_free(next);
-    }
-}
diff --git a/kernel/ksynch.h b/kernel/ksynch.h
deleted file mode 100644 (file)
index 2522b56..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef KSYNCH_H
-#define KSYNCH_H
-
-#include <stdint.h>
-
-#include "klist.h"
-
-struct thread_t;
-typedef struct thread_t thread_t;
-
-typedef struct ksynch_wait_t {
-    thread_t *thread;
-    klist_t list;
-} ksynch_wait_t;
-
-typedef struct ksynch_t {
-    ksynch_wait_t *waiters;
-    uint64_t waiter_count;
-} ksynch_t;
-
-ksynch_t *ksynch_create();
-/* Places the thread into a waiting state if *address <= value. */
-void ksynch_wait(ksynch_t *synch, thread_t *thread, uint64_t *address,
-    uint64_t value);
-/* Wakes up to atmost waiters on the given ksynch object. */
-void ksynch_wake(ksynch_t *synch, uint64_t atmost);
-
-#endif
diff --git a/kernel/ktime.c b/kernel/ktime.c
deleted file mode 100644 (file)
index a4bf2ef..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#include "ktime.h"
-
-ktime_updater_t ktime_updater;
-ktime_t ktime_last;
-
-void ktime_init(void) {
-    ktime_last = 0;
-}
-
-void ktime_set_updater(ktime_updater_t updater) {
-    ktime_updater = updater;
-}
-
-ktime_t ktime_make(int64_t s, int64_t ns) {
-    return s*1000000000 + ns;
-}
-
-int64_t ktime_getnsec(ktime_t time) {
-    return time % 1000000000;
-}
-
-int64_t ktime_getsec(ktime_t time) {
-    return time / 1000000000;
-}
-
-ktime_t ktime_addnsec(ktime_t time, int64_t ns) {
-    return time + ns;
-}
-
-ktime_t ktime_current() {
-    return ktime_last;
-}
-
-void ktime_update_current(ktime_updater_t updater, void *data) {
-    if(updater == ktime_updater) ktime_updater(data, &ktime_last);
-}
diff --git a/kernel/ktime.h b/kernel/ktime.h
deleted file mode 100644 (file)
index d0e8df3..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef KTIME_H
-#define KTIME_H
-
-#include <stdint.h>
-
-typedef int64_t ktime_t;
-typedef void (*ktime_updater_t)(void *, ktime_t *);
-
-void ktime_init(void);
-void ktime_set_updater(ktime_updater_t updater);
-
-ktime_t ktime_make(int64_t s, int64_t ns);
-int64_t ktime_getnsec(ktime_t time);
-int64_t ktime_getsec(ktime_t time);
-ktime_t ktime_addnsec(ktime_t time, int64_t ns);
-
-ktime_t ktime_current(void);
-void ktime_update_current(ktime_updater_t updater, void *data);
-
-#endif
diff --git a/kernel/kutil.c b/kernel/kutil.c
deleted file mode 100644 (file)
index a847168..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-#include "kutil.h"
-#include "klog.h"
-
-uint64_t umin(uint64_t a, uint64_t b) {
-    if(a<b) return a;
-    return b;
-}
-
-int64_t smin(int64_t a, int64_t b) {
-    if(a<b) return a;
-    return b;
-}
-
-uint64_t umax(uint64_t a, uint64_t b) {
-    if(a>b) return a;
-    return b;
-}
-
-int64_t smax(int64_t a, int64_t b) {
-    if(a>b) return a;
-    return b;
-}
-
-void kmemset(void *address, int value, uint64_t bytes) {
-    uint8_t *mem = address;
-    for(uint64_t i = 0; i < bytes; i ++) mem[i] = value;
-}
-
-void kmemcpy(void *dest, const void *source, uint64_t bytes) {
-    kmemmove(dest, source, bytes);
-}
-
-void kmemmove(void *dest, const void *source, uint64_t bytes) {
-    uint8_t *destp = dest; 
-    const uint8_t *sourcep = source;
-    if(dest <= source) {
-        for(uint64_t i = 0; i < bytes; i++) {
-            destp[i] = sourcep[i];
-        }
-    }
-    else {
-        for(uint64_t i = bytes; i > 0; i--) {
-            destp[i-1] = sourcep[i-1];
-        }
-    }
-}
-
-int kmemcmp(const void *mem1, const void *mem2, uint64_t bytes) {
-    const uint8_t *m1 = mem1, *m2 = mem2;
-    for(uint64_t i = 0; i < bytes; i ++) {
-        if(m1[i] > m2[i]) return 1;
-        if(m1[i] < m2[i]) return -1;
-    }
-    return 0;
-}
-
-void kmemrev(void *memory, uint64_t bytes) {
-    uint8_t *p1 = memory, *p2 = memory;
-    p2 += bytes-1;
-
-    while(p1 < p2) {
-        uint8_t t = *p1;
-        *p1 = *p2;
-        *p2 = t;
-
-        p1 ++, p2 --;
-    }
-}
-
-const void *kmemmem(const void *haystack, uint64_t hlength, const void *needle,
-    uint64_t nlength) {
-
-    const uint8_t *hp = haystack, *np = needle;
-
-    if(nlength > hlength) return NULL;
-    
-    for(uint64_t offset = 0; offset <= hlength-nlength; offset ++) {
-        uint64_t i;
-        for(i = 0; i < nlength; i ++) {
-            if(hp[i] != np[i]) break;
-        }
-        if(i == nlength) return hp + offset;
-    }
-    return NULL;
-}
-
-uint8_t kinb(int port) {
-    uint8_t value;
-    __asm__ __volatile__(
-        "inb al, dx"
-        : "=a"(value): "d"(port)
-    );
-
-    return value;
-}
-
-void koutb(int port, uint8_t value) {
-    __asm__ __volatile__(
-        "out dx, al"
-        : : "a"(value), "d"(port)
-    );
-}
-
-void kiowait() {
-    // stolen from http://wiki.osdev.org/Inline_Assembly/Examples#IO_WAIT
-
-    // port 0x80 is used for 'checkpoints' during POST.
-    // The Linux kernel seems to think it is free for use.
-    __asm__ __volatile__("outb 0x80, al" : : "a"(0));
-}
-
-int kcpuid_bitcheck(uint32_t request, uint32_t bit) {
-    uint32_t result[4];
-    __asm__("cpuid" : "=a"(result[0]), "=b"(result[1]), "=c"(result[2]),
-        "=d"(result[3]) : "a"(request));
-
-    if(bit < 32) return result[0] & (1<<bit);
-    else if(bit < 64) return result[1] & (1<<(bit-32));
-    else if(bit < 96) return result[2] & (1<<(bit-64));
-    else if(bit < 128) return result[3] & (1<<(bit-96));
-    else {
-        klog("Unknown bit %i in CPUID bit-check", bit);
-        // default: not there.
-        return 0;
-    }
-}
-
-void khang() {
-    __asm__ __volatile__ ("hlt");
-    while(1) {}
-}
diff --git a/kernel/kutil.h b/kernel/kutil.h
deleted file mode 100644 (file)
index c6032da..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef KUTIL_H
-#define KUTIL_H
-
-#include <stdint.h>
-
-#define NULL ((void *)0)
-
-uint64_t umin(uint64_t a, uint64_t b);
-int64_t smin(int64_t a, int64_t b);
-
-uint64_t umax(uint64_t a, uint64_t b);
-int64_t smax(int64_t a, int64_t b);
-
-void kmemset(void *address, int value, uint64_t bytes);
-void kmemcpy(void *dest, const void *source, uint64_t bytes);
-void kmemmove(void *dest, const void *source, uint64_t bytes);
-int kmemcmp(const void *mem1, const void *mem2, uint64_t bytes);
-/** reverses content of memory. */
-void kmemrev(void *memory, uint64_t bytes);
-const void *kmemmem(const void *haystack, uint64_t hlength, const void *needle,
-    uint64_t nlength);
-
-uint8_t kinb(int port);
-void koutb(int port, uint8_t value);
-void kiowait();
-
-/** checks to see if a bit is set in the result of cpuid. */
-int kcpuid_bitcheck(uint32_t request, uint32_t bit);
-
-void khang();
-
-#endif
diff --git a/kernel/msr.c b/kernel/msr.c
deleted file mode 100644 (file)
index 0c2aa3c..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "msr.h"
-
-uint64_t msr_read(uint32_t msr) {
-    uint32_t low, high;
-    __asm__("rdmsr" : "=a"(low), "=d"(high) : "c"(msr));
-    return low | ((uint64_t)high<<32);
-}
-
-void msr_write(uint32_t msr, uint64_t value) {
-    uint32_t low = value & 0xffffffff;
-    uint32_t high = value >> 32;
-    __asm__("wrmsr" : : "a"(low), "d"(high), "c"(msr));
-}
diff --git a/kernel/msr.h b/kernel/msr.h
deleted file mode 100644 (file)
index 0ebdcdb..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef MSR_H
-#define MSR_H
-
-#include <stdint.h>
-
-#define MSR_GS_BASE 0xc0000101
-#define MSR_APIC_BASE 0x1b
-
-/** read/write MSR */
-uint64_t msr_read(uint32_t msr);
-void msr_write(uint32_t msr, uint64_t value);
-
-#endif
diff --git a/kernel/pagereg.c b/kernel/pagereg.c
new file mode 100644 (file)
index 0000000..edfbbea
--- /dev/null
@@ -0,0 +1,186 @@
+#include <stdint.h>
+
+#include "config.h"
+#include "pagereg.h"
+#include "debug.h"
+#include "util.h"
+
+#define PAGEREG_STACK_SIZE 128
+
+u64_t pagereg_highmem;
+
+u64_t pagereg_stack[PAGEREG_STACK_SIZE], pagereg_stack_filled;
+
+u64_t *pagereg_bitmap, pagereg_bitmap_bytesize;
+
+static void pagereg_find_highmem(u64_t *memmap);
+static void pagereg_trim_memmap(u64_t *memmap);
+static void pagereg_place_bitmap(u64_t *memmap);
+static void pagereg_mark_page(u64_t index, int value);
+static int pagereg_query_page(u64_t index);
+
+static int pagereg_stack_empty();
+static int pagereg_stack_full();
+static void pagereg_stack_push(u64_t index);
+static u64_t pagereg_stack_pop();
+static void pagereg_fix_stack();
+
+void pagereg_initialize(u64_t *memmap) {
+    sydi_debug("Initializing physical page manager");
+    pagereg_stack_filled = 0;
+    pagereg_bitmap = NULL;
+    pagereg_highmem = 0;
+
+    pagereg_trim_memmap(memmap);
+    pagereg_find_highmem(memmap);
+    pagereg_place_bitmap(memmap);
+
+    pagereg_fix_stack();
+}
+
+static void pagereg_find_highmem(u64_t *memmap) {
+    pagereg_highmem = 0;
+    for(int i = 0; memmap[i] || memmap[i+1]; i += 2){
+        pagereg_highmem = umax(pagereg_highmem, memmap[i]+memmap[i+1]);
+    }
+}
+
+static void pagereg_trim_memmap(u64_t *memmap) {
+    // adjust regions to page boundaries
+    for(int i = 0; memmap[i] != 0 || memmap[i+1] != 0; i += 2) {
+        u64_t start = memmap[i];
+        u64_t end = memmap[i+1];
+        start = (start + 0xfff) & ~0xfff;
+        end &= ~0xfff;
+
+        memmap[i] = start;
+        memmap[i+1] = end - start;
+    }
+}
+
+static void pagereg_place_bitmap(u64_t *memmap) {
+    // can store 8 pages per byte.
+    pagereg_bitmap_bytesize = pagereg_highmem / 0x1000 / 8;
+    // round size up to multiple of 8 bytes (for u64_t)
+    pagereg_bitmap_bytesize = (pagereg_bitmap_bytesize+7) & ~7;
+
+    for(int i = 0; memmap[i] != 0 || memmap[i+1] != 0; i += 2) {
+        // don't want to touch the first MB.
+        if(memmap[i] < 0x100000) continue;
+        // don't care about regions too small for contiguous map.
+        if(memmap[i+1] < pagereg_bitmap_bytesize) continue;
+
+        // check to ensure we don't overwrite the kernel image . . .
+        if(memmap[i] <= SYDI_PHY_KERNEL_START
+            && SYDI_PHY_KERNEL_START <= memmap[i]+memmap[i+1]) {
+
+            u64_t start = SYDI_PHY_KERNEL_START - memmap[i];
+            u64_t end = memmap[i+1] - (memmap[i] - SYDI_PHY_KERNEL_START)
+                - SYDI_PHY_KERNEL_SIZE;
+
+            if(start > pagereg_bitmap_bytesize) {
+                pagereg_bitmap = (u64_t *)(SYDI_PHY_MAP_BASE + memmap[i]);
+                break;
+            }
+            if(end > pagereg_bitmap_bytesize) {
+                pagereg_bitmap = (u64_t *)(SYDI_PHY_MAP_BASE
+                    + SYDI_PHY_KERNEL_START + SYDI_PHY_KERNEL_SIZE);
+                break;
+            }
+        }
+        else {
+            pagereg_bitmap = (u64_t *)(SYDI_PHY_MAP_BASE) + memmap[i];
+            break;
+        }
+    }
+
+    sydi_assert(pagereg_bitmap, "Physical page bitmap not NULL");
+
+    // fill page bitmap with zeroes
+    memset(pagereg_bitmap, 0, pagereg_bitmap_bytesize);
+
+    // mark regions as available as possible
+    for(int i = 0; memmap[i] != 0 || memmap[i+1] != 0; i += 2) {
+        for(u64_t addr = memmap[i]; addr < memmap[i]+memmap[i+1];
+            addr += 0x1000) {
+
+            // don't touch first megabyte.
+            if(addr < 0x100000) continue;
+
+            // don't touch kernel image.
+            if(addr >= SYDI_PHY_KERNEL_START
+                && addr <= SYDI_PHY_KERNEL_START+SYDI_PHY_KERNEL_SIZE)
+                    continue;
+
+            u64_t index = addr / 0x1000;
+            pagereg_mark_page(index, 1);
+        }
+    }
+
+    // mark page bitmap memory region as unavailable
+    u64_t paddr = (u64_t)pagereg_bitmap - (u64_t)SYDI_PHY_MAP_BASE;
+    for(u64_t offset = 0; offset < pagereg_bitmap_bytesize; offset += 0x1000) {
+        pagereg_mark_page((paddr+offset)/0x1000, 0);
+    }
+
+    u64_t count = 0;
+    for(u64_t i = 0; i < pagereg_bitmap_bytesize*8; i ++) {
+        if(pagereg_query_page(i)) count ++;
+    }
+
+    sydi_debug("Available physical pages: %i (%i MiB)", count,
+        count / 256);
+}
+
+static void pagereg_mark_page(u64_t index, int value) {
+    // set/clear bit
+    if(value) pagereg_bitmap[index/64] |= (1ULL<<(index%64));
+    else pagereg_bitmap[index/64] &= ~(1ULL<<(index%64));
+}
+
+static int pagereg_query_page(u64_t index) {
+    return (pagereg_bitmap[index/64] & (1ULL<<(index%64)))?1:0;
+}
+
+static int pagereg_stack_empty() {
+    return pagereg_stack_filled == 0;
+}
+
+static int pagereg_stack_full() {
+    return pagereg_stack_filled == PAGEREG_STACK_SIZE;
+}
+
+static void pagereg_stack_push(u64_t index) {
+    if(pagereg_stack_full()) pagereg_fix_stack();
+    pagereg_stack[pagereg_stack_filled++] = index;
+}
+
+static u64_t pagereg_stack_pop() {
+    if(pagereg_stack_empty()) pagereg_fix_stack();
+    return pagereg_stack[--pagereg_stack_filled];
+}
+
+static void pagereg_fix_stack() {
+    u64_t i = 0;
+    while(pagereg_stack_filled < PAGEREG_STACK_SIZE/2
+        && i < pagereg_bitmap_bytesize*8) {
+        
+        if(pagereg_query_page(i)) {
+            pagereg_mark_page(i, 0);
+            pagereg_stack_push(i);
+        }
+        i ++;
+    }
+    while(pagereg_stack_filled > PAGEREG_STACK_SIZE/2)
+        pagereg_mark_page(pagereg_stack_pop(), 1);
+
+    sydi_assert(pagereg_stack_filled > 0, "Pages present in stack after fix");
+}
+
+u64_t pagereg_get() {
+    return pagereg_stack_pop() * 0x1000;
+}
+
+void pagereg_put(u64_t address) {
+    pagereg_stack_push(address / 0x1000);
+}
diff --git a/kernel/pagereg.h b/kernel/pagereg.h
new file mode 100644 (file)
index 0000000..6809ad2
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef SYDI_PAGEREG_H
+#define SYDI_PAGEREG_H
+
+#include "kernel.h"
+
+void pagereg_initialize(u64_t *memmap);
+
+u64_t pagereg_get();
+void pagereg_put(u64_t address);
+
+#endif
diff --git a/kernel/pit.c b/kernel/pit.c
deleted file mode 100644 (file)
index 96b0cdf..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#include "pit.h"
-#include "ktime.h"
-#include "apic.h"
-#include "kutil.h"
-#include "ioapic.h"
-#include "klog.h"
-
-#define PIT_COMMAND_PORT 0x43
-#define PIT_CHAN0_PORT 0x40
-
-uint64_t pit_ticks;
-
-static void pit_ktime_updater(void *nsec, ktime_t *time);
-static void pit_isr();
-static void pit_setup_recurring(uint16_t divisor);
-
-void pit_init(void) {
-    pit_ticks = 0;
-
-    pit_setup_recurring(1230);
-    // IOAPIC uses IRQ2 for timer.
-    apic_set_isr(APIC_IRQ_2_INTR, pit_isr);
-    ioapic_mask_irq(2, 0);
-}
-
-void pit_install_ktime(void) {
-    ktime_set_updater(pit_ktime_updater);
-}
-
-static void pit_ktime_updater(void *nsec, ktime_t *time) {
-    *time += (int64_t)nsec;
-}
-
-static void pit_isr() {
-    apic_disable_interrupts();
-
-    // At divisor 1230, each tick is about 1.03085727375965 ms.
-    pit_ticks += 103085727375965ULL;
-
-    uint64_t count = pit_ticks / 100000000000000ULL;
-    pit_ticks %= 100000000000000ULL;
-
-    ktime_update_current(pit_ktime_updater, (void *)(count*1000000));
-
-    apic_enable_interrupts();
-}
-
-static void pit_setup_recurring(uint16_t divisor) {
-    //klog("Setting up recurring PIT . . .");
-    // channel 0, both bytes, set mode to rate generator.
-    koutb(PIT_COMMAND_PORT, (3<<4) | (2<<1));
-    koutb(PIT_CHAN0_PORT, divisor & 0xff);
-    koutb(PIT_CHAN0_PORT, divisor >> 8);
-}
diff --git a/kernel/pit.h b/kernel/pit.h
deleted file mode 100644 (file)
index f92ec0a..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef PIT_H
-#define PIT_H
-
-void pit_init(void);
-void pit_install_ktime(void);
-
-#endif
diff --git a/kernel/pmman.c b/kernel/pmman.c
deleted file mode 100644 (file)
index e79088e..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-#include "config.h"
-#include "pmman.h"
-#include "kutil.h"
-
-// keep stack of 1024 pages around
-uint64_t pmman_pagestack[1024], pmman_pagestack_size;
-
-uint64_t *pmman_pagebitmap, pmman_pagebitmap_size;
-
-uint64_t pmman_last_phy;
-
-static void pmman_place_pagebitmap(uint64_t *regions);
-static void pmman_clear_page(uint64_t index);
-static void pmman_mark_page(uint64_t index, int value);
-
-// empty/fill stack to 1/2 capacity.
-static int pmman_stack_full();
-static int pmman_stack_empty();
-static void pmman_push_page(uint64_t index);
-static uint64_t pmman_pop_page();
-static void pmman_fill_stack();
-static void pmman_empty_stack();
-
-void pmman_init(uint64_t *regions) {
-       pmman_pagebitmap = NULL;
-
-    pmman_last_phy = 0;
-    for(int i = 0; regions[i] != 0 || regions[i+1] != 0; i += 2) {
-        // adjust regions to page boundaries
-        uint64_t start = regions[i];
-        uint64_t end = regions[i+1];
-        start = (start + 0xfff) & ~0xfff;
-        end &= ~0xfff;
-
-        regions[i] = start;
-        regions[i+1] = end - start;
-
-        pmman_last_phy = umax(pmman_last_phy, end);
-    }
-
-    pmman_place_pagebitmap(regions);
-
-    pmman_pagestack_size = 0;
-}
-
-static void pmman_place_pagebitmap(uint64_t *regions) {
-    // can store 8 pages per byte.
-    pmman_pagebitmap_size = pmman_last_phy / 0x1000 / 8;
-    // round size up to multiple of 8 bytes (for uint64_t)
-    pmman_pagebitmap_size = (pmman_pagebitmap_size+7) & ~7;
-
-    for(int i = 0; regions[i] != 0 || regions[i+1] != 0; i += 2) {
-        //pmman_pagebitmap = (uint64_t *)(PHY_MAP_BASE + regions[i]);
-        // don't want to touch the first MB.
-        if(regions[i] < 0x100000) continue;
-        // don't care about regions too small for contiguous map.
-        if(regions[i+1] < pmman_pagebitmap_size) continue;
-
-        // check to ensure we don't overwrite the kernel image . . .
-        if(regions[i] <= PHY_KERNEL_START
-            && PHY_KERNEL_START <= regions[i]+regions[i+1]) {
-
-            uint64_t start = PHY_KERNEL_START - regions[i];
-            uint64_t end = regions[i+1] - (regions[i] - PHY_KERNEL_START)
-                - PHY_KERNEL_SIZE;
-
-            if(start > pmman_pagebitmap_size) {
-                pmman_pagebitmap = (uint64_t *)(PHY_MAP_BASE + regions[i]);
-                break;
-            }
-            if(end > pmman_pagebitmap_size) {
-                pmman_pagebitmap = (uint64_t *)(PHY_MAP_BASE + PHY_KERNEL_START
-                    + PHY_KERNEL_SIZE);
-                break;
-            }
-        }
-        else {
-            pmman_pagebitmap = (uint64_t *)(PHY_MAP_BASE) + regions[i];
-            break;
-        }
-    }
-
-    if(pmman_pagebitmap == NULL) {
-        // panic. couldn't place memory bitmap.
-        __asm__("hlt");
-    }
-
-    // intialize pagebitmap to all `not available'.
-    for(uint64_t i = 0; i < pmman_pagebitmap_size/8; i ++) {
-        pmman_pagebitmap[i] = 0;
-    }
-
-    // mark regions as available and clear pages.
-    for(uint64_t i = 0; regions[i] != 0 || regions[i+1] != 0; i += 2) {
-        for(uint64_t addr = regions[i]; addr < regions[i]+regions[i+1];
-            addr += 0x1000) {
-            
-            // don't touch first megabyte.
-            if(addr < 0x100000) continue;
-
-            // don't touch kernel image.
-            if(addr >= PHY_KERNEL_START
-                && addr <= PHY_KERNEL_START+PHY_KERNEL_SIZE) continue;
-
-            uint64_t index = addr / 0x1000 / 8;
-            pmman_mark_page(index, 1);
-        }
-    }
-}
-
-static void pmman_clear_page(uint64_t index) {
-    kmemset(PHY_MAP_BASE + index*0x1000, 0, 0x1000);
-}
-
-static void pmman_mark_page(uint64_t index, int value) {
-    // set/clear available bit
-    if(value) pmman_pagebitmap[index/64] |= (1<<(index%64));
-    else pmman_pagebitmap[index/64] &= ~(1<<(index%64));
-}
-
-static int pmman_stack_full() {
-    if(pmman_pagestack_size == 1024) return 1;
-    else return 0;
-}
-
-static int pmman_stack_empty() {
-    if(pmman_pagestack_size == 0) return 1;
-    else return 0;
-}
-
-static void pmman_push_page(uint64_t index) {
-    pmman_pagestack[pmman_pagestack_size++] = index;
-}
-
-static uint64_t pmman_pop_page() {
-    return pmman_pagestack[--pmman_pagestack_size];
-}
-
-static void pmman_fill_stack() {
-    for(uint64_t i = 0; i < pmman_pagebitmap_size/8; i ++) {
-        if(pmman_pagebitmap == 0) continue;
-        if(pmman_pagestack_size > 512) break;
-
-        for(int b = 63; b >= 0; b --) {
-            if(pmman_pagebitmap[i] & (1ULL<<b)) {
-                pmman_mark_page(i*64 + b, 0);
-                pmman_push_page(i*64 + b);
-            }
-        }
-    }
-}
-
-static void pmman_empty_stack() {
-    while(pmman_pagestack_size >= 512) {
-        uint64_t index = pmman_pop_page();
-        pmman_mark_page(index, 1);
-    }
-}
-
-uint64_t pmman_newlowerpage() {
-    return pmman_newpage();
-}
-
-uint64_t pmman_newpage() {
-    if(pmman_stack_empty()) pmman_fill_stack();
-
-    uint64_t pindex = pmman_pop_page();
-    
-    return pindex*0x1000;
-}
-
-void pmman_releasepage(uint64_t address) {
-    if(pmman_stack_full()) pmman_empty_stack();
-    
-    pmman_push_page(address/0x1000);
-}
diff --git a/kernel/pmman.h b/kernel/pmman.h
deleted file mode 100644 (file)
index a2e0bbc..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef PMMAN_H
-#define PMMAN_H
-
-#include <stdint.h>
-
-void pmman_init(uint64_t *regions);
-
-/** returns a new page with physical address <= 4GB. */
-uint64_t pmman_newlowerpage();
-/** returns a new page. */
-uint64_t pmman_newpage();
-/** releases the use of a physical page. */
-void pmman_releasepage(uint64_t address);
-
-#endif
diff --git a/kernel/sched.c b/kernel/sched.c
deleted file mode 100644 (file)
index 2d2620b..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-#include "sched.h"
-#include "klog.h"
-#include "apic.h"
-#include "smp.h"
-#include "kutil.h"
-#include "klock.h"
-
-thread_t *sched_threads[SCHED_MAX_THREADS];
-uint32_t sched_thread_count;
-uint32_t sched_current_thread;
-uint64_t sched_spinlock;
-
-static void sched_enter_next();
-
-void sched_init(void) {
-    sched_thread_count = 0;
-    sched_current_thread = 0;
-    sched_spinlock = KLOCK_INIT_UNLOCKED;
-
-    sched_cpu_init();
-}
-
-void sched_cpu_init(void) {
-    PERCPU(sched_thread) = NULL;
-}
-
-void sched_add_thread(thread_t *thread) {
-    klock_acquire(&sched_spinlock);
-    sched_threads[sched_thread_count++] = thread;
-    klock_release(&sched_spinlock);
-}
-
-void sched_kyield(void) {
-    __asm__ __volatile__ ("xchg bx,bx");
-    // TODO: replace with APIC_TIMER_INTR constant.
-    __asm__ __volatile__ ("int 0x40");
-}
-
-thread_t *sched_findnext(void) {
-    thread_t *result = NULL;
-
-    for(uint32_t off = 1; off <= sched_thread_count; off ++) {
-        uint32_t cursor = (sched_current_thread + off) % sched_thread_count;
-
-        thread_t *thread = sched_threads[cursor];
-
-        klock_acquire(&thread->thread_lock);
-
-        // if thread is ready to be run . . .
-        if(thread_isready(thread)) {
-            result = thread;
-            sched_current_thread = cursor;
-        }
-
-        klock_release(&thread->thread_lock);
-        if(result) break;
-    }
-    //if(!result) klog("Couldn't find another . . .");
-
-    return result;
-}
-
-void sched_swap(void) {
-    // acquire sched spinlock.
-    klock_acquire(&sched_spinlock);
-    // make old thread not running, if necessary.
-    if(PERCPU(sched_thread)) {
-        thread_t *t = PERCPU(sched_thread);
-        klock_acquire(&t->thread_lock);
-        PERCPU(sched_thread)->status &= ~THREAD_RUNNING;
-        klock_release(&t->thread_lock);
-    }
-
-    //if(smp_get_id() != 0) klog("sched_swap on CPU %i", smp_get_id());
-    sched_enter_next();
-}
-
-static void sched_enter_next() {
-    thread_t *next = sched_findnext();
-    //klog("Selected next = %p (RIP %x)", next, next?next->regs.r.rip:-1);
-
-    if(next != NULL) {
-        PERCPU(sched_thread) = next;
-
-        klock_acquire(&next->thread_lock);
-        next->status |= THREAD_RUNNING;
-        next->status &= ~THREAD_SLEEPING;
-
-        if(next->context) {
-            context_switch(next->context);
-        }
-
-        PERCPU(saveregs) = &next->regs;
-
-        klock_release(&next->thread_lock);
-    }
-    else {
-        PERCPU(sched_thread) = NULL;
-        PERCPU(saveregs) = NULL;
-    }
-
-    // nothing more to do with the sched spinlock.
-    klock_release(&sched_spinlock);
-
-    //klog("Entering thread on CPU %i", smp_get_id());
-
-    apic_send_eoi();
-
-    if(next) {
-        thread_begin(next);
-    }
-    else thread_begin(PERCPU(sched_idle));
-}
-
-void sched_idle_main(void __attribute__((unused)) *unused) {
-    while(1) __asm__("pause");
-}
diff --git a/kernel/sched.h b/kernel/sched.h
deleted file mode 100644 (file)
index f0c6258..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef SCHED_H
-#define SCHED_H
-
-#include "thread.h"
-
-#define SCHED_MAX_THREADS 128
-
-void sched_init(void);
-
-// initializes percpu variables for current thread
-void sched_cpu_init(void);
-
-void sched_add_thread(thread_t *context);
-
-// yields the current timeslice. Only useful for kernel threads.
-void sched_kyield(void);
-
-// finds the next thread to run, round-robin. Assumes sched spinlock held.
-thread_t *sched_findnext(void);
-void sched_swap(void);
-
-void sched_idle_main(void *unused);
-
-#endif
diff --git a/kernel/sched_helper.s b/kernel/sched_helper.s
deleted file mode 100644 (file)
index 1b2cd47..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-%include "thread_regs.s"
-
-[extern sched_swap]
-
-[global sched_isr]
-sched_isr:
-       push    rax
-       ; grab address of percpu structure
-       mov     rax, [gs:0x0]
-       ; grab address of saveregs structure
-       mov     rax, [rax]
-
-       cmp     rax, 0
-       je      .skipsave
-
-       mov     [rax + THREAD_REG_RBX*8], rbx
-       mov     [rax + THREAD_REG_RCX*8], rcx
-       mov     [rax + THREAD_REG_RDX*8], rdx
-       mov     [rax + THREAD_REG_RSI*8], rsi
-       mov     [rax + THREAD_REG_RDI*8], rdi
-       mov     [rax + THREAD_REG_R8*8], r8
-       mov     [rax + THREAD_REG_R9*8], r9
-       mov     [rax + THREAD_REG_R10*8], r10
-       mov     [rax + THREAD_REG_R11*8], r11
-       mov     [rax + THREAD_REG_R12*8], r12
-       mov     [rax + THREAD_REG_R13*8], r13
-       mov     [rax + THREAD_REG_R14*8], r14
-       mov     [rax + THREAD_REG_R15*8], r15
-       mov     [rax + THREAD_REG_RBP*8], rbp
-       pop     rbx
-       mov     [rax + THREAD_REG_RAX*8], rbx
-
-       ; save RIP
-       pop     rbx
-       mov     [rax + THREAD_REG_RIP*8], rbx
-
-       ; save CS
-       pop     rbx
-       mov     [rax + THREAD_REG_CS*8], rbx
-
-       ; save RFLAGS
-       pop     rbx
-       mov     [rax + THREAD_REG_RFLAGS*8], rbx
-
-       ; save RSP
-       pop     rbx
-       mov     [rax + THREAD_REG_RSP*8], rbx
-
-       ; save SS
-       pop     rbx
-       mov     [rax + THREAD_REG_SS*8], rbx
-
-       ; save other segment regs
-       mov     bx, ds
-       mov     qword [rax + THREAD_REG_DS*8], 0
-       mov     word [rax + THREAD_REG_DS*8], bx
-       mov     bx, es
-       mov     qword [rax + THREAD_REG_ES*8], 0
-       mov     word [rax + THREAD_REG_ES*8], bx
-       mov     bx, fs
-       mov     qword [rax + THREAD_REG_FS*8], 0
-       mov     word [rax + THREAD_REG_FS*8], bx
-       mov     bx, gs
-       mov     qword [rax + THREAD_REG_GS*8], 0
-       mov     word [rax + THREAD_REG_GS*8], bx
-
-       ; need rax for rdmsr.
-       mov     rdi, rax
-       mov     ecx, 0xc0000101
-       rdmsr
-       mov     dword [rdi + THREAD_REG_GS_BASE*8], eax
-       mov     dword [rdi + THREAD_REG_GS_BASE*8 + 4], edx
-
-       ; all set!
-
-       jmp sched_swap
-
-       .skipsave:
-       add     rsp, 6*8
-
-       jmp     sched_swap
diff --git a/kernel/sha256.c b/kernel/sha256.c
deleted file mode 100644 (file)
index 8fe4fdf..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-#include <stdint.h>
-#include "kutil.h"
-
-const uint32_t sha256_initial_h[8] = {
-    0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
-    0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
-};
-
-const uint32_t sha256_round_k[64] = {
-    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
-    0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
-    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
-    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
-    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
-    0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
-    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
-    0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
-    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
-    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
-    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
-    0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
-    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
-    0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
-    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
-    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
-};
-
-void sha256_endian_reverse64(uint64_t input, uint8_t *output) {
-    output[7] = (input >> 0) & 0xff;
-    output[6] = (input >> 8) & 0xff;
-    output[5] = (input >> 16) & 0xff;
-    output[4] = (input >> 24) & 0xff;
-    output[3] = (input >> 32) & 0xff;
-    output[2] = (input >> 40) & 0xff;
-    output[1] = (input >> 48) & 0xff;
-    output[0] = (input >> 56) & 0xff;
-}
-
-uint32_t sha256_endian_read32(uint8_t *input) {
-    uint32_t output = 0;
-    output |= (input[0] << 24);
-    output |= (input[1] << 16);
-    output |= (input[2] << 8);
-    output |= (input[3] << 0);
-
-    return output;
-}
-
-void sha256_endian_reverse32(uint32_t input, uint8_t *output) {
-    output[3] = (input >>  0) & 0xff;
-    output[2] = (input >>  8) & 0xff;
-    output[1] = (input >> 16) & 0xff;
-    output[0] = (input >> 24) & 0xff;
-}
-
-uint32_t sha256_ror(uint32_t input, uint32_t by) {
-    return (input>>by) | (((input & ((1<<by)-1))) << (32-by));
-}
-
-void sha256(const void *data, uint64_t len, void *output) {
-    uint8_t padding[80];
-    uint64_t current = (len+1) % 64;
-    // want to be == 56 % 64.
-    uint64_t needed = (64+56 - current)%64;
-    uint64_t extra = needed+9;
-    uint64_t total = len+extra;
-
-    for(int i = 1; i < 80; i ++) padding[i] = 0;
-    padding[0] = 0x80;
-    sha256_endian_reverse64(len*8, padding + total - len - 8);
-
-    uint32_t v[8];
-    for(int i = 0; i < 8; i ++) v[i] = sha256_initial_h[i];
-
-    for(uint64_t cursor = 0; cursor*64 < total; cursor ++) {
-        uint32_t t[8];
-        for(int i = 0; i < 8; i ++) t[i] = v[i];
-
-        uint32_t w[64];
-        if(cursor*64 + 64 <= len) {
-            for(int j = 0; j < 16; j ++) {
-                w[j] = sha256_endian_read32((uint8_t *)data + cursor*64 + j*4);
-            }
-        }
-        else {
-            if(cursor*64 < len) {
-                uint64_t size = len - cursor*64;
-                if(size > 0) kmemcpy(w, (uint8_t *)data + cursor*64, size);
-                kmemcpy((uint8_t *)w + size, padding, 64-size);
-            }
-            else {
-                uint64_t off = (cursor*64 - len)%64;
-                kmemcpy((uint8_t *)w, padding + off, 64);
-            }
-
-            for(int j = 0; j < 16; j ++) {
-                w[j] = sha256_endian_read32((uint8_t *)&w[j]);
-            }
-        }
-        
-        for(int j = 16; j < 64; j ++) {
-            uint32_t s1 = sha256_ror(w[j-2], 17) ^ sha256_ror(w[j-2], 19) ^ (w[j-2]>>10);
-            uint32_t s0 = sha256_ror(w[j-15], 7) ^ sha256_ror(w[j-15], 18) ^ (w[j-15]>>3);
-            w[j] = s1 + w[j-7] + s0 + w[j-16];
-        }
-
-        for(int j = 0; j < 64; j ++) {
-            uint32_t ch = (t[4]&t[5])^(~t[4]&t[6]);
-            uint32_t maj = (t[0]&t[1])^(t[0]&t[2])^(t[1]&t[2]);
-            uint32_t S0 = sha256_ror(t[0], 2) ^ sha256_ror(t[0], 13) ^ sha256_ror(t[0], 22);
-            uint32_t S1 = sha256_ror(t[4], 6) ^ sha256_ror(t[4], 11) ^ sha256_ror(t[4], 25);
-
-            uint32_t t1 = t[7] + S1 + ch + sha256_round_k[j] + w[j];
-            uint32_t t2 = S0 + maj;
-
-            t[7] = t[6];
-            t[6] = t[5];
-            t[5] = t[4];
-            t[4] = t[3] + t1;
-            t[3] = t[2];
-            t[2] = t[1];
-            t[1] = t[0];
-            t[0] = t1 + t2;
-        }
-
-        for(int i = 0; i < 8; i ++) v[i] += t[i];
-    }
-
-    for(int i = 0; i < 8; i ++) sha256_endian_reverse32(v[i], (uint8_t *)output + i*4);
-}
diff --git a/kernel/sha256.h b/kernel/sha256.h
deleted file mode 100644 (file)
index 98fb27e..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef SHA256_H
-#define SHA256_H
-
-void sha256(const void *data, uint64_t len, void *output);
-
-#endif
diff --git a/kernel/smp.c b/kernel/smp.c
deleted file mode 100644 (file)
index f1135d9..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-#include "smp.h"
-#include "config.h"
-#include "apic.h"
-#include "klog.h"
-#include "msr.h"
-#include "acpi/tables.h"
-#include "kphy.h"
-#include "gdt.h"
-#include "vmman.h"
-#include "klock.h"
-#include "kutil.h"
-#include "smp_percpu.h"
-#include "kheap.h"
-#include "thread.h"
-#include "sched.h"
-
-#include "apb/bootstrap.h"
-
-smp_cpu_info_t smp_cpus[MAX_CPUS];
-uint64_t smp_cpu_count = 0;
-uint64_t smp_cpus_lock;
-
-static void smp_add_bsp(void);
-static void smp_setup_aps();
-
-void smp_init(void) {
-    smp_cpu_count = 0;
-    smp_cpus_lock = 0;
-
-    // add the boot cpu to the CPU info list.
-    smp_add_bsp();
-}
-
-void smp_ap_init() {
-    // perform SMP init sequence
-    thread_t *smp_setup = thread_create_kworker(smp_setup_aps, NULL, 0x1000);
-    klog("SMP setup thread: %p", smp_setup);
-    sched_add_thread(smp_setup);
-}
-
-static void smp_add_bsp(void) {
-    uint64_t apic_id = apic_get_register32(APIC_REG_ID);
-
-    smp_cpu_info_t *scp = &smp_cpus[smp_cpu_count];
-
-    scp->id = smp_cpu_count;
-    scp->apic_id = apic_id;
-    scp->percpu = kheap_alloc(sizeof(smp_percpu_t));
-    kmemset(scp->percpu, 0, sizeof(smp_percpu_t));
-    scp->used = 1;
-
-    smp_cpu_count ++;
-    msr_write(MSR_GS_BASE, (uint64_t)scp);
-
-    tss_t *tss = tss_create();
-    gdt_add_tss(tss);
-    tss_load(tss, 0);
-
-    PERCPU(tss) = tss;
-}
-
-static void smp_ap_entry() {
-    // load global GDT
-    gdt_load();
-
-    // add entry to smp_cpus.
-    klock_acquire(&smp_cpus_lock);
-
-    smp_cpu_info_t *scp = &smp_cpus[smp_cpu_count];
-    scp->id = smp_cpu_count;
-    scp->apic_id = apic_get_register32(APIC_REG_ID);
-    scp->percpu = NULL;
-    scp->used = 1;
-
-    smp_cpu_count ++;
-
-    msr_write(MSR_GS_BASE, (uint64_t)scp);
-
-    // make new percpu and initialize to zero.
-    smp_percpu_t *percpu = kheap_alloc(sizeof(smp_percpu_t));
-    kmemset(percpu, 0, sizeof(smp_percpu_t));
-    scp->percpu = percpu;
-
-    // make a new TSS for this processor (also makes new IST1)
-    tss_t *tss = tss_create();
-    gdt_add_tss(tss);
-    tss_load(tss, 0);
-
-    percpu->tss = tss;
-
-    // initialize lapic
-    apic_init_ap();
-
-    klog("Booted AP CPU with ID %i", smp_get_id());
-
-    thread_t *idle = thread_create_kworker(sched_idle_main, NULL, 0x1000);
-    PERCPU(sched_idle) = idle;
-
-    klock_release(&smp_cpus_lock);
-
-    // all set!
-    apic_enable_interrupts();
-    apic_enable_timer();
-
-    sched_kyield();
-}
-
-static void smp_setup_aps(void __attribute__((unused)) *param) {
-    uint8_t apic_ids[MAX_CPUS];
-    uint32_t count = 0;
-    // add AP processors
-    for(uint32_t i = 0; i < acpi_apic_count; i ++) {
-        if(acpi_apics[i].apicid == smp_cpus[0].apic_id) continue;
-        apic_ids[count++] = acpi_apics[i].apicid;
-    }
-
-    // only BSP, nothing to be done
-    if(count == 0) return;
-
-    // want to load bootstrap code to 0x8000.
-    kphy_write(0x8000, APB_BOOTSTRAP, APB_BOOTSTRAP_LEN);
-
-    // set up entry, pml4 values.
-    kphy_w64(0x8000 + 8, (uint64_t)smp_ap_entry);
-    kphy_w32(0x8000 + 16, vmman_boot_pml4());
-
-    // send INIT IPI
-    for(uint32_t i = 0; i < count; i ++) {
-        apic_send_ipi(APIC_IPI_INIT, apic_ids[i], 0);
-    }
-
-    thread_wakeat(PERCPU(sched_thread), ktime_current() + ktime_make(0,200));
-    sched_kyield();
-
-    // send SIPI IPI
-    for(uint32_t i = 0; i < count; i ++) {
-        // begin executing code at 0x8000
-        apic_send_ipi(APIC_IPI_SIPI, apic_ids[i], 8);
-    }
-
-    // AP's will start up and add themselves to scheduler as necessary.
-    // TODO: ensure they actually start, and send a second SIPI if required.
-}
diff --git a/kernel/smp.h b/kernel/smp.h
deleted file mode 100644 (file)
index 3983bb9..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef SMP_H
-#define SMP_H
-
-#include <stdint.h>
-
-#include "config.h"
-#include "smp_percpu.h"
-
-typedef struct __attribute__((packed)) smp_cpu_info_t {
-    // must be first
-    smp_percpu_t *percpu;
-    // must be second
-    uint32_t id;
-
-    uint64_t apic_id;
-    unsigned used : 1;
-} smp_cpu_info_t;
-
-extern smp_cpu_info_t smp_cpus[MAX_CPUS];
-
-void smp_init(void);
-void smp_ap_init();
-
-uint32_t smp_get_id(void);
-
-#define PERCPU(name) (smp_cpus[smp_get_id()].percpu->name)
-
-#endif
diff --git a/kernel/smp_id.s b/kernel/smp_id.s
deleted file mode 100644 (file)
index c51f3d6..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-[extern smp_cpu_count]
-[global smp_get_id]
-smp_get_id:
-       mov     rax, smp_cpu_count
-       mov     rax, qword [rax]
-       cmp     rax, 0
-       je      .exit
-
-       xor     rax, rax
-       mov     eax, dword [gs:0x8]
-
-       .exit:
-       ret
diff --git a/kernel/smp_percpu.h b/kernel/smp_percpu.h
deleted file mode 100644 (file)
index b25ab3f..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef SMP_PERCPU_H
-#define SMP_PERCPU_H
-
-#define STRUCT_FDECL(name) struct name; typedef struct name name;
-#define UNION_FDECL(name) union name; typedef union name name;
-
-/* NOTE: only use forward-declarations here! this header will be included
-    in many places... */
-
-UNION_FDECL(thread_regs_t)
-STRUCT_FDECL(tss_t)
-STRUCT_FDECL(thread_t)
-
-typedef struct {
-    // keep this one first, referenced in thread_helper.
-    thread_regs_t *saveregs;
-
-    tss_t *tss;
-    thread_t *sched_thread;
-    thread_t *sched_idle;
-} smp_percpu_t;
-
-#endif
diff --git a/kernel/string.c b/kernel/string.c
new file mode 100644 (file)
index 0000000..d945212
--- /dev/null
@@ -0,0 +1,95 @@
+#include <stdarg.h>
+#include "kernel.h"
+#include "util.h"
+
+#include "string.h"
+
+static int snprintf_format_int(char *buffer, int value);
+static int snprintf_format_hex(char *buffer, u64_t value);
+static int snprintf_format_string(char *buffer, const char *value);
+
+int snprintf(char *buffer, int maxlen, const char *string, ...) {
+    va_list v;
+
+    va_start(v, string);
+
+    // BUG: the following will overflow when snprintf_format_* writes too many
+    // characters
+
+    int i = 0;
+    int bi = 0;
+    while(string[i] != 0) {
+        if(bi >= maxlen-1) break;
+        if(string[i] != '%') {
+            buffer[bi++] = string[i++];
+            continue;
+        }
+        if(string[i+1] == 0) break;
+        else if(string[i+1] == 'i') {
+            int i = va_arg(v, int);
+
+            bi += snprintf_format_int(buffer + bi, i);
+        }
+        else if(string[i+1] == 'p' || string[i+1] == 'x') {
+            u64_t address = va_arg(v, u64_t);
+
+            bi += snprintf_format_hex(buffer + bi, address);
+        }
+        else if(string[i+1] == 's') {
+            const char *str = va_arg(v, const char *);
+
+            bi += snprintf_format_string(buffer + bi, str);
+        }
+        i += 2;
+    }
+
+    buffer[bi] = 0;
+
+    va_end(v);
+
+    return bi;
+}
+
+static int snprintf_format_int(char *buffer, int value) {
+    int size = 0;
+    if(value < 0) buffer[size++] = '-';
+    if(value == 0) buffer[size++] = '0';
+
+    while(value > 0) {
+        buffer[size++] = '0' + (value%10);
+        value /= 10;
+    }
+    memrev(buffer, size);
+    return size;
+}
+
+static int snprintf_format_hex(char *buffer, u64_t value) {
+    int size = 0;
+    buffer[size++] = '0';
+    buffer[size++] = 'x';
+    const char *hex = "0123456789abcdef";
+
+    int zeroStart = 0;
+    for(int j = 0; j < 16; j ++) {
+        buffer[size++] = hex[value & 0xf];
+
+        if(value & 0xf) zeroStart = j+1;
+
+        value >>= 4;
+    }
+    memrev(buffer + 2, zeroStart);
+    buffer[2 + zeroStart] = 0;
+
+    if(zeroStart == 0) {
+        buffer[2] = '0';
+        zeroStart ++;
+    }
+
+    return 2 + zeroStart;
+}
+
+static int snprintf_format_string(char *buffer, const char *value) {
+    int len = 0;
+    while(*value) buffer[len++] = *value++;
+    return len;
+}
diff --git a/kernel/string.h b/kernel/string.h
new file mode 100644 (file)
index 0000000..144dd16
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef SYDI_STRING_H
+#define SYDI_STRING_H
+
+int snprintf(char *buffer, int maxlen, const char *string, ...);
+
+#endif
diff --git a/kernel/terminal.c b/kernel/terminal.c
deleted file mode 100644 (file)
index 6d83eda..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#include "terminal.h"
-#include "kutil.h"
-#include "config.h"
-
-uint8_t *terminal_vram;
-int terminal_cols, terminal_rows;
-int terminal_cursor[2];
-
-static void terminal_putc(char c);
-
-void terminal_init(uint64_t vram_addr, int cols, int rows) {
-    terminal_cols = cols;
-    terminal_rows = rows;
-
-    terminal_vram = PHY_MAP_BASE + vram_addr;
-    terminal_clear();
-}
-
-void terminal_clear(void) {
-    kmemset(terminal_vram, 0, terminal_cols*terminal_rows*2);
-    terminal_cursor[0] = terminal_cursor[1] = 0;
-}
-
-void terminal_shift(int lines) {
-    uint64_t bytes = lines*terminal_cols*2;
-    uint64_t total_size = terminal_cols*terminal_rows*2;
-    kmemmove(terminal_vram, terminal_vram + bytes, total_size - bytes);
-    kmemset(terminal_vram + total_size - bytes, 0, bytes);
-}
-
-void terminal_puts(const char *string) {
-    const char *p = string;
-    while(*p) {
-        terminal_putc(*p);
-        p ++;
-    }
-}
-
-static void terminal_putc(char c) {
-    if(c == '\n' || terminal_cursor[0] == terminal_cols-1) {
-        terminal_cursor[0] = 0;
-
-        if(terminal_cursor[1] == terminal_rows-1) {
-            terminal_shift(1);
-        }
-        else terminal_cursor[1] ++;
-    }
-    if(c == '\n') return;
-
-    uint64_t offset = terminal_cursor[0]*2 + terminal_cursor[1]*terminal_cols*2;
-    terminal_vram[offset] = c;
-    terminal_vram[offset+1] = 7;
-
-    terminal_cursor[0] ++;
-}
diff --git a/kernel/terminal.h b/kernel/terminal.h
deleted file mode 100644 (file)
index bcfede0..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef TERMINAL_H
-#define TERMINAL_H
-
-#include <stdint.h>
-
-void terminal_init(uint64_t vram_addr, int cols, int rows);
-
-void terminal_clear(void);
-void terminal_shift(int lines);
-
-void terminal_puts(const char *string);
-
-#endif
diff --git a/kernel/thread.c b/kernel/thread.c
deleted file mode 100644 (file)
index d17a7ce..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-#include "thread.h"
-#include "kheap.h"
-#include "gdt.h"
-#include "kutil.h"
-#include "msr.h"
-#include "klock.h"
-#include "sched.h"
-#include "klog.h"
-
-extern void thread_setregs(thread_regs_t *regs);
-
-static void thread_kworker_wrapper(thread_kworker_entry_t entry, void *param,
-    thread_t *thread);
-
-thread_t *thread_create(void) {
-    thread_t *thread = kheap_alloc(sizeof(thread_t));
-
-    thread->thread_lock = KLOCK_INIT_UNLOCKED;
-
-    for(int i = 0; i < THREAD_REG_COUNT; i ++) {
-        thread->regs.array[i] = 0;
-    }
-    // default RFLAGS
-    thread->regs.r.rflags = 0x00200282;
-
-    thread->status = 0;
-    thread->use_kernel_gs = 0;
-
-    return thread;
-}
-
-static void thread_kworker_wrapper(thread_kworker_entry_t entry, void *param,
-    thread_t *thread) {
-
-    entry(param);
-
-    klock_acquire(&thread->thread_lock);
-
-    thread->status = THREAD_TERMINATED;
-
-    klock_release(&thread->thread_lock);
-
-    klog("Finished kworker %p", thread);
-
-    // TODO: release stack memory.
-
-    // yield back to scheduler
-    //sched_kyield();
-    while(1) {}
-}
-
-thread_t *thread_create_kworker(thread_kworker_entry_t entry, void *data,
-    uint64_t stack_size) {
-
-    thread_t *thread = thread_create();
-
-    thread->regs.r.cs = GDT_KERNEL_CS;
-    thread->regs.r.ds = GDT_KERNEL_DS;
-    thread->regs.r.ss = GDT_KERNEL_SS;
-    thread->regs.r.gs = GDT_KERNEL_DS;
-
-    thread->regs.r.rip = (uint64_t)thread_kworker_wrapper;
-    thread->regs.r.rdi = (uint64_t)entry;
-    thread->regs.r.rsi = (uint64_t)data;
-    thread->regs.r.rdx = (uint64_t)thread;
-
-    thread->regs.r.rsp =
-        (uint64_t)(kheap_alloc_aligned(stack_size, 8)) + stack_size;
-
-    thread->context = NULL;
-
-    thread->use_kernel_gs = 1;
-
-    return thread;
-}
-
-void thread_begin(thread_t *thread) {
-    if(thread->use_kernel_gs) {
-        thread->regs.r.gs = GDT_KERNEL_DS;
-        thread->regs.r.gs_base = msr_read(MSR_GS_BASE);
-    }
-    thread_setregs(&thread->regs);
-}
-
-void thread_wakeat(thread_t *thread, ktime_t at) {
-    thread->thread_wake = at;
-    thread->status |= THREAD_SLEEPING;
-}
-
-uint8_t thread_isready(thread_t *thread) {
-    // if terminated, then no.
-    if(thread->status & THREAD_TERMINATED) {
-        return 0;
-    }
-    // if already running, definitely not.
-    if(thread->status & THREAD_RUNNING) {
-        return 0;
-    }
-    // if waiting, no.
-    if(thread->status & THREAD_WAITING) {
-        return 0;
-    }
-    // if sleeping and not enough time has passed, then no.
-    if((thread->status & THREAD_SLEEPING)
-        && thread->thread_wake > ktime_current()) {
-
-        return 0;
-    }
-
-    // otherwise, yes.
-    return 1;
-}
diff --git a/kernel/thread.h b/kernel/thread.h
deleted file mode 100644 (file)
index 82ba9e5..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-#ifndef THREAD_H
-#define THREAD_H
-
-#include <stdint.h>
-
-#include "context.h"
-#include "ktime.h"
-#include "ksynch.h"
-
-/* NOTE: keep these #defines and those in thread_regs.s synched. */
-typedef union thread_regs_t {
-    struct {
-#define THREAD_REG_RAX 0
-        uint64_t rax;
-#define THREAD_REG_RBX 1
-        uint64_t rbx;
-#define THREAD_REG_RCX 2
-        uint64_t rcx;
-#define THREAD_REG_RDX 3
-        uint64_t rdx;
-#define THREAD_REG_RSI 4
-        uint64_t rsi;
-#define THREAD_REG_RDI 5
-        uint64_t rdi;
-
-#define THREAD_REG_R8 6
-        uint64_t r8;
-#define THREAD_REG_R9 7
-        uint64_t r9;
-#define THREAD_REG_R10 8
-        uint64_t r10;
-#define THREAD_REG_R11 9
-        uint64_t r11;
-#define THREAD_REG_R12 10
-        uint64_t r12;
-#define THREAD_REG_R13 11
-        uint64_t r13;
-#define THREAD_REG_R14 12
-        uint64_t r14;
-#define THREAD_REG_R15 13
-        uint64_t r15;
-
-#define THREAD_REG_RBP 14
-        uint64_t rbp;
-#define THREAD_REG_RSP 15
-        uint64_t rsp;
-
-#define THREAD_REG_RFLAGS 16
-        uint64_t rflags;
-#define THREAD_REG_RIP 17
-        uint64_t rip;
-
-#define THREAD_REG_CS 18
-        uint64_t cs;
-#define THREAD_REG_DS 19
-        uint64_t ds;
-#define THREAD_REG_ES 20
-        uint64_t es;
-#define THREAD_REG_FS 21
-        uint64_t fs;
-#define THREAD_REG_GS 22
-        uint64_t gs;
-#define THREAD_REG_GS_BASE 23
-        uint64_t gs_base;
-#define THREAD_REG_SS 24
-        uint64_t ss;
-#define THREAD_REG_COUNT 25
-    } r;
-    uint64_t array[THREAD_REG_COUNT];
-} thread_regs_t;
-
-typedef enum thread_status_t {
-    // set if the thread is active on a processor
-    THREAD_RUNNING = 1,
-    // set if the thread is waiting for a particular time
-    THREAD_SLEEPING = 2,
-    // set if the thread is waiting on a synchronization primitive
-    THREAD_WAITING = 4,
-    // set if the thread has terminated and is awaiting garbage collection
-    THREAD_TERMINATED = 8
-} thread_status_t;
-
-typedef struct thread_t {
-    // spinlock for thread
-    uint64_t thread_lock;
-    // current thread state
-    thread_status_t status;
-    // saved registers
-    thread_regs_t regs;
-    // context for the thread to execute in
-    context_t *context;
-
-    // time to wake, if sleeping.
-    ktime_t thread_wake;
-
-    // Synchronization primitive being waited upon.
-    ksynch_t *waiting;
-
-    // 1 if the current PERCPU GS_BASE should be used, 0 o/w.
-    // only useful for kernel threads.
-    uint8_t use_kernel_gs;
-} thread_t;
-
-typedef void (*thread_kworker_entry_t)(void *);
-
-thread_t *thread_create(void);
-thread_t *thread_create_kworker(thread_kworker_entry_t entry, void *data,
-    uint64_t stack_size);
-
-void thread_begin(thread_t *thread);
-
-// returns 1 if this is the immediate version, 0 if restored.
-// i.e. stores 0 for rax.
-uint64_t thread_ksaveregs(thread_regs_t *regs);
-
-void thread_wakeat(thread_t *thread, ktime_t at);
-
-// returns 1 if thread is ready to run again. Assumes thread lock is held by
-// caller.
-uint8_t thread_isready(thread_t *thread);
-
-#endif
diff --git a/kernel/thread_helper.s b/kernel/thread_helper.s
deleted file mode 100644 (file)
index 0bc1a0f..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-%include "thread_regs.s"
-
-[global thread_setregs]
-thread_setregs:
-       ; store structure pointer into rdi
-       mov     rax, rdi
-
-       ; first set up target stack
-       push    qword [rax + THREAD_REG_SS*8]
-       push    qword [rax + THREAD_REG_RSP*8]
-       push    qword [rax + THREAD_REG_RFLAGS*8]
-       push    qword [rax + THREAD_REG_CS*8]
-       push    qword [rax + THREAD_REG_RIP*8]
-
-       ; now restore regular registers
-       mov     rcx, [rax + THREAD_REG_RCX*8]
-       mov     rdx, [rax + THREAD_REG_RDX*8]
-       mov     rsi, [rax + THREAD_REG_RSI*8]
-       mov     rdi, [rax + THREAD_REG_RDI*8]
-       mov     r8, [rax + THREAD_REG_R8*8]
-       mov     r9, [rax + THREAD_REG_R9*8]
-       mov     r10, [rax + THREAD_REG_R10*8]
-       mov     r11, [rax + THREAD_REG_R11*8]
-       mov     r12, [rax + THREAD_REG_R12*8]
-       mov     r13, [rax + THREAD_REG_R13*8]
-       mov     r14, [rax + THREAD_REG_R14*8]
-       mov     r15, [rax + THREAD_REG_R15*8]
-       mov     rbp, [rax + THREAD_REG_RBP*8]
-
-       ; save values for rax,rbx,rcx,rdx onto stack for easy later reference
-       push    qword [rax + THREAD_REG_RAX*8]
-       push    qword [rax + THREAD_REG_RBX*8]
-       push    qword [rax + THREAD_REG_RCX*8]
-       push    qword [rax + THREAD_REG_RDX*8]
-
-       ; set up segments
-       mov     rbx, [rax + THREAD_REG_ES*8]
-       mov     es, bx
-       mov     rbx, [rax + THREAD_REG_FS*8]
-       mov     fs, bx
-       mov     rbx, [rax + THREAD_REG_GS*8]
-       mov     gs, bx
-
-       push    rax
-       mov     ecx, 0xc0000101
-       mov     edx, dword [rax + THREAD_REG_GS_BASE*8 + 4]
-       mov     eax, dword [rax + THREAD_REG_GS_BASE*8]
-       wrmsr
-       pop     rax
-       ; DS last b/c we probably can't access the regs structure after this...
-       mov     rbx, [rax + THREAD_REG_DS*8]
-       mov     ds, bx
-
-       ; pop rbx/rax off stack, SS is still good (changed by iretq)
-       pop     rdx
-       pop     rcx
-       pop     rbx
-       pop     rax
-
-       ; actually restore now
-       iretq
-
-[global thread_ksaveregs]
-thread_ksaveregs:
-       mov     qword [rdi + THREAD_REG_RAX*8], 0
-       mov     [rdi + THREAD_REG_RBX*8], rbx
-       mov     [rdi + THREAD_REG_RCX*8], rcx
-       mov     [rdi + THREAD_REG_RDX*8], rdx
-       mov     [rdi + THREAD_REG_RSI*8], rsi
-       mov     [rdi + THREAD_REG_RDI*8], rdi
-       mov     [rdi + THREAD_REG_R8*8], r8
-       mov     [rdi + THREAD_REG_R9*8], r9
-       mov     [rdi + THREAD_REG_R10*8], r10
-       mov     [rdi + THREAD_REG_R11*8], r11
-       mov     [rdi + THREAD_REG_R12*8], r12
-       mov     [rdi + THREAD_REG_R13*8], r13
-       mov     [rdi + THREAD_REG_R14*8], r14
-       mov     [rdi + THREAD_REG_R15*8], r15
-       mov     [rdi + THREAD_REG_RBP*8], rbp
-
-       ; store rsp after return from function
-       mov     rax, rsp
-       add     rsp, 8
-       mov     [rdi + THREAD_REG_RSP*8], rax
-
-       pushfq
-       pop     rax
-       mov     [rdi + THREAD_REG_RFLAGS*8], rax
-
-       mov     ax, cs
-       mov     [rdi + THREAD_REG_CS*8], ax
-       mov     ax, ds
-       mov     [rdi + THREAD_REG_DS*8], ax
-       mov     ax, es
-       mov     [rdi + THREAD_REG_ES*8], ax
-       mov     ax, fs
-       mov     [rdi + THREAD_REG_FS*8], ax
-       mov     ax, gs
-       mov     [rdi + THREAD_REG_GS*8], ax
-
-       mov     rdx, rax
-       mov     ecx, 0xc0000101
-       rdmsr
-       mov     dword [rdi + THREAD_REG_GS_BASE*8], eax
-       mov     dword [rdi + THREAD_REG_GS_BASE*8 + 4], edx
-
-       ; save return address as rip
-       mov     rax, [rsp]
-       mov     [rdi + THREAD_REG_RIP*8], rax
-
-       ; next restore will have rax = 0
-       mov     rax, 1
-       ret
diff --git a/kernel/thread_regs.s b/kernel/thread_regs.s
deleted file mode 100644 (file)
index b065aa3..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-%define THREAD_REG_RAX 0
-%define THREAD_REG_RBX 1
-%define THREAD_REG_RCX 2
-%define THREAD_REG_RDX 3
-%define THREAD_REG_RSI 4
-%define THREAD_REG_RDI 5
-%define THREAD_REG_R8 6
-%define THREAD_REG_R9 7
-%define THREAD_REG_R10 8
-%define THREAD_REG_R11 9
-%define THREAD_REG_R12 10
-%define THREAD_REG_R13 11
-%define THREAD_REG_R14 12
-%define THREAD_REG_R15 13
-%define THREAD_REG_RBP 14
-%define THREAD_REG_RSP 15
-%define THREAD_REG_RFLAGS 16
-%define THREAD_REG_RIP 17
-%define THREAD_REG_CS 18
-%define THREAD_REG_DS 19
-%define THREAD_REG_ES 20
-%define THREAD_REG_FS 21
-%define THREAD_REG_GS 22
-%define THREAD_REG_GS_BASE 23
-%define THREAD_REG_SS 24
diff --git a/kernel/tss.c b/kernel/tss.c
deleted file mode 100644 (file)
index 485fb91..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#include "tss.h"
-#include "vmman.h"
-#include "kutil.h"
-#include "klog.h"
-#include "kheap.h"
-
-void init_tss(void) {
-    
-}
-
-tss_t *tss_create() {
-    tss_t *result = kheap_alloc(sizeof(tss_t));
-    // allocate a large enough region of memory for everything to work.
-    // 8*13 = various stack pointers
-    // 65536/8 = IO map
-    // 1 = terminating byte (0xff, according to Intel manuals)
-    result->size = 8*13 + 65536/8 + 1;
-    // allocated aligned to ensure that the first 104 bytes do not cross page
-    // boundary (req. by Intel manuals)
-    result->ptr = kheap_alloc_aligned(result->size, 128);
-
-    kmemset(result->ptr, 0xff, result->size);
-    result->gdt_index = 0;
-
-    result->ist1 = kheap_alloc_aligned(0x1000, 0x1000);
-    // make ist1 point to end of stack.
-    result->ist1 += 0x1000;
-    ((uint32_t *)result->ptr)[9] = (uint64_t)result->ist1 & 0xffffffff;
-    ((uint32_t *)result->ptr)[10] = ((uint64_t)result->ist1 >> 32) & 0xffffffff;
-
-    return result;
-}
-
-void tss_enable_port(tss_t *tss, uint16_t port) {
-    uint64_t index = port / 64 + tss->io_offset/8;
-    tss->ptr[index] &= ~(1ULL << (port%64));
-}
-
-void tss_disable_port(tss_t *tss, uint16_t port) {
-    uint64_t index = port / 64 + tss->io_offset/8;
-    tss->ptr[index] |= (1ULL << (port%64));
-}
-
-void tss_load(tss_t *tss, uint8_t pl) {
-    if(tss->gdt_index == 0) {
-        klog("Attempting to load TSS not in GDT!");
-    }
-    else {
-        uint16_t index = tss->gdt_index * 8 + pl;
-        __asm__ __volatile__ ("ltr ax" : "=a"(index));
-    }
-}
diff --git a/kernel/tss.h b/kernel/tss.h
deleted file mode 100644 (file)
index 5827605..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef TSS_H
-#define TSS_H
-
-#include <stdint.h>
-
-typedef struct tss_t {
-    // pointer to TSS memory; first 104 bytes do not cross page boundary.
-    uint64_t *ptr;
-    uint64_t size;
-    // offset to IO map, is aligned to 8-byte boundary.
-    uint64_t io_offset;
-    uint64_t gdt_index;
-
-    uint8_t *ist1;
-} tss_t;
-
-void init_tss(void);
-
-tss_t *tss_create();
-void tss_enable_port(tss_t *tss, uint16_t port);
-void tss_disable_port(tss_t *tss, uint16_t port);
-
-void tss_load(tss_t *tss, uint8_t pl);
-
-#endif
diff --git a/kernel/util.c b/kernel/util.c
new file mode 100644 (file)
index 0000000..5faca24
--- /dev/null
@@ -0,0 +1,104 @@
+#include "util.h"
+
+uint64_t umin(uint64_t a, uint64_t b) {
+    if(a<b) return a;
+    return b;
+}
+
+int64_t smin(int64_t a, int64_t b) {
+    if(a<b) return a;
+    return b;
+}
+
+uint64_t umax(uint64_t a, uint64_t b) {
+    if(a>b) return a;
+    return b;
+}
+
+int64_t smax(int64_t a, int64_t b) {
+    if(a>b) return a;
+    return b;
+}
+
+u64_t round_pow2_up(u64_t value) {
+    value --;
+    value |= value >> 1;
+    value |= value >> 2;
+    value |= value >> 4;
+    value |= value >> 8;
+    value |= value >> 16;
+    value |= value >> 32;
+    value ++;
+
+    return value;
+}
+
+u8_t log2(u64_t value) {
+    for(u8_t b = 63; b > 0; b --) {
+        if((1ULL << b) <= value) return b;
+    }
+    return 0;
+}
+
+void memset(void *address, int value, uint64_t bytes) {
+    uint8_t *mem = address;
+    for(uint64_t i = 0; i < bytes; i ++) mem[i] = value;
+}
+
+void memcpy(void *dest, const void *source, uint64_t bytes) {
+    memmove(dest, source, bytes);
+}
+
+void memmove(void *dest, const void *source, uint64_t bytes) {
+    uint8_t *destp = dest; 
+    const uint8_t *sourcep = source;
+    if(dest <= source) {
+        for(uint64_t i = 0; i < bytes; i++) {
+            destp[i] = sourcep[i];
+        }
+    }
+    else {
+        for(uint64_t i = bytes; i > 0; i--) {
+            destp[i-1] = sourcep[i-1];
+        }
+    }
+}
+
+int memcmp(const void *mem1, const void *mem2, uint64_t bytes) {
+    const uint8_t *m1 = mem1, *m2 = mem2;
+    for(uint64_t i = 0; i < bytes; i ++) {
+        if(m1[i] > m2[i]) return 1;
+        if(m1[i] < m2[i]) return -1;
+    }
+    return 0;
+}
+
+void memrev(void *memory, uint64_t bytes) {
+    uint8_t *p1 = memory, *p2 = memory;
+    p2 += bytes-1;
+
+    while(p1 < p2) {
+        uint8_t t = *p1;
+        *p1 = *p2;
+        *p2 = t;
+
+        p1 ++, p2 --;
+    }
+}
+
+const void *memmem(const void *haystack, uint64_t hlength, const void *needle,
+    uint64_t nlength) {
+
+    const uint8_t *hp = haystack, *np = needle;
+
+    if(nlength > hlength) return NULL;
+    
+    for(uint64_t offset = 0; offset <= hlength-nlength; offset ++) {
+        uint64_t i;
+        for(i = 0; i < nlength; i ++) {
+            if(hp[i] != np[i]) break;
+        }
+        if(i == nlength) return hp + offset;
+    }
+    return NULL;
+}
diff --git a/kernel/util.h b/kernel/util.h
new file mode 100644 (file)
index 0000000..6d4ef20
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef SYDI_UTIL_H
+#define SYDI_UTIL_H
+
+#include "kernel.h"
+
+u64_t umin(u64_t a, u64_t b);
+s64_t smin(s64_t a, s64_t b);
+
+u64_t umax(u64_t a, u64_t b);
+s64_t smax(s64_t a, s64_t b);
+
+u64_t round_pow2_up(u64_t value);
+u8_t log2(u64_t value);
+
+void memset(void *address, int value, u64_t bytes);
+void memcpy(void *dest, const void *source, u64_t bytes);
+void memmove(void *dest, const void *source, u64_t bytes);
+int memcmp(const void *mem1, const void *mem2, u64_t bytes);
+/** reverses content of memory. */
+void memrev(void *memory, u64_t bytes);
+const void *memmem(const void *haystack, u64_t hlength, const void *needle,
+    u64_t nlength);
+
+#endif
diff --git a/kernel/vmem.c b/kernel/vmem.c
new file mode 100644 (file)
index 0000000..398d2fb
--- /dev/null
@@ -0,0 +1,182 @@
+#include "vmem.h"
+#include "debug.h"
+#include "config.h"
+#include "pagereg.h"
+#include "kheap.h"
+#include "util.h"
+
+#define VMEM_PF_PRESENT 0x01
+#define VMEM_PF_WRITABLE 0x02
+#define VMEM_PF_USER 0x04
+#define VMEM_PF_NOCACHE 0x18
+
+u64_t vmem_boot_pml4;
+u64_t vmem_kernel_pdpt;
+
+// walk one paging structure level to find entry for target
+// here level 1 is PT, level 2 is PD, level 3 is PDPT, level 4 is PML4
+static u64_t *vmem_getptr(u64_t sphy, u64_t target, int level);
+// walk the entire paging structure from a given level down to find entry for
+// target
+static u64_t *vmem_walk(u64_t sphy, u64_t target, int level);
+// ensure that a given target has an entry in this paging structure
+static u64_t *vmem_ensure(u64_t sphy, u64_t target, int level);
+// makes a new, empty, paging table (all entries set to 0x0)
+static u64_t vmem_create_table();
+// Create x86 pagetable flags from VMEM* defines
+static u64_t vmem_pt_from_vmem(u64_t pf);
+
+void vmem_initialize() {
+    sydi_debug("Initializing virtual memory manager");
+    
+    // read boot pml4
+    __asm__(
+        "mov rax, cr3\n"
+        : "=a"(vmem_boot_pml4)
+    );
+
+    // read kernel pdpt
+    vmem_kernel_pdpt = *vmem_getptr(vmem_boot_pml4, SYDI_VIRT_KERNEL_START, 4);
+    vmem_kernel_pdpt &= ~0xfff;
+}
+
+void vmem_kernel_back(u64_t vaddr, u64_t flags) {
+    sydi_assert(vaddr >= SYDI_VIRT_KERNEL_START, "Kernel map in kernelspace");
+
+    u64_t *ret = vmem_ensure(vmem_kernel_pdpt, vaddr, 3);
+    sydi_assert((*ret & 1) == 0, "Not mapping over existing memory");
+
+    u64_t paddr = pagereg_get();
+    *ret = paddr | 0x01 | vmem_pt_from_vmem(flags);
+}
+
+void vmem_kernel_clear(u64_t vaddr) {
+    sydi_assert(vaddr >= SYDI_VIRT_KERNEL_START, "Kernel map in kernelspace");
+    u64_t *ret = vmem_walk(vmem_kernel_pdpt, vaddr, 3);
+    sydi_assert((*ret & 1) != 0, "Not clearing unmapped memory");
+
+    *ret = 0;
+    // TODO: release the page back or something...
+}
+
+static u64_t *vmem_getptr(u64_t sphy, u64_t target, int level) {
+    u64_t index = target / 0x1000;
+
+    sydi_assert(level > 0 && level <= 4, "Walk level is valid");
+
+    while(level > 1) index /= 512, level --;
+    index %= 512;
+
+    return (u64_t *)(SYDI_PHY_MAP_BASE + sphy + index*8);
+}
+
+static u64_t *vmem_walk(u64_t sphy, u64_t target, int level) {
+    u64_t *ret = NULL;
+
+    while(level > 0) {
+        // clear status bits
+        sphy &= ~0xfff;
+
+        ret = vmem_getptr(sphy, target, level);
+
+        sphy = *ret;
+
+        level --;
+
+        // if the next level is not present, return NULL
+        if(level && (sphy & 0x1) == 0) return NULL;
+    }
+
+    return ret;
+}
+
+static u64_t *vmem_ensure(u64_t sphy, u64_t target, int level) {
+    u64_t *ret = NULL;
+    while(level > 0) {
+        // clear status bits
+        sphy &= ~0xfff;
+
+        ret = vmem_getptr(sphy, target, level);
+        level --;
+
+        sphy = *ret;
+
+        // if the next level is not present, create it
+        if(level && (sphy & 0x1) == 0) {
+            u64_t t = vmem_create_table();
+            // mark as cachable, user, present
+            *ret = t | 0x03;
+            sphy = *ret;
+        }
+    }
+    return ret;
+}
+
+static u64_t vmem_create_table() {
+    u64_t paddr = pagereg_get();
+
+    for(int i = 0; i < 0x1000; i ++) *(u8_t *)(SYDI_PHY_MAP_BASE+i) = 0;
+
+    return paddr;
+}
+
+static u64_t vmem_pt_from_vmem(u64_t pf) {
+    u64_t result = 0;
+
+    // always readable
+    if(pf & VMEM_READ) result |= 0;
+    if(pf & VMEM_WRITE) result |= VMEM_PF_WRITABLE;
+    if(pf & VMEM_USER) result |= VMEM_PF_USER;
+    if(pf & VMEM_NOCACHE) result |= VMEM_PF_NOCACHE;
+
+    return result;
+}
+
+vmem_context_t *vmem_make_context() {
+    vmem_context_t *ret = kheap_alloc(sizeof(vmem_context_t));
+
+    ret->cr3 = vmem_create_table();
+
+    // copy kernel PDPT
+    *vmem_getptr(ret->cr3, (u64_t)SYDI_VIRT_KERNEL_START, 4) = 
+        *vmem_getptr(vmem_boot_pml4, (u64_t)SYDI_VIRT_KERNEL_START, 4);
+    // copy physical memory PDPT
+    *vmem_getptr(ret->cr3, (u64_t)SYDI_PHY_MAP_BASE, 4) = 
+        *vmem_getptr(vmem_boot_pml4, (u64_t)SYDI_PHY_MAP_BASE, 4);
+
+    return ret;
+}
+
+void vmem_context_back(vmem_context_t *context, u64_t vaddr, u64_t flags) {
+    vmem_context_back_with(context, vaddr, flags, pagereg_get());
+}
+
+void vmem_context_back_with(vmem_context_t *context, u64_t vaddr, u64_t flags,
+    u64_t paddr) {
+
+    sydi_assert(context, "Valid context");
+    sydi_assert((paddr & 0xfff) == 0, "Valid physical address");
+    
+    u64_t *ret = vmem_ensure(context->cr3, vaddr, 4);
+    sydi_assert((*ret & 1) == 0, "Not mapping over existing memory");
+
+    *ret = paddr | 0x01 | vmem_pt_from_vmem(flags);
+}
+
+void vmem_context_clear(vmem_context_t *context, u64_t vaddr) {
+    sydi_assert(context, "Valid context");
+
+    u64_t *ret = vmem_walk(context->cr3, vaddr, 4);
+    sydi_assert((*ret & 1) != 0, "Not clearing unmapped memory");
+
+    *ret = 0;
+    // TODO: release the page back or something...
+}
+
+void vmem_context_activate(vmem_context_t *context) {
+    __asm__(
+        "mov cr3, rax"
+        :
+        : "a"(context->cr3)
+    );
+}
diff --git a/kernel/vmem.h b/kernel/vmem.h
new file mode 100644 (file)
index 0000000..2045008
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef SYDI_VMEM_H
+#define SYDI_VMEM_H
+
+#define VMEM_READ 0x1
+#define VMEM_WRITE 0x2
+#define VMEM_EXEC 0x4
+
+#define VMEM_KERNEL 0
+#define VMEM_USER 0x8
+
+#define VMEM_NOCACHE 0x10
+#define VMEM_CACHE 0
+#define VMEM_AGGRESSIVE_CACHE 0x20
+
+#include "kernel.h"
+
+typedef struct {
+    u64_t cr3;
+
+    // store list of pages here eventually
+} vmem_context_t;
+
+void vmem_initialize();
+
+void vmem_kernel_back(u64_t vaddr, u64_t flags);
+void vmem_kernel_clear(u64_t vaddr);
+
+vmem_context_t *vmem_make_context();
+
+void vmem_context_back(vmem_context_t *context, u64_t vaddr, u64_t flags);
+void vmem_context_back_with(vmem_context_t *context, u64_t vaddr, u64_t flags,
+    u64_t paddr);
+void vmem_context_clear(vmem_context_t *context, u64_t vaddr);
+
+void vmem_context_activate(vmem_context_t *context);
+
+#endif
diff --git a/kernel/vmman.c b/kernel/vmman.c
deleted file mode 100644 (file)
index 6f423b0..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-#include "vmman.h"
-#include "pmman.h"
-#include "klog.h"
-#include "kutil.h"
-#include "config.h"
-#include "smp.h"
-#include "kheap.h"
-
-static vmman_context_t vmman_boot_context;
-uint64_t vmman_kernel_pdpt, vmman_phy_pdpt;
-
-vmman_context_t *vmman_cpu_contexts[MAX_CPUS];
-
-static vmman_context_t *vmman_current_context();
-
-static uint64_t vmman_get_pml4_entry(vmman_context_t *context,
-    uint64_t address);
-static uint64_t vmman_get_pdpt_entry(vmman_context_t *context,
-    uint64_t address);
-static uint64_t vmman_get_pd_entry(vmman_context_t *context, uint64_t address);
-#if 0
-static uint64_t vmman_get_pt_entry(vmman_context_t *context, uint64_t address);
-#endif
-
-static void vmman_set_pml4_entry(vmman_context_t *context, uint64_t address,
-    uint64_t value);
-static void vmman_set_pdpt_entry(vmman_context_t *context, uint64_t address,
-    uint64_t value);
-static void vmman_set_pd_entry(vmman_context_t *context, uint64_t address,
-    uint64_t value);
-static void vmman_set_pt_entry(vmman_context_t *context, uint64_t address,
-    uint64_t value);
-
-void vmman_init(void) {
-    // read boot pml4 from cr3.
-    __asm__(
-        "mov rax, cr3\n"
-        : "=a"(vmman_boot_context.pml4)
-    );
-
-    // duplicate code from vmman_get_pml4_entry so that we hardcode the
-    // context.
-    uint64_t *kernel_pml4 = 
-        (uint64_t *)(PHY_MAP_BASE + vmman_boot_context.pml4);
-    
-    vmman_kernel_pdpt = kernel_pml4[511];
-    vmman_phy_pdpt = kernel_pml4[384];
-
-    // initialize cpu contexts.
-    for(int i = 0; i < MAX_CPUS; i ++) vmman_cpu_contexts[i] = NULL;
-}
-
-void vmman_init_context(vmman_context_t *context) {
-    context->pml4 = pmman_newlowerpage();
-    // clear page
-    kmemset(PHY_MAP_BASE + context->pml4, 0, 0x1000);
-
-    // add kernel pdpt
-    ((uint64_t *)(PHY_MAP_BASE + context->pml4))[511] = vmman_kernel_pdpt;
-    // add phy pdpt
-    ((uint64_t *)(PHY_MAP_BASE + context->pml4))[384] = vmman_phy_pdpt;
-}
-
-void vmman_destroy_context(vmman_context_t *context) {
-    pmman_releasepage(context->pml4);
-}
-
-void vmman_set_context(vmman_context_t *context) {
-    vmman_cpu_contexts[smp_get_id()] = context;
-    __asm__(
-        "mov cr3, rax"
-        : : "a"(context->pml4)
-    );
-}
-
-void vmman_back_page(uint64_t virt_addr, uint64_t flags) {
-    vmman_back_context_page(vmman_current_context(), virt_addr, flags);
-}
-
-void vmman_map_page(uint64_t phy_addr, uint64_t virt_addr, uint64_t flags) {
-    vmman_map_context_page(vmman_current_context(), phy_addr, virt_addr,
-        flags);
-}
-
-void vmman_back_context_page(vmman_context_t *context, uint64_t virt_addr,
-    uint64_t flags) {
-
-    uint64_t phy = pmman_newpage();
-    vmman_map_context_page(context, phy, virt_addr, flags);
-}
-
-void vmman_map_context_page(vmman_context_t *context, uint64_t phy_addr,
-    uint64_t virt_addr, uint64_t flags) {
-
-    vmman_set_pt_entry(context, virt_addr, phy_addr | flags);
-}
-
-static vmman_context_t *vmman_current_context() {
-    vmman_context_t *cpu_context = vmman_cpu_contexts[smp_get_id()];
-    if(!cpu_context) cpu_context = &vmman_boot_context;
-    return cpu_context;
-}
-
-static uint64_t vmman_get_pml4_entry(vmman_context_t *context,
-    uint64_t address) {
-
-    uint64_t index = (address >> 12 >> 9 >> 9 >> 9) % 512;
-
-    return ((uint64_t *)(PHY_MAP_BASE + context->pml4))[index];
-}
-
-static uint64_t vmman_get_pdpt_entry(vmman_context_t *context,
-    uint64_t address) {
-
-    uint64_t pml4_entry = vmman_get_pml4_entry(context, address);
-    if((pml4_entry & 1) == 0) return 0;
-
-    uint64_t index = (address >> 12 >> 9 >> 9) % 512;
-
-    pml4_entry &= ~0xfff;
-
-    return ((uint64_t *)(PHY_MAP_BASE + pml4_entry))[index];
-}
-
-static uint64_t vmman_get_pd_entry(vmman_context_t *context,
-    uint64_t address) {
-
-    uint64_t pdpt_entry = vmman_get_pdpt_entry(context, address);
-    if((pdpt_entry & 1) == 0) return 0;
-
-    uint64_t index = (address >> 12 >> 9) % 512;
-
-    pdpt_entry &= ~0xfff;
-
-    return ((uint64_t *)(PHY_MAP_BASE + pdpt_entry))[index];
-}
-
-#if 0
-static uint64_t vmman_get_pt_entry(vmman_context_t *context,
-    uint64_t address) {
-
-    uint64_t pd_entry = vmman_get_pd_entry(context, address);
-    if((pd_entry & 1) == 0) return 0;
-
-    uint64_t index = (address >> 12) % 512;
-
-    pd_entry &= ~0xfff;
-
-    return ((uint64_t *)(PHY_MAP_BASE + pd_entry))[index];
-}
-#endif
-
-static void vmman_set_pml4_entry(vmman_context_t *context, uint64_t address,
-    uint64_t value) {
-    
-    uint64_t index = (address >> 12 >> 9 >> 9 >> 9) % 512;
-
-    ((uint64_t *)(PHY_MAP_BASE + context->pml4))[index] = value;
-}
-
-static void vmman_set_pdpt_entry(vmman_context_t *context, uint64_t address,
-    uint64_t value) {
-
-    uint64_t pml4_entry = vmman_get_pml4_entry(context, address);
-    if((pml4_entry & 1) == 0) {
-        pml4_entry = pmman_newlowerpage();
-        pml4_entry |= VMMAN_PRESENT | VMMAN_WRITABLE;
-        vmman_set_pml4_entry(context, address, pml4_entry);
-    }
-
-    uint64_t index = (address >> 12 >> 9 >> 9) % 512;
-
-    pml4_entry &= ~0xfff;
-
-    ((uint64_t *)(PHY_MAP_BASE + pml4_entry))[index] = value;
-}
-
-static void vmman_set_pd_entry(vmman_context_t *context, uint64_t address,
-    uint64_t value) {
-
-    uint64_t pdpt_entry = vmman_get_pdpt_entry(context, address);
-    if((pdpt_entry & 1) == 0) {
-        pdpt_entry = pmman_newlowerpage();
-        pdpt_entry |= VMMAN_PRESENT | VMMAN_WRITABLE;
-        vmman_set_pdpt_entry(context, address, pdpt_entry);
-    }
-
-    uint64_t index = (address >> 12 >> 9) % 512;
-
-    pdpt_entry &= ~0xfff;
-
-    ((uint64_t *)(PHY_MAP_BASE + pdpt_entry))[index] = value;
-}
-
-static void vmman_set_pt_entry(vmman_context_t *context, uint64_t address,
-    uint64_t value) {
-
-    uint64_t pd_entry = vmman_get_pd_entry(context, address);
-    if((pd_entry & 1) == 0) {
-        pd_entry = pmman_newlowerpage();
-        pd_entry |= VMMAN_PRESENT | VMMAN_WRITABLE;
-        vmman_set_pd_entry(context, address, pd_entry);
-    }
-
-    uint64_t index = (address >> 12) % 512;
-
-    // get aligned page for PD
-    pd_entry &= ~0xfff;
-
-    ((uint64_t *)(PHY_MAP_BASE + pd_entry))[index] = value;
-}
-
-uint64_t vmman_boot_pml4() {
-    return vmman_boot_context.pml4;
-}
diff --git a/kernel/vmman.h b/kernel/vmman.h
deleted file mode 100644 (file)
index ee63e41..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef VMMAN_H
-#define VMMAN_H
-
-#include <stdint.h>
-
-#include "khash.h"
-
-#define VMMAN_READONLY 0
-#define VMMAN_WRITABLE (1<<1)
-#define VMMAN_SYSTEM 0
-#define VMMAN_USER (1<<2)
-#define VMMAN_EXEC 0
-//#define VMMAN_NOEXEC (1ULL<<63)
-#define VMMAN_NOEXEC 0
-#define VMMAN_CACHE_NONE (1<<3 | 1<<4)
-#define VMMAN_CACHE_NORMAL 0
-#define VMMAN_PRESENT 1
-#define VMMAN_NOT_PRESENT 0
-
-#define VMMAN_USER_CODE \
-    VMMAN_EXEC | VMMAN_WRITABLE | VMMAN_USER | VMMAN_CACHE_NORMAL \
-    | VMMAN_PRESENT
-#define VMMAN_USER_DATA \
-    VMMAN_NOEXEC | VMMAN_WRITABLE | VMMAN_USER | VMMAN_CACHE_NORMAL \
-    | VMMAN_PRESENT
-#define VMMAN_KERNEL_CODE \
-    VMMAN_EXEC | VMMAN_WRITABLE | VMMAN_SYSTEM | VMMAN_CACHE_NORMAL \
-    | VMMAN_PRESENT
-#define VMMAN_KERNEL_DATA \
-    VMMAN_NOEXEC | VMMAN_WRITABLE | VMMAN_SYSTEM | VMMAN_CACHE_NORMAL \
-    | VMMAN_PRESENT
-
-typedef struct vmman_context_t {
-    uint64_t pml4;
-} vmman_context_t;
-
-void vmman_init(void);
-
-void vmman_init_context(vmman_context_t *context);
-void vmman_set_context(vmman_context_t *context);
-void vmman_destroy_context(vmman_context_t *context);
-
-void vmman_back_page(uint64_t virt_addr, uint64_t flags);
-void vmman_map_page(uint64_t phy_addr, uint64_t virt_addr, uint64_t flags);
-
-void vmman_back_context_page(vmman_context_t *context, uint64_t virt_addr,
-    uint64_t flags);
-void vmman_map_context_page(vmman_context_t *context, uint64_t phy_addr,
-    uint64_t virt_addr, uint64_t flags);
-
-uint64_t vmman_boot_pml4();
-
-#endif