From 9995354f959b2a3289ae0d6aba53744a37c3af15 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Fri, 12 Aug 2011 17:17:02 +0200 Subject: [PATCH] Moved CPU code shared by x86 and x64 into x86-family. --- sortix/Makefile | 5 +- sortix/x64/x64.cpp | 35 ----------- sortix/x64/x64.h | 11 +--- sortix/x86-family/x86-family.cpp | 102 +++++++++++++++++++++++++++++++ sortix/x86-family/x86-family.h | 43 +++++++++++++ sortix/x86/x86.cpp | 70 --------------------- sortix/x86/x86.h | 13 +--- 7 files changed, 154 insertions(+), 125 deletions(-) create mode 100644 sortix/x86-family/x86-family.cpp create mode 100644 sortix/x86-family/x86-family.h diff --git a/sortix/Makefile b/sortix/Makefile index f4c2c664..029b05f8 100644 --- a/sortix/Makefile +++ b/sortix/Makefile @@ -26,7 +26,8 @@ ifdef X86FAMILY CPUOBJS:=$(CPUOBJS) \ $(CPU)/memorymanagement-asm.o \ $(CPU)/interrupt.o \ - $(CPU)/gdt.o + $(CPU)/gdt.o \ + x86-family/x86-family.o CPUFLAGS:=$(CPUFLAGS) -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow endif @@ -42,7 +43,7 @@ DEFINES:=$(DEFINES) -DPLATFORM_KERNEL_HEAP DEFINES:=$(DEFINES) -DINITRD CPPFLAGSRELEASE=-s -O3 CPPFLAGSDEBUG= -CPPFLAGS=-I.. $(CPUDEFINES) $(CPUFLAGS) -std=gnu++0x -Wall -Wextra -nostdlib -fno-builtin -nostartfiles -nodefaultlibs -fno-exceptions -fno-rtti -fno-stack-protector $(DEFINES) $(CPPFLAGSRELEASE) +CPPFLAGS=-I.. -I. $(CPUDEFINES) $(CPUFLAGS) -std=gnu++0x -Wall -Wextra -nostdlib -fno-builtin -nostartfiles -nodefaultlibs -fno-exceptions -fno-rtti -fno-stack-protector $(DEFINES) $(CPPFLAGSRELEASE) OBJS=$(CPUOBJS) kernel.o descriptor_tables.o isr.o time.o log.o iprintable.o panic.o keyboard.o memorymanagement.o scheduler.o syscall.o application.o pong.o sound.o pci.o uart.o conway.o test.o http.o vgaterminal.o serialterminal.o descriptors.o device.o vga.o ../libmaxsi/libmaxsi-sortix.a JSOBJS:=$(subst .o,-js.o,$(OBJS)) diff --git a/sortix/x64/x64.cpp b/sortix/x64/x64.cpp index b19408aa..f34d5db2 100644 --- a/sortix/x64/x64.cpp +++ b/sortix/x64/x64.cpp @@ -29,40 +29,5 @@ namespace Sortix { namespace X64 { - void OutPortB(uint16_t Port, uint8_t Value) - { - asm volatile ("outb %1, %0" : : "dN" (Port), "a" (Value)); - } - - void OutPortW(uint16_t Port, uint16_t Value) - { - asm volatile ("outw %1, %0" : : "dN" (Port), "a" (Value)); - } - - void OutPortL(uint16_t Port, uint32_t Value) - { - asm volatile ("outl %1, %0" : : "dN" (Port), "a" (Value)); - } - - uint8_t InPortB(uint16_t Port) - { - uint8_t Result; - asm volatile("inb %1, %0" : "=a" (Result) : "dN" (Port)); - return Result; - } - - uint16_t InPortW(uint16_t Port) - { - uint16_t Result; - asm volatile("inw %1, %0" : "=a" (Result) : "dN" (Port)); - return Result; - } - - uint32_t InPortL(uint16_t Port) - { - uint32_t Result; - asm volatile("inl %1, %0" : "=a" (Result) : "dN" (Port)); - return Result; - } } } diff --git a/sortix/x64/x64.h b/sortix/x64/x64.h index 2d245244..17c6abb0 100644 --- a/sortix/x64/x64.h +++ b/sortix/x64/x64.h @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with Sortix. If not, see . - x64 + x64.h CPU stuff for the x64 platform. ******************************************************************************/ @@ -25,17 +25,12 @@ #ifndef SORTIX_X64_H #define SORTIX_X64_H +#include "../x86-family/x86-family.h" + namespace Sortix { namespace X64 { - void OutPortB(uint16_t Port, uint8_t Value); - void OutPortW(uint16_t Port, uint16_t Value); - void OutPortL(uint16_t Port, uint32_t Value); - uint8_t InPortB(uint16_t Port); - uint16_t InPortW(uint16_t Port); - uint32_t InPortL(uint16_t Port); - struct InterruptRegisters { uint64_t cr2; diff --git a/sortix/x86-family/x86-family.cpp b/sortix/x86-family/x86-family.cpp new file mode 100644 index 00000000..32b392b6 --- /dev/null +++ b/sortix/x86-family/x86-family.cpp @@ -0,0 +1,102 @@ +/****************************************************************************** + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011. + + This file is part of Sortix. + + Sortix is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + Sortix is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + You should have received a copy of the GNU General Public License along + with Sortix. If not, see . + + x86-family.cpp + CPU stuff for the x86 CPU family. + +******************************************************************************/ + +#include + +namespace Sortix +{ + namespace CPU + { + void OutPortB(uint16_t Port, uint8_t Value) + { + asm volatile ("outb %1, %0" : : "dN" (Port), "a" (Value)); + } + + void OutPortW(uint16_t Port, uint16_t Value) + { + asm volatile ("outw %1, %0" : : "dN" (Port), "a" (Value)); + } + + void OutPortL(uint16_t Port, uint32_t Value) + { + asm volatile ("outl %1, %0" : : "dN" (Port), "a" (Value)); + } + + uint8_t InPortB(uint16_t Port) + { + uint8_t Result; + asm volatile("inb %1, %0" : "=a" (Result) : "dN" (Port)); + return Result; + } + + uint16_t InPortW(uint16_t Port) + { + uint16_t Result; + asm volatile("inw %1, %0" : "=a" (Result) : "dN" (Port)); + return Result; + } + + uint32_t InPortL(uint16_t Port) + { + uint32_t Result; + asm volatile("inl %1, %0" : "=a" (Result) : "dN" (Port)); + return Result; + } + + void Reboot() + { + // Keyboard interface IO port: data and control. + const uint16_t KEYBOARD_INTERFACE = 0x64; + + // Keyboard IO port. + const uint16_t KEYBOARD_IO = 0x60; + + // Keyboard data is in buffer (output buffer is empty) (bit 0). + const uint8_t KEYBOARD_DATA = (1<<0); + + // User data is in buffer (command buffer is empty) (bit 1). + const uint8_t USER_DATA = (1<<1); + + // Disable interrupts. + asm volatile("cli"); + + // Clear all keyboard buffers (output and command buffers). + uint8_t byte; + do + { + byte = InPortB(KEYBOARD_INTERFACE); + if ( ( byte & KEYBOARD_DATA ) != 0 ) { InPortB(KEYBOARD_IO); } + } while ( ( byte & USER_DATA ) != 0 ); + + // CPU reset command. + uint8_t KEYBOARD_RESET_CPU = 0xFE; + + // Now pulse the CPU reset line and reset. + OutPortB(KEYBOARD_INTERFACE, KEYBOARD_RESET_CPU); + + // If that didn't work, just halt. + asm volatile("hlt"); + } + } +} diff --git a/sortix/x86-family/x86-family.h b/sortix/x86-family/x86-family.h new file mode 100644 index 00000000..c8843ad4 --- /dev/null +++ b/sortix/x86-family/x86-family.h @@ -0,0 +1,43 @@ +/****************************************************************************** + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011. + + This file is part of Sortix. + + Sortix is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + Sortix is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + You should have received a copy of the GNU General Public License along + with Sortix. If not, see . + + x86-family.h + CPU stuff for the x86 CPU family. + +******************************************************************************/ + +#ifndef SORTIX_X86_FAMILY_H +#define SORTIX_X86_FAMILY_H + +namespace Sortix +{ + namespace CPU + { + void OutPortB(uint16_t Port, uint8_t Value); + void OutPortW(uint16_t Port, uint16_t Value); + void OutPortL(uint16_t Port, uint32_t Value); + uint8_t InPortB(uint16_t Port); + uint16_t InPortW(uint16_t Port); + uint32_t InPortL(uint16_t Port); + void Reboot(); + } +} + +#endif + diff --git a/sortix/x86/x86.cpp b/sortix/x86/x86.cpp index 4abfbbc7..da711f8b 100644 --- a/sortix/x86/x86.cpp +++ b/sortix/x86/x86.cpp @@ -29,75 +29,5 @@ namespace Sortix { namespace X86 { - void OutPortB(uint16_t Port, uint8_t Value) - { - asm volatile ("outb %1, %0" : : "dN" (Port), "a" (Value)); - } - - void OutPortW(uint16_t Port, uint16_t Value) - { - asm volatile ("outw %1, %0" : : "dN" (Port), "a" (Value)); - } - - void OutPortL(uint16_t Port, uint32_t Value) - { - asm volatile ("outl %1, %0" : : "dN" (Port), "a" (Value)); - } - - uint8_t InPortB(uint16_t Port) - { - uint8_t Result; - asm volatile("inb %1, %0" : "=a" (Result) : "dN" (Port)); - return Result; - } - - uint16_t InPortW(uint16_t Port) - { - uint16_t Result; - asm volatile("inw %1, %0" : "=a" (Result) : "dN" (Port)); - return Result; - } - - uint32_t InPortL(uint16_t Port) - { - uint32_t Result; - asm volatile("inl %1, %0" : "=a" (Result) : "dN" (Port)); - return Result; - } - - void Reboot() - { - // Keyboard interface IO port: data and control. - const uint16_t KEYBOARD_INTERFACE = 0x64; - - // Keyboard IO port. - const uint16_t KEYBOARD_IO = 0x60; - - // Keyboard data is in buffer (output buffer is empty) (bit 0). - const uint8_t KEYBOARD_DATA = (1<<0); - - // User data is in buffer (command buffer is empty) (bit 1). - const uint8_t USER_DATA = (1<<1); - - // Disable interrupts. - asm volatile("cli"); - - // Clear all keyboard buffers (output and command buffers). - uint8_t byte; - do - { - byte = InPortB(KEYBOARD_INTERFACE); - if ( ( byte & KEYBOARD_DATA ) != 0 ) { InPortB(KEYBOARD_IO); } - } while ( ( byte & USER_DATA ) != 0 ); - - // CPU reset command. - uint8_t KEYBOARD_RESET_CPU = 0xFE; - - // Now pulse the CPU reset line and reset. - OutPortB(KEYBOARD_INTERFACE, KEYBOARD_RESET_CPU); - - // If that didn't work, just halt. - asm volatile("hlt"); - } } } diff --git a/sortix/x86/x86.h b/sortix/x86/x86.h index 4604f4da..fbfdf19f 100644 --- a/sortix/x86/x86.h +++ b/sortix/x86/x86.h @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with Sortix. If not, see . - x86 + x86.h CPU stuff for the x86 platform. ******************************************************************************/ @@ -25,17 +25,12 @@ #ifndef SORTIX_X86_H #define SORTIX_X86_H +#include "../x86-family/x86-family.h" + namespace Sortix { namespace X86 { - void OutPortB(uint16_t Port, uint8_t Value); - void OutPortW(uint16_t Port, uint16_t Value); - void OutPortL(uint16_t Port, uint32_t Value); - uint8_t InPortB(uint16_t Port); - uint16_t InPortW(uint16_t Port); - uint32_t InPortL(uint16_t Port); - struct InterruptRegisters { uint32_t cr2; @@ -44,8 +39,6 @@ namespace Sortix uint32_t int_no, err_code; // Interrupt number and error code (if applicable) uint32_t eip, cs, eflags, useresp, ss; // Pushed by the processor automatically. }; - - void Reboot(); } }