From a73973c9ae66423860863d30f71d154640219033 Mon Sep 17 00:00:00 2001 From: Ali Bendriss Date: Tue, 7 Jul 2009 18:54:48 +0100 Subject: [PATCH] initial commit --- Makefile | 21 ++++++++++++ README | 18 +++++++++++ configure.sh | 27 ++++++++++++++++ crtl/Makefile | 20 ++++++++++++ crtl/crtl.adb | 54 +++++++++++++++++++++++++++++++ crtl/crtl.ads | 13 ++++++++ crtl/gnat.adc | 1 + dummy/Makefile | 19 +++++++++++ dummy/dummy.adb | 9 ++++++ dummy/dummy.ads | 9 ++++++ dummy/gnat.adc | 1 + grub_img/fda_grub.img | Bin 0 -> 1474560 bytes make.conf | 8 +++++ script/mkfloppy.sh | 10 ++++++ script/mkgrub.sh | 20 ++++++++++++ src/Makefile | 67 ++++++++++++++++++++++++++++++++++++++ src/boot.adb | 17 ++++++++++ src/gnat.adc | 1 + src/gnatlib/a-elchha.adb | 7 ++++ src/gnatlib/a-elchha.ads | 46 ++++++++++++++++++++++++++ src/gnatlib/a-except.ads | 63 ++++++++++++++++++++++++++++++++++++ src/i386-port_io.adb | 80 ++++++++++++++++++++++++++++++++++++++++++++++ src/i386-port_io.ads | 23 +++++++++++++ src/i386-text_console.adb | 71 ++++++++++++++++++++++++++++++++++++++++ src/i386-text_console.ads | 54 +++++++++++++++++++++++++++++++ src/i386.ads | 16 ++++++++++ src/kernel_entry.asm | 60 ++++++++++++++++++++++++++++++++++ src/link.ld | 25 +++++++++++++++ 28 files changed, 760 insertions(+) create mode 100644 Makefile create mode 100644 README create mode 100755 configure.sh create mode 100644 crtl/Makefile create mode 100644 crtl/crtl.adb create mode 100644 crtl/crtl.ads create mode 100644 crtl/gnat.adc create mode 100644 dummy/Makefile create mode 100644 dummy/dummy.adb create mode 100644 dummy/dummy.ads create mode 100644 dummy/gnat.adc create mode 100644 grub_img/fda_grub.img create mode 100644 make.conf create mode 100644 script/mkfloppy.sh create mode 100644 script/mkgrub.sh create mode 100644 src/Makefile create mode 100644 src/boot.adb create mode 100644 src/gnat.adc create mode 100644 src/gnatlib/a-elchha.adb create mode 100644 src/gnatlib/a-elchha.ads create mode 100644 src/gnatlib/a-except.ads create mode 100644 src/i386-port_io.adb create mode 100644 src/i386-port_io.ads create mode 100644 src/i386-text_console.adb create mode 100644 src/i386-text_console.ads create mode 100644 src/i386.ads create mode 100644 src/kernel_entry.asm create mode 100644 src/link.ld diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5284041 --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +DSK_NAME = "a:" +DSK_IMG = "/tmp/floppy.image" + +RM = rm -f + +main: + make qemu + +fdb_kernel.img: + make -C src + $(SHELL) script/mkfloppy.sh $(DSK_NAME) $(DSK_IMG) + +clean: + make -C src clean + make -C dummy clean + make -C crtl clean + $(RM) fdb_kernel.img + +qemu: + make fdb_kernel.img + qemu -fda grub_img/fda_grub.img -fdb fdb_kernel.img -boot a diff --git a/README b/README new file mode 100644 index 0000000..82bca8d --- /dev/null +++ b/README @@ -0,0 +1,18 @@ +a2k +--- + +Just an other "hello world" kernel written in Ada and targeting the i386 processor via qemu. + +Requirement: +run ./configure.sh +to check the requirement and prepare the mtools to build a grub floppy disk. + +Building: +make clean +make +to build the kernel in the a.out format (tested with gnat gpl 2008-09 and gcc-4.2.4) +or +make clean +BUILD=elf make +to build the kernel in elf format (only work with gnat gpl 2009) + diff --git a/configure.sh b/configure.sh new file mode 100755 index 0000000..8006587 --- /dev/null +++ b/configure.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +for i in "sed" "rm" "cp" "mkdir" "gcc" "nasm" "ld" "mformat" "mcopy" "qemu" +do + echo -n "Checking $i: " + if ! which $i 2> /dev/null; then + echo "...Not Ok" + exit 1 + fi + +done + +if [ ! -f ~/.mtoolsrc ]; then + echo "creating a mtools configuration files : ~/.mtoolsrc" + cat < ~/.mtoolsrc +# # file floppy image + drive a: file="/tmp/floppy.image" +EOF +else + echo "You already have a mtools configuration files : ~/.mtoolsrc" + echo "Please move this files and run this script again." + exit 1 +fi + + +echo "Done with the configuration!" +echo "run make or BUILD=elf make" diff --git a/crtl/Makefile b/crtl/Makefile new file mode 100644 index 0000000..f5c2cfa --- /dev/null +++ b/crtl/Makefile @@ -0,0 +1,20 @@ + +include ../make.conf + +libc: crtl.o +ifeq ($(BUILD),elf) + gcc -shared -Wl,-soname,libc.so.1 -o libc.so.1.0 *.o + ln -sf libc.so.1.0 libc.so.1 + ln -sf libc.so.1 libc.so + $(CP) -a libc.so* ../lib +else + ar -r libc.a $< + $(CP) libc.a ../lib +endif + +crtl.o: + gnatmake -c $(NO_RTL_FLAGS) crtl + +clean: + $(RM) ../lib/libc.a *.o *.ali *.a + $(RM) ../lib/libc.so* *.o *.ali *.so* \ No newline at end of file diff --git a/crtl/crtl.adb b/crtl/crtl.adb new file mode 100644 index 0000000..b46696c --- /dev/null +++ b/crtl/crtl.adb @@ -0,0 +1,54 @@ +with Interfaces; +with Unchecked_Conversion; +with System.Storage_Elements; + +package body Crtl is + + function memcpy + (S1 : System.Address; S2 : System.Address; N : size_t) + return System.Address + is + type Pointer is access all Interfaces.Unsigned_8; + + function To_Pointer is new Unchecked_Conversion (System.Address, Pointer); + function To_Address is new Unchecked_Conversion (Pointer, System.Address); + + --------- + -- "+" -- + --------- + + function "+" (Left : Pointer; Right : size_t) return Pointer is + use System.Storage_Elements; + begin + return To_Pointer (To_Address (Left) + + System.Storage_Elements.Storage_Offset (Right)); + end "+"; + pragma Inline ("+"); + + --------------- + -- Increment -- + --------------- + + procedure Increment (Ref : in out Pointer) is + begin + Ref := Ref + 1; + end Increment; + pragma Inline (Increment); + + T : Pointer := To_Pointer (S1); + S : Pointer := To_Pointer (S2); + + begin + -- if S = null or else T = null then + -- raise Dereference_Error; + -- else + for J in 1 .. N loop + T.all := S.all; + Increment (T); + Increment (S); + end loop; + -- end if; + return S1; + end memcpy; + +end Crtl; diff --git a/crtl/crtl.ads b/crtl/crtl.ads new file mode 100644 index 0000000..b6da613 --- /dev/null +++ b/crtl/crtl.ads @@ -0,0 +1,13 @@ +with System; + +package Crtl is + pragma Preelaborate; + + type size_t is mod 2 ** Standard'Address_Size; + + function memcpy + (S1 : System.Address; S2 : System.Address; N : size_t) + return System.Address; + pragma Export (C, memcpy, "memcpy"); + +end Crtl; diff --git a/crtl/gnat.adc b/crtl/gnat.adc new file mode 100644 index 0000000..861c169 --- /dev/null +++ b/crtl/gnat.adc @@ -0,0 +1 @@ +pragma No_Run_Time; diff --git a/dummy/Makefile b/dummy/Makefile new file mode 100644 index 0000000..8cc3b04 --- /dev/null +++ b/dummy/Makefile @@ -0,0 +1,19 @@ +include ../make.conf + +libdummy: dummy.o +ifeq ($(BUILD),elf) + gcc -shared -Wl,-soname,libdummy.so.1 -o libdummy.so.1.0 $< + ln -sf libdummy.so.1.0 libdummy.so.1 + ln -sf libdummy.so.1 libdummy.so + $(CP) -a libdummy.so* ../lib +else + ar -r libdummy.a $< + $(CP) libdummy.a ../lib +endif + +dummy.o: + gnatmake -c $(NO_RTL_FLAGS) dummy.adb + +clean: + $(RM) ../lib/libdummy.a *.o *.ali *.a + $(RM) ../lib/libdummy.so* *.o *.ali *.a *.so* diff --git a/dummy/dummy.adb b/dummy/dummy.adb new file mode 100644 index 0000000..fd07345 --- /dev/null +++ b/dummy/dummy.adb @@ -0,0 +1,9 @@ +package body Dummy is + + procedure Eh_Personality + is + begin + null; + end Eh_Personality; + +end Dummy; diff --git a/dummy/dummy.ads b/dummy/dummy.ads new file mode 100644 index 0000000..8867eae --- /dev/null +++ b/dummy/dummy.ads @@ -0,0 +1,9 @@ +pragma No_Run_Time; + +package Dummy is + pragma Preelaborate; + + procedure Eh_Personality; + pragma Export (C, Eh_Personality, "__gnat_eh_personality"); + +end Dummy; diff --git a/dummy/gnat.adc b/dummy/gnat.adc new file mode 100644 index 0000000..861c169 --- /dev/null +++ b/dummy/gnat.adc @@ -0,0 +1 @@ +pragma No_Run_Time; diff --git a/grub_img/fda_grub.img b/grub_img/fda_grub.img new file mode 100644 index 0000000000000000000000000000000000000000..9d33754c114c684a74fb354b7a542eca21ae9f5a GIT binary patch literal 1474560 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

f+YQdi{g+?edLUfwdaS}3-5=vU!t1V> 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 literal 0 HcwPel00001 diff --git a/make.conf b/make.conf new file mode 100644 index 0000000..d3c6442 --- /dev/null +++ b/make.conf @@ -0,0 +1,8 @@ +ASM = nasm +LD = ld +RM = rm -f +GCC = gcc +CP = cp +MKDIR = mkdir -p + +NO_RTL_FLAGS = -Wall -O -nostdinc -nostdlib -aI../src/adainclude -aL../src/gnatlib diff --git a/script/mkfloppy.sh b/script/mkfloppy.sh new file mode 100644 index 0000000..f253180 --- /dev/null +++ b/script/mkfloppy.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +DSK=$1 +DSKF=$2 +echo "mformat -C -f 2880 $DSK" +mformat -C -f 2880 $DSK +echo "mcopy src/kernel.bin $DSK" +mcopy src/kernel.bin $DSK +echo "mv $DSKF src/fdb_kernel.img" +mv $DSKF fdb_kernel.img diff --git a/script/mkgrub.sh b/script/mkgrub.sh new file mode 100644 index 0000000..ed10e08 --- /dev/null +++ b/script/mkgrub.sh @@ -0,0 +1,20 @@ +#!/bin/sh +STAGE1=/usr/lib/grub/i386-pc/stage1 +STAGE2=/usr/lib/grub/i386-pc/stage2 +FLOPPY=/var/tmp/floppy.image +rm /tmp/floppy.image +mformat -f 1440 -C a: + +mmd a:/boot a:/boot/grub + +mcopy $STAGE1 a:/boot/grub/ +mcopy $STAGE2 a:/boot/grub/ +cat < menu.lst +title Alma kernel (kernel.bin) on fd1 +root (fd1) +kernel (fd1)/kernel.bin +boot +EOF +mcopy menu.lst a:/boot/grub/menu.lst +rm -f menu.lst +mdir a:/boot/grub a: diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..e8f6483 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,67 @@ +ASM = nasm +LD = ld +RM = rm -f +GCC = gcc +CP = cp +MKDIR = mkdir -p +SED = sed +#ADA_INCLUDE = "/usr/lib/gcc/i486-slackware-linux/4.2.4/adainclude" +ADA_INCLUDE = `gnatls -v | grep -o "/.*/adainclude"` + + +main: + make clean + make ada_rtl + make gnat_lib + make boot.o + make kernel_entry.o + make kernel.bin + +ADA_RTL = system.ads interfac.ads ada.ads a-unccon.ads s-stalib.ad? \ + s-soflin.ad? unchconv.ads s-memory.ad? s-stache.ad? s-stoele.ad? \ + a-except.ad? s-traent.ads s-parame.ad? s-crtl.ads s-secsta.ad? \ + s-maccod.ads s-wchcon.ad? s-wchstw.ad? \ + s-traceb.ad? a-uncdea.ads s-unstyp.ads \ + a-elchha.ad? s-exctab.ad? unchdeal.ads s-htable.ad? \ + s-wchcnv.ad? s-wchjis.ad? s-purexc.ads + +ADA_RTL_SUB = a-exstat.adb a-exextr.adb a-exexpr.adb a-excpol.adb a-excach.adb \ + a-exexda.adb s-traent.adb + +GNAT_LIB = a-elchha + +ada_rtl: + $(MKDIR) adainclude adalib + $(foreach f,$(ADA_RTL),cp $(ADA_INCLUDE)/$f adainclude;) + $(foreach f,$(ADA_RTL_SUB),cp $(ADA_INCLUDE)/$f adainclude;) + $(foreach f,$(ADA_RTL),gnatmake -gnatA -D adalib -a adainclude/$f;) + +gnat_lib: + $(RM) ./adalib/a-elchha.o ./adalib/a-elchha.ali + $(foreach f,$(GNAT_LIB), \ + gnatmake -a -f -c -nostdinc -nostdlib -aI./adainclude -aL./adalib -D gnatlib gnatlib/$f;) + +boot.o: + gnatmake -c -Wall -O -nostdinc -nostdlib -aI./adainclude -aI../crtl -aO./adalib boot.adb + + +kernel_entry.o: + $(ASM) $(ASM_FLAGS) -f aout $*.asm + +kernel.bin: + make -C ../crtl + make -C ../dummy +ifeq ($(BUILD),elf) + $(SED) -i -e "s|^ *\(OUTPUT_FORMAT\).*|\1(\"elf32-i386\")|" link.ld + $(LD) -T link.ld -o kernel.bin kernel_entry.o boot.o \ + i386-text_console.o gnatlib/*.o ../lib/libdummy.so ../lib/libc.so +else + $(SED) -i -e "s|^ *\(OUTPUT_FORMAT\).*|\1(\"binary\")|" link.ld + $(LD) -T link.ld -o kernel.bin kernel_entry.o boot.o \ + i386-text_console.o gnatlib/*.o ../lib/libdummy.a ../lib/libc.a +endif + +clean: + $(RM) *.o *.ali *~ b~* *.s kernel.bin + $(RM) -r adainclude adalib + $(RM) gnatlib/*.ali gnatlib/*.o diff --git a/src/boot.adb b/src/boot.adb new file mode 100644 index 0000000..28af252 --- /dev/null +++ b/src/boot.adb @@ -0,0 +1,17 @@ +pragma No_Run_Time; + +with I386.Text_Console; + +procedure Boot is + +begin + I386.Text_Console.Cls; + I386.Text_Console.Put_Line ("booting the kernel!"); + for I in 1 .. 30 loop + for J in 1 .. 79 loop + I386.Text_Console.Put ('.'); + end loop; + I386.Text_Console.Put (Character'Val (I)); + end loop; + I386.Text_Console.Put_Line ("scrooling console test: done"); +end Boot; diff --git a/src/gnat.adc b/src/gnat.adc new file mode 100644 index 0000000..861c169 --- /dev/null +++ b/src/gnat.adc @@ -0,0 +1 @@ +pragma No_Run_Time; diff --git a/src/gnatlib/a-elchha.adb b/src/gnatlib/a-elchha.adb new file mode 100644 index 0000000..d66d311 --- /dev/null +++ b/src/gnatlib/a-elchha.adb @@ -0,0 +1,7 @@ +pragma Warnings (Off); +procedure Ada.Exceptions.Last_Chance_Handler + (Except : Exception_Occurrence) +is +begin + null; +end Ada.Exceptions.Last_Chance_Handler; diff --git a/src/gnatlib/a-elchha.ads b/src/gnatlib/a-elchha.ads new file mode 100644 index 0000000..66441ef --- /dev/null +++ b/src/gnatlib/a-elchha.ads @@ -0,0 +1,46 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT RUN-TIME COMPONENTS -- +-- -- +-- A D A . E X C E P T I O N S . L A S T _ C H A N C E _ H A N D L E R -- +-- -- +-- S p e c -- +-- -- +-- Copyright (C) 2003 Free Software Foundation, Inc. -- +-- -- +-- This specification is derived from the Ada Reference Manual for use with -- +-- GNAT. The copyright notice above, and the license provisions that follow -- +-- apply solely to the contents of the part following the private keyword. -- +-- -- +-- GNAT is free software; you can redistribute it and/or modify it under -- +-- terms of the GNU General Public License as published by the Free Soft- -- +-- ware Foundation; either version 2, or (at your option) any later ver- -- +-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- +-- OUT 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 distributed with GNAT; see file COPYING. If not, write -- +-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, -- +-- Boston, MA 02110-1301, USA. -- +-- -- +-- As a special exception, if other files instantiate generics from this -- +-- unit, or you link this unit with other files to produce an executable, -- +-- this unit does not by itself cause the resulting executable to be -- +-- covered by the GNU General Public License. This exception does not -- +-- however invalidate any other reasons why the executable file might be -- +-- covered by the GNU Public License. -- +-- -- +-- GNAT was originally developed by the GNAT team at New York University. -- +-- Extensive contributions were provided by Ada Core Technologies Inc. -- +-- -- +------------------------------------------------------------------------------ + +-- Last chance handler. Unhandled exceptions are passed to this +-- routine. + +procedure Ada.Exceptions.Last_Chance_Handler + (Except : Exception_Occurrence); +pragma Export (C, + Last_Chance_Handler, + "__gnat_last_chance_handler"); +-- pragma No_Return (Last_Chance_Handler); diff --git a/src/gnatlib/a-except.ads b/src/gnatlib/a-except.ads new file mode 100644 index 0000000..72dc72e --- /dev/null +++ b/src/gnatlib/a-except.ads @@ -0,0 +1,63 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT RUN-TIME COMPONENTS -- +-- -- +-- A D A . E X C E P T I O N S -- +-- -- +-- S p e c -- +-- -- +-- Copyright (C) 1992-2005, Free Software Foundation, Inc. -- +-- -- +-- This specification is derived from the Ada Reference Manual for use with -- +-- GNAT. The copyright notice above, and the license provisions that follow -- +-- apply solely to the contents of the part following the private keyword. -- +-- -- +-- GNAT is free software; you can redistribute it and/or modify it under -- +-- terms of the GNU General Public License as published by the Free Soft- -- +-- ware Foundation; either version 2, or (at your option) any later ver- -- +-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- +-- OUT 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 distributed with GNAT; see file COPYING. If not, write -- +-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, -- +-- Boston, MA 02110-1301, USA. -- +-- -- +-- As a special exception, if other files instantiate generics from this -- +-- unit, or you link this unit with other files to produce an executable, -- +-- this unit does not by itself cause the resulting executable to be -- +-- covered by the GNU General Public License. This exception does not -- +-- however invalidate any other reasons why the executable file might be -- +-- covered by the GNU Public License. -- +-- -- +-- GNAT was originally developed by the GNAT team at New York University. -- +-- Extensive contributions were provided by Ada Core Technologies Inc. -- +-- -- +------------------------------------------------------------------------------ + +-- This version is used for all Ada 2005 builds. It differs from a-except.ads +-- only with respect to the addition of Wide_[Wide]Exception_Name functions. +-- The additional entities are marked with pragma Ada_05, so this extended +-- unit is also perfectly suitable for use in Ada 95 or Ada 83 mode. + +-- The reason for this splitting off of a separate version is that bootstrap +-- compilers often will be used that do not support Ada 2005 features, and +-- Ada.Exceptions is part of the compiler sources. + +-- The base version of this unit Ada.Exceptions omits the Wide version of +-- Exception_Name and is used to build the compiler and other basic tools. + +pragma Polling (Off); +-- We must turn polling off for this unit, because otherwise we get +-- elaboration circularities with ourself. +with Interfaces; + +package Ada.Exceptions is + + -- In accordance with Ada 2005 AI-362. The warnings pragmas are so that we + -- can compile this using older compiler versions, which will ignore the + -- pragma, which is fine for the bootstrap. + + type Exception_Occurrence is new Interfaces.Unsigned_32; + +end Ada.Exceptions; diff --git a/src/i386-port_io.adb b/src/i386-port_io.adb new file mode 100644 index 0000000..3abb442 --- /dev/null +++ b/src/i386-port_io.adb @@ -0,0 +1,80 @@ +with System.Machine_Code; + +package body I386.Port_IO is + + function Get (Port : Port_Address) return Unsigned_8 + is + use System.Machine_Code; + Result : Unsigned_8 := 0; + begin + Asm ("inb %w1, %b0", + Inputs => Port_Address'Asm_Input ("d", Port), + Outputs => Unsigned_8'Asm_Output ("=a", Result), + Clobber => "", + Volatile => True); + return Result; + end Get; + + function Get (Port : Port_Address) return Unsigned_16 + is + use System.Machine_Code; + Result : Unsigned_16 := 0; + begin + Asm ("inw %w1, %w0", + Inputs => Port_Address'Asm_Input ("d", Port), + Outputs => Unsigned_16'Asm_Output ("=a", Result), + Clobber => "", + Volatile => True); + return Result; + end Get; + + function Get (Port : Port_Address) return Unsigned_32 + is + use System.Machine_Code; + Result : Unsigned_32 := 0; + begin + Asm ("inl %w1, %0", + Inputs => Port_Address'Asm_Input ("d", Port), + Outputs => Unsigned_32'Asm_Output ("=a", Result), + Clobber => "", + Volatile => True); + return Result; + end Get; + + procedure Put (Port : Port_Address; Data : Unsigned_8) + is + use System.Machine_Code; + begin + Asm ("outb %b0, %w1", + Inputs => (Unsigned_8'Asm_Input ("a", Data), + Port_Address'Asm_Input ("d", Port) + ), + Clobber => "", + Volatile => True); + end Put; + + procedure Put (Port : Port_Address; Data : Unsigned_16) + is + use System.Machine_Code; + begin + Asm ("outw %w0, %w1", + Inputs => (Unsigned_16'Asm_Input ("a", Data), + Port_Address'Asm_Input ("d", Port) + ), + Clobber => "", + Volatile => True); + end Put; + + procedure Put (Port : Port_Address; Data : Unsigned_32) + is + use System.Machine_Code; + begin + Asm ("outl %0, %w1", + Inputs => (Unsigned_32'Asm_Input ("a", Data), + Port_Address'Asm_Input ("d", Port) + ), + Clobber => "", + Volatile => True); + end Put; + +end I386.Port_IO; diff --git a/src/i386-port_io.ads b/src/i386-port_io.ads new file mode 100644 index 0000000..38cdc4b --- /dev/null +++ b/src/i386-port_io.ads @@ -0,0 +1,23 @@ +package I386.Port_IO is + + type Port_Address is new Unsigned_32; + + function Get (Port : Port_Address) return Unsigned_8; + pragma Inline (Get); + + function Get (Port : Port_Address) return Unsigned_16; + pragma Inline (Get); + + function Get (Port : Port_Address) return Unsigned_32; + pragma Inline (Get); + + procedure Put (Port : Port_Address; Data : Unsigned_8); + pragma Inline (Put); + + procedure Put (Port : Port_Address; Data : Unsigned_16); + pragma Inline (Put); + + procedure Put (Port : Port_Address; Data : Unsigned_32); + pragma Inline (Put); + +end I386.Port_IO; diff --git a/src/i386-text_console.adb b/src/i386-text_console.adb new file mode 100644 index 0000000..1f03f07 --- /dev/null +++ b/src/i386-text_console.adb @@ -0,0 +1,71 @@ +pragma No_Run_Time; +package body I386.Text_Console is + + Current_Line : console_Index := 1; + Current_Column : Console_Index := 1; + + procedure Put (C : Character) + is + Text_Video : Text_Buffer; + for Text_Video'Address use To_Address (Unsigned_32 (Video_Base_Address)); + L : Line_Index := Max_Line; + begin + if Current_Column > Max_Column then + Current_Column := 1; + Current_Line := Current_Line + 1; + end if; + if Current_Line > Max_Line then + for I in 1 .. Max_Line - 1 loop +-- for J in 1 .. Max_Column loop +-- Text_Video (I)(J) := Text_Video (I + 1)(J); +-- end loop; + Text_Video (I) := Text_Video (I + 1); + end loop; +-- for I in 1 .. Max_Column loop +-- Text_Video (Max_Line)(I).Text := Character'Pos (Ascii.NUL); +-- end loop; + Text_Video (Max_Line) := (others => Blank_Text_Element); + Current_Line := 25; + end if; + Text_Video (Current_Line)(Current_Column).Text := Character'Pos (C); + Current_Column := Current_Column + 1; + end Put; + + procedure Put (S : String) + is + begin + for I in S'Range loop + Put (S (I)); + end loop; + end Put; + + procedure Cls + is + Text_Video : Text_Buffer; + for Text_Video'Address use To_Address (Unsigned_32 (Video_Base_Address)); + begin +-- for I in Line_Index'Range loop +-- for J in Column_Index'Range loop +-- Text_Video (I)(J).Text := Character'Pos (Ascii.NUL); +-- end loop; +-- end loop; + Text_Video := (others => (others => Blank_Text_Element)); + Current_Line := 1; + Current_Column := 1; + end Cls; + + procedure New_Line + is + begin + Current_Line := Current_Line + 1; + Current_Column := 1; + end New_Line; + + procedure Put_Line (S : String) + is + begin + Put (S); + New_Line; + end Put_Line; + +end I386.Text_Console; diff --git a/src/i386-text_console.ads b/src/i386-text_console.ads new file mode 100644 index 0000000..0255e25 --- /dev/null +++ b/src/i386-text_console.ads @@ -0,0 +1,54 @@ +with I386.Port_IO; + +package I386.Text_Console is + + procedure Put (C : Character); + + procedure Put (S : String); + + procedure Cls; + + procedure New_Line; + + procedure Put_Line (S : String); + +private + + type Console_Index is new Unsigned_32; + for Console_Index'Size use 32; + + Max_Line : constant Console_Index := 25; + Max_Column : constant Console_Index := 80; + + subtype Line_Index is Console_Index range 1 .. Max_Line; + subtype Column_Index is Console_Index range 1 .. Max_Column; + + Video_Base_Address : constant I386.Port_IO.Port_Address := 16#B8000#; + + type Unsigned_4 is new Unsigned_8 range 0 .. 15; + for Unsigned_4'Size use 4; + + type Text_Attribute is + record + F_Color : Unsigned_4; + B_Color : Unsigned_4; + end record; + for Text_Attribute'Size use 8; + pragma Pack (Text_Attribute); + + type Text_Element is + record + Text : Unsigned_8; + Attribute : Text_Attribute := (15, 0); + end record; + for Text_Element'Size use 16; + + type Text_Line_Buffer is array (Column_Index) of Text_Element; + + type Text_Buffer is array (Line_Index) of Text_Line_Buffer; + for Text_Buffer'Size use 32000; + + Blank_Text_Element : constant Text_Element := + (Character'Pos (Ascii.NUL), (15, 0)); + +end I386.Text_Console; diff --git a/src/i386.ads b/src/i386.ads new file mode 100644 index 0000000..2245063 --- /dev/null +++ b/src/i386.ads @@ -0,0 +1,16 @@ +with Interfaces; use Interfaces; +with Ada.Unchecked_Conversion; +with System; + +package I386 is + + pragma Pure; + + subtype Unsigned_8 is Interfaces.Unsigned_8; + subtype Unsigned_16 is Interfaces.Unsigned_16; + subtype Unsigned_32 is Interfaces.Unsigned_32; + + function To_Address is new Ada.Unchecked_Conversion + (Unsigned_32, System.Address); + +end I386; diff --git a/src/kernel_entry.asm b/src/kernel_entry.asm new file mode 100644 index 0000000..2abd645 --- /dev/null +++ b/src/kernel_entry.asm @@ -0,0 +1,60 @@ +; This is the kernel's entry point. We could either call main here, +; or we can use this to setup the stack or other nice stuff, like +; perhaps setting up the GDT and segments. Please note that interrupts +; are disabled at this point: More on interrupts later! +[BITS 32] +global start +start: + mov esp, _sys_stack ; This points the stack to our new stack area + jmp stublet + +; This part MUST be 4byte aligned, so we solve that issue using 'ALIGN 4' +ALIGN 4 +mboot: + ; Multiboot macros to make a few lines later more readable + MULTIBOOT_PAGE_ALIGN equ 1<<0 + MULTIBOOT_MEMORY_INFO equ 1<<1 + MULTIBOOT_AOUT_KLUDGE equ 1<<16 + MULTIBOOT_HEADER_MAGIC equ 0x1BADB002 + MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE + MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) + EXTERN code, bss, end + + ; This is the GRUB Multiboot header. A boot signature + dd MULTIBOOT_HEADER_MAGIC + dd MULTIBOOT_HEADER_FLAGS + dd MULTIBOOT_CHECKSUM + + ; AOUT kludge - must be physical addresses. Make a note of these: + ; The linker script fills in the data for these ones! + dd mboot + dd code + dd bss + dd end + dd start + +; This is an endless loop here. Make a note of this: Later on, we +; will insert an 'extern _main', followed by 'call _main', right +; before the 'jmp $'. +stublet: + extern _ada_boot; + call _ada_boot; + jmp $ + + +; Shortly we will add code for loading the GDT right here! + + +; In just a few pages in this tutorial, we will add our Interrupt +; Service Routines (ISRs) right here! + + + +; Here is the definition of our BSS section. Right now, we'll use +; it just to store the stack. Remember that a stack actually grows +; downwards, so we declare the size of the data before declaring +; the identifier '_sys_stack' +SECTION .bss + resb 8192 ; This reserves 8KBytes of memory here +_sys_stack: + diff --git a/src/link.ld b/src/link.ld new file mode 100644 index 0000000..e471ec0 --- /dev/null +++ b/src/link.ld @@ -0,0 +1,25 @@ +OUTPUT_FORMAT("binary") +ENTRY(start) +phys = 0x00100000; +SECTIONS +{ + .text phys : AT(phys) { + code = .; + *(.text) + *(.rodata) + . = ALIGN(4096); + } + .data : AT(phys + (data - code)) + { + data = .; + *(.data) + . = ALIGN(4096); + } + .bss : AT(phys + (bss - code)) + { + bss = .; + *(.bss) + . = ALIGN(4096); + } + end = .; +} -- 2.11.4.GIT