mirror of
https://github.com/pixelyblah/florid-os.git
synced 2026-05-15 03:36:07 +00:00
Add files via upload
This commit is contained in:
parent
93568b833d
commit
14e09f5034
41 changed files with 5514 additions and 0 deletions
BIN
FloridOS/Fflorid.iso
Normal file
BIN
FloridOS/Fflorid.iso
Normal file
Binary file not shown.
40
FloridOS/Makefile
Normal file
40
FloridOS/Makefile
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
CC = gcc
|
||||||
|
LD = ld
|
||||||
|
CFLAGS = -Wall -Wextra -std=c11 -ffreestanding -fno-stack-protector -fno-stack-check -fno-lto -fPIE -m64 -march=x86-64 -Isrc
|
||||||
|
LDFLAGS = -T linker.ld -static -nostdlib -no-pie -z max-page-size=0x1000
|
||||||
|
|
||||||
|
# Explicitly define the objects
|
||||||
|
OBJS = build/kernel.o build/drivers/tty.o build/drivers/keyboard.o
|
||||||
|
|
||||||
|
all: Fflorid.iso
|
||||||
|
|
||||||
|
# Rule to make the build directories
|
||||||
|
build_dirs:
|
||||||
|
mkdir -p build/drivers build/shell
|
||||||
|
|
||||||
|
# Rule to compile C files
|
||||||
|
build/%.o: src/%.c | build_dirs
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
# THE MISSING RULE: Link the kernel
|
||||||
|
build/kernel.bin: $(OBJS)
|
||||||
|
$(LD) $(LDFLAGS) $(OBJS) -o build/kernel.bin
|
||||||
|
|
||||||
|
# Build the ISO
|
||||||
|
Fflorid.iso: build/kernel.bin
|
||||||
|
rm -rf iso_root
|
||||||
|
mkdir -p iso_root
|
||||||
|
cp build/kernel.bin iso_root/kernel
|
||||||
|
cp limine.cfg iso_root/limine.cfg
|
||||||
|
cp limine/limine-bios.sys iso_root/limine-bios.sys
|
||||||
|
cp limine/limine-bios-cd.bin iso_root/limine-bios-cd.bin
|
||||||
|
xorriso -as mkisofs -b limine-bios-cd.bin \
|
||||||
|
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||||
|
iso_root -o Fflorid.iso
|
||||||
|
./limine/limine bios-install Fflorid.iso
|
||||||
|
|
||||||
|
run: Fflorid.iso
|
||||||
|
qemu-system-x86_64 -cdrom Fflorid.iso
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf build iso_root Fflorid.iso
|
||||||
BIN
FloridOS/build/drivers/keyboard.o
Normal file
BIN
FloridOS/build/drivers/keyboard.o
Normal file
Binary file not shown.
BIN
FloridOS/build/drivers/tty.o
Normal file
BIN
FloridOS/build/drivers/tty.o
Normal file
Binary file not shown.
BIN
FloridOS/build/kernel.bin
Normal file
BIN
FloridOS/build/kernel.bin
Normal file
Binary file not shown.
BIN
FloridOS/build/kernel.o
Normal file
BIN
FloridOS/build/kernel.o
Normal file
Binary file not shown.
BIN
FloridOS/iso_root/kernel
Normal file
BIN
FloridOS/iso_root/kernel
Normal file
Binary file not shown.
BIN
FloridOS/iso_root/limine-bios-cd.bin
Normal file
BIN
FloridOS/iso_root/limine-bios-cd.bin
Normal file
Binary file not shown.
BIN
FloridOS/iso_root/limine-bios.sys
Normal file
BIN
FloridOS/iso_root/limine-bios.sys
Normal file
Binary file not shown.
5
FloridOS/iso_root/limine.cfg
Normal file
5
FloridOS/iso_root/limine.cfg
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
TIMEOUT=3
|
||||||
|
|
||||||
|
:Florid OS
|
||||||
|
PROTOCOL=limine
|
||||||
|
KERNEL_PATH=boot:///kernel
|
||||||
5
FloridOS/limine.cfg
Normal file
5
FloridOS/limine.cfg
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
TIMEOUT=3
|
||||||
|
|
||||||
|
:Florid OS
|
||||||
|
PROTOCOL=limine
|
||||||
|
KERNEL_PATH=boot:///kernel
|
||||||
BIN
FloridOS/limine/BOOTAA64.EFI
Normal file
BIN
FloridOS/limine/BOOTAA64.EFI
Normal file
Binary file not shown.
BIN
FloridOS/limine/BOOTIA32.EFI
Normal file
BIN
FloridOS/limine/BOOTIA32.EFI
Normal file
Binary file not shown.
BIN
FloridOS/limine/BOOTRISCV64.EFI
Normal file
BIN
FloridOS/limine/BOOTRISCV64.EFI
Normal file
Binary file not shown.
BIN
FloridOS/limine/BOOTX64.EFI
Normal file
BIN
FloridOS/limine/BOOTX64.EFI
Normal file
Binary file not shown.
22
FloridOS/limine/LICENSE
Normal file
22
FloridOS/limine/LICENSE
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
Copyright (C) 2019-2024 mintsuki and contributors.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
38
FloridOS/limine/Makefile
Normal file
38
FloridOS/limine/Makefile
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
CC ?= cc
|
||||||
|
STRIP ?= strip
|
||||||
|
INSTALL ?= ./install-sh
|
||||||
|
|
||||||
|
PREFIX ?= /usr/local
|
||||||
|
|
||||||
|
CFLAGS ?= -g -O2 -pipe
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: limine
|
||||||
|
|
||||||
|
.PHONY: install
|
||||||
|
install: all
|
||||||
|
$(INSTALL) -d '$(DESTDIR)$(PREFIX)/share'
|
||||||
|
$(INSTALL) -d '$(DESTDIR)$(PREFIX)/share/limine'
|
||||||
|
$(INSTALL) -m 644 limine-bios.sys '$(DESTDIR)$(PREFIX)/share/limine/'
|
||||||
|
$(INSTALL) -m 644 limine-bios-cd.bin '$(DESTDIR)$(PREFIX)/share/limine/'
|
||||||
|
$(INSTALL) -m 644 limine-uefi-cd.bin '$(DESTDIR)$(PREFIX)/share/limine/'
|
||||||
|
$(INSTALL) -m 644 limine-bios-pxe.bin '$(DESTDIR)$(PREFIX)/share/limine/'
|
||||||
|
$(INSTALL) -m 644 BOOTX64.EFI '$(DESTDIR)$(PREFIX)/share/limine/'
|
||||||
|
$(INSTALL) -m 644 BOOTIA32.EFI '$(DESTDIR)$(PREFIX)/share/limine/'
|
||||||
|
$(INSTALL) -m 644 BOOTAA64.EFI '$(DESTDIR)$(PREFIX)/share/limine/'
|
||||||
|
$(INSTALL) -m 644 BOOTRISCV64.EFI '$(DESTDIR)$(PREFIX)/share/limine/'
|
||||||
|
$(INSTALL) -d '$(DESTDIR)$(PREFIX)/include'
|
||||||
|
$(INSTALL) -m 644 limine.h '$(DESTDIR)$(PREFIX)/include/'
|
||||||
|
$(INSTALL) -d '$(DESTDIR)$(PREFIX)/bin'
|
||||||
|
$(INSTALL) limine '$(DESTDIR)$(PREFIX)/bin/'
|
||||||
|
|
||||||
|
.PHONY: install-strip
|
||||||
|
install-strip: install
|
||||||
|
$(STRIP) '$(DESTDIR)$(PREFIX)/bin/limine'
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -f limine limine.exe
|
||||||
|
|
||||||
|
limine: limine.c
|
||||||
|
$(CC) $(CFLAGS) -Wall -Wextra $(WERROR_FLAG) $(CPPFLAGS) $(LDFLAGS) -std=c99 limine.c $(LIBS) -o $@
|
||||||
541
FloridOS/limine/install-sh
Normal file
541
FloridOS/limine/install-sh
Normal file
|
|
@ -0,0 +1,541 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
|
scriptversion=2023-11-23.18; # UTC
|
||||||
|
|
||||||
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
|
# following copyright and license.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1994 X Consortium
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to
|
||||||
|
# deal in the Software without restriction, including without limitation the
|
||||||
|
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
# sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||||
|
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# Except as contained in this notice, the name of the X Consortium shall not
|
||||||
|
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||||
|
# ings in this Software without prior written authorization from the X Consor-
|
||||||
|
# tium.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# FSF changes to this file are in the public domain.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# 'make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch.
|
||||||
|
|
||||||
|
tab=' '
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
IFS=" $tab$nl"
|
||||||
|
|
||||||
|
# Set DOITPROG to "echo" to test this script.
|
||||||
|
|
||||||
|
doit=${DOITPROG-}
|
||||||
|
doit_exec=${doit:-exec}
|
||||||
|
|
||||||
|
# Put in absolute file names if you don't have them in your path;
|
||||||
|
# or use environment vars.
|
||||||
|
|
||||||
|
chgrpprog=${CHGRPPROG-chgrp}
|
||||||
|
chmodprog=${CHMODPROG-chmod}
|
||||||
|
chownprog=${CHOWNPROG-chown}
|
||||||
|
cmpprog=${CMPPROG-cmp}
|
||||||
|
cpprog=${CPPROG-cp}
|
||||||
|
mkdirprog=${MKDIRPROG-mkdir}
|
||||||
|
mvprog=${MVPROG-mv}
|
||||||
|
rmprog=${RMPROG-rm}
|
||||||
|
stripprog=${STRIPPROG-strip}
|
||||||
|
|
||||||
|
posix_mkdir=
|
||||||
|
|
||||||
|
# Desired mode of installed file.
|
||||||
|
mode=0755
|
||||||
|
|
||||||
|
# Create dirs (including intermediate dirs) using mode 755.
|
||||||
|
# This is like GNU 'install' as of coreutils 8.32 (2020).
|
||||||
|
mkdir_umask=22
|
||||||
|
|
||||||
|
backupsuffix=
|
||||||
|
chgrpcmd=
|
||||||
|
chmodcmd=$chmodprog
|
||||||
|
chowncmd=
|
||||||
|
mvcmd=$mvprog
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
stripcmd=
|
||||||
|
|
||||||
|
src=
|
||||||
|
dst=
|
||||||
|
dir_arg=
|
||||||
|
dst_arg=
|
||||||
|
|
||||||
|
copy_on_change=false
|
||||||
|
is_target_a_directory=possibly
|
||||||
|
|
||||||
|
usage="\
|
||||||
|
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||||
|
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||||
|
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||||
|
or: $0 [OPTION]... -d DIRECTORIES...
|
||||||
|
|
||||||
|
In the 1st form, copy SRCFILE to DSTFILE.
|
||||||
|
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||||
|
In the 4th, create DIRECTORIES.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--help display this help and exit.
|
||||||
|
--version display version info and exit.
|
||||||
|
|
||||||
|
-c (ignored)
|
||||||
|
-C install only if different (preserve data modification time)
|
||||||
|
-d create directories instead of installing files.
|
||||||
|
-g GROUP $chgrpprog installed files to GROUP.
|
||||||
|
-m MODE $chmodprog installed files to MODE.
|
||||||
|
-o USER $chownprog installed files to USER.
|
||||||
|
-p pass -p to $cpprog.
|
||||||
|
-s $stripprog installed files.
|
||||||
|
-S SUFFIX attempt to back up existing files, with suffix SUFFIX.
|
||||||
|
-t DIRECTORY install into DIRECTORY.
|
||||||
|
-T report an error if DSTFILE is a directory.
|
||||||
|
|
||||||
|
Environment variables override the default commands:
|
||||||
|
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||||
|
RMPROG STRIPPROG
|
||||||
|
|
||||||
|
By default, rm is invoked with -f; when overridden with RMPROG,
|
||||||
|
it's up to you to specify -f if you want it.
|
||||||
|
|
||||||
|
If -S is not specified, no backups are attempted.
|
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>.
|
||||||
|
GNU Automake home page: <https://www.gnu.org/software/automake/>.
|
||||||
|
General help using GNU software: <https://www.gnu.org/gethelp/>."
|
||||||
|
|
||||||
|
while test $# -ne 0; do
|
||||||
|
case $1 in
|
||||||
|
-c) ;;
|
||||||
|
|
||||||
|
-C) copy_on_change=true;;
|
||||||
|
|
||||||
|
-d) dir_arg=true;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
--help) echo "$usage"; exit $?;;
|
||||||
|
|
||||||
|
-m) mode=$2
|
||||||
|
case $mode in
|
||||||
|
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
||||||
|
echo "$0: invalid mode: $mode" >&2
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-p) cpprog="$cpprog -p";;
|
||||||
|
|
||||||
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
|
-S) backupsuffix="$2"
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-t)
|
||||||
|
is_target_a_directory=always
|
||||||
|
dst_arg=$2
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
shift;;
|
||||||
|
|
||||||
|
-T) is_target_a_directory=never;;
|
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
|
--) shift
|
||||||
|
break;;
|
||||||
|
|
||||||
|
-*) echo "$0: invalid option: $1" >&2
|
||||||
|
exit 1;;
|
||||||
|
|
||||||
|
*) break;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# We allow the use of options -d and -T together, by making -d
|
||||||
|
# take the precedence; this is for compatibility with GNU install.
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
echo "$0: target directory not allowed when installing a directory." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
|
# When -d is used, all remaining arguments are directories to create.
|
||||||
|
# When -t is used, the destination is already specified.
|
||||||
|
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||||
|
for arg
|
||||||
|
do
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
# $@ is not empty: it contains at least $arg.
|
||||||
|
set fnord "$@" "$dst_arg"
|
||||||
|
shift # fnord
|
||||||
|
fi
|
||||||
|
shift # arg
|
||||||
|
dst_arg=$arg
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $dst_arg in
|
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test $# -eq 0; then
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
echo "$0: no input file specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# It's OK to call 'install-sh -d' without argument.
|
||||||
|
# This can happen when creating conditional directories.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
if test $# -gt 1 || test "$is_target_a_directory" = always; then
|
||||||
|
if test ! -d "$dst_arg"; then
|
||||||
|
echo "$0: $dst_arg: Is not a directory." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
do_exit='(exit $ret); exit $ret'
|
||||||
|
trap "ret=129; $do_exit" 1
|
||||||
|
trap "ret=130; $do_exit" 2
|
||||||
|
trap "ret=141; $do_exit" 13
|
||||||
|
trap "ret=143; $do_exit" 15
|
||||||
|
|
||||||
|
# Set umask so as not to create temps with too-generous modes.
|
||||||
|
# However, 'strip' requires both read and write access to temps.
|
||||||
|
case $mode in
|
||||||
|
# Optimize common cases.
|
||||||
|
*644) cp_umask=133;;
|
||||||
|
*755) cp_umask=22;;
|
||||||
|
|
||||||
|
*[0-7])
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw='% 200'
|
||||||
|
fi
|
||||||
|
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||||
|
*)
|
||||||
|
if test -z "$stripcmd"; then
|
||||||
|
u_plus_rw=
|
||||||
|
else
|
||||||
|
u_plus_rw=,u+rw
|
||||||
|
fi
|
||||||
|
cp_umask=$mode$u_plus_rw;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
for src
|
||||||
|
do
|
||||||
|
# Protect names problematic for 'test' and other utilities.
|
||||||
|
case $src in
|
||||||
|
-* | [=\(\)!]) src=./$src;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
dst=$src
|
||||||
|
dstdir=$dst
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
# Don't chown directories that already exist.
|
||||||
|
if test $dstdir_status = 0; then
|
||||||
|
chowncmd=""
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
if test ! -f "$src" && test ! -d "$src"; then
|
||||||
|
echo "$0: $src does not exist." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$dst_arg"; then
|
||||||
|
echo "$0: no destination specified." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dst=$dst_arg
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename.
|
||||||
|
if test -d "$dst"; then
|
||||||
|
if test "$is_target_a_directory" = never; then
|
||||||
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
dstdir=$dst
|
||||||
|
dstbase=`basename "$src"`
|
||||||
|
case $dst in
|
||||||
|
*/) dst=$dst$dstbase;;
|
||||||
|
*) dst=$dst/$dstbase;;
|
||||||
|
esac
|
||||||
|
dstdir_status=0
|
||||||
|
else
|
||||||
|
dstdir=`dirname "$dst"`
|
||||||
|
test -d "$dstdir"
|
||||||
|
dstdir_status=$?
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
*/) dstdirslash=$dstdir;;
|
||||||
|
*) dstdirslash=$dstdir/;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
obsolete_mkdir_used=false
|
||||||
|
|
||||||
|
if test $dstdir_status != 0; then
|
||||||
|
case $posix_mkdir in
|
||||||
|
'')
|
||||||
|
# With -d, create the new directory with the user-specified mode.
|
||||||
|
# Otherwise, rely on $mkdir_umask.
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
mkdir_mode=-m$mode
|
||||||
|
else
|
||||||
|
mkdir_mode=
|
||||||
|
fi
|
||||||
|
|
||||||
|
posix_mkdir=false
|
||||||
|
# The $RANDOM variable is not portable (e.g., dash). Use it
|
||||||
|
# here however when possible just to lower collision chance.
|
||||||
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||||
|
|
||||||
|
trap '
|
||||||
|
ret=$?
|
||||||
|
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
|
||||||
|
exit $ret
|
||||||
|
' 0
|
||||||
|
|
||||||
|
# Because "mkdir -p" follows existing symlinks and we likely work
|
||||||
|
# directly in world-writeable /tmp, make sure that the '$tmpdir'
|
||||||
|
# directory is successfully created first before we actually test
|
||||||
|
# 'mkdir -p'.
|
||||||
|
if (umask $mkdir_umask &&
|
||||||
|
$mkdirprog $mkdir_mode "$tmpdir" &&
|
||||||
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
if test -z "$dir_arg" || {
|
||||||
|
# Check for POSIX incompatibilities with -m.
|
||||||
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||||
|
# other-writable bit of parent directory when it shouldn't.
|
||||||
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||||
|
test_tmpdir="$tmpdir/a"
|
||||||
|
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
|
||||||
|
case $ls_ld_tmpdir in
|
||||||
|
d????-?r-*) different_mode=700;;
|
||||||
|
d????-?--*) different_mode=755;;
|
||||||
|
*) false;;
|
||||||
|
esac &&
|
||||||
|
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
|
||||||
|
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
|
||||||
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
then posix_mkdir=:
|
||||||
|
fi
|
||||||
|
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
|
||||||
|
else
|
||||||
|
# Remove any dirs left behind by ancient mkdir implementations.
|
||||||
|
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
|
||||||
|
fi
|
||||||
|
trap '' 0;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if
|
||||||
|
$posix_mkdir && (
|
||||||
|
umask $mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||||
|
)
|
||||||
|
then :
|
||||||
|
else
|
||||||
|
|
||||||
|
# mkdir does not conform to POSIX,
|
||||||
|
# or it failed possibly due to a race condition. Create the
|
||||||
|
# directory the slow way, step by step, checking for races as we go.
|
||||||
|
|
||||||
|
case $dstdir in
|
||||||
|
/*) prefix='/';;
|
||||||
|
[-=\(\)!]*) prefix='./';;
|
||||||
|
*) prefix='';;
|
||||||
|
esac
|
||||||
|
|
||||||
|
oIFS=$IFS
|
||||||
|
IFS=/
|
||||||
|
set -f
|
||||||
|
set fnord $dstdir
|
||||||
|
shift
|
||||||
|
set +f
|
||||||
|
IFS=$oIFS
|
||||||
|
|
||||||
|
prefixes=
|
||||||
|
|
||||||
|
for d
|
||||||
|
do
|
||||||
|
test X"$d" = X && continue
|
||||||
|
|
||||||
|
prefix=$prefix$d
|
||||||
|
if test -d "$prefix"; then
|
||||||
|
prefixes=
|
||||||
|
else
|
||||||
|
if $posix_mkdir; then
|
||||||
|
(umask $mkdir_umask &&
|
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
test -d "$prefix" || exit 1
|
||||||
|
else
|
||||||
|
case $prefix in
|
||||||
|
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||||
|
*) qprefix=$prefix;;
|
||||||
|
esac
|
||||||
|
prefixes="$prefixes '$qprefix'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
prefix=$prefix/
|
||||||
|
done
|
||||||
|
|
||||||
|
if test -n "$prefixes"; then
|
||||||
|
# Don't fail if two instances are running concurrently.
|
||||||
|
(umask $mkdir_umask &&
|
||||||
|
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||||
|
test -d "$dstdir" || exit 1
|
||||||
|
obsolete_mkdir_used=true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||||
|
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||||
|
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||||
|
else
|
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory.
|
||||||
|
dsttmp=${dstdirslash}_inst.$$_
|
||||||
|
rmtmp=${dstdirslash}_rm.$$_
|
||||||
|
|
||||||
|
# Trap to clean up those temp files at exit.
|
||||||
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||||
|
|
||||||
|
# Copy the file name to the temp name.
|
||||||
|
(umask $cp_umask &&
|
||||||
|
{ test -z "$stripcmd" || {
|
||||||
|
# Create $dsttmp read-write so that cp doesn't create it read-only,
|
||||||
|
# which would cause strip to fail.
|
||||||
|
if test -z "$doit"; then
|
||||||
|
: >"$dsttmp" # No need to fork-exec 'touch'.
|
||||||
|
else
|
||||||
|
$doit touch "$dsttmp"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
} &&
|
||||||
|
$doit_exec $cpprog "$src" "$dsttmp") &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits.
|
||||||
|
#
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||||
|
#
|
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||||
|
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||||
|
|
||||||
|
# If -C, don't bother to copy if it wouldn't change the file.
|
||||||
|
if $copy_on_change &&
|
||||||
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||||
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||||
|
set -f &&
|
||||||
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
|
set +f &&
|
||||||
|
test "$old" = "$new" &&
|
||||||
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
rm -f "$dsttmp"
|
||||||
|
else
|
||||||
|
# If $backupsuffix is set, and the file being installed
|
||||||
|
# already exists, attempt a backup. Don't worry if it fails,
|
||||||
|
# e.g., if mv doesn't support -f.
|
||||||
|
if test -n "$backupsuffix" && test -f "$dst"; then
|
||||||
|
$doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Rename the file to the real destination.
|
||||||
|
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||||
|
|
||||||
|
# The rename failed, perhaps because mv can't rename something else
|
||||||
|
# to itself, or perhaps because mv is so ancient that it does not
|
||||||
|
# support -f.
|
||||||
|
{
|
||||||
|
# Now remove or move aside any old file at destination location.
|
||||||
|
# We try this two ways since rm can't unlink itself on some
|
||||||
|
# systems and the destination file might be busy for other
|
||||||
|
# reasons. In this case, the final cleanup might fail but the new
|
||||||
|
# file should still install successfully.
|
||||||
|
{
|
||||||
|
test ! -f "$dst" ||
|
||||||
|
$doit $rmcmd "$dst" 2>/dev/null ||
|
||||||
|
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||||
|
{ $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
|
||||||
|
} ||
|
||||||
|
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||||
|
(exit 1); exit 1
|
||||||
|
}
|
||||||
|
} &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
$doit $mvcmd "$dsttmp" "$dst"
|
||||||
|
}
|
||||||
|
fi || exit 1
|
||||||
|
|
||||||
|
trap '' 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Local variables:
|
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC0"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
BIN
FloridOS/limine/limine
Normal file
BIN
FloridOS/limine/limine
Normal file
Binary file not shown.
BIN
FloridOS/limine/limine-bios-cd.bin
Normal file
BIN
FloridOS/limine/limine-bios-cd.bin
Normal file
Binary file not shown.
1341
FloridOS/limine/limine-bios-hdd.h
Normal file
1341
FloridOS/limine/limine-bios-hdd.h
Normal file
File diff suppressed because it is too large
Load diff
BIN
FloridOS/limine/limine-bios-pxe.bin
Normal file
BIN
FloridOS/limine/limine-bios-pxe.bin
Normal file
Binary file not shown.
BIN
FloridOS/limine/limine-bios.sys
Normal file
BIN
FloridOS/limine/limine-bios.sys
Normal file
Binary file not shown.
BIN
FloridOS/limine/limine-uefi-cd.bin
Normal file
BIN
FloridOS/limine/limine-uefi-cd.bin
Normal file
Binary file not shown.
1290
FloridOS/limine/limine.c
Normal file
1290
FloridOS/limine/limine.c
Normal file
File diff suppressed because it is too large
Load diff
BIN
FloridOS/limine/limine.exe
Normal file
BIN
FloridOS/limine/limine.exe
Normal file
Binary file not shown.
609
FloridOS/limine/limine.h
Normal file
609
FloridOS/limine/limine.h
Normal file
|
|
@ -0,0 +1,609 @@
|
||||||
|
/* BSD Zero Clause License */
|
||||||
|
|
||||||
|
/* Copyright (C) 2022-2024 mintsuki and contributors.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIMINE_H
|
||||||
|
#define LIMINE_H 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Misc */
|
||||||
|
|
||||||
|
#ifdef LIMINE_NO_POINTERS
|
||||||
|
# define LIMINE_PTR(TYPE) uint64_t
|
||||||
|
#else
|
||||||
|
# define LIMINE_PTR(TYPE) TYPE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define LIMINE_DEPRECATED __attribute__((__deprecated__))
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_START \
|
||||||
|
_Pragma("GCC diagnostic push") \
|
||||||
|
_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_END \
|
||||||
|
_Pragma("GCC diagnostic pop")
|
||||||
|
#else
|
||||||
|
# define LIMINE_DEPRECATED
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_START
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_END
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LIMINE_REQUESTS_START_MARKER \
|
||||||
|
uint64_t limine_requests_start_marker[4] = { 0xf6b8f4b39de7d1ae, 0xfab91a6940fcb9cf, \
|
||||||
|
0x785c6ed015d3e316, 0x181e920a7852b9d9 };
|
||||||
|
#define LIMINE_REQUESTS_END_MARKER \
|
||||||
|
uint64_t limine_requests_end_marker[2] = { 0xadc0e0531bb10d03, 0x9572709f31764c62 };
|
||||||
|
|
||||||
|
#define LIMINE_REQUESTS_DELIMITER LIMINE_REQUESTS_END_MARKER
|
||||||
|
|
||||||
|
#define LIMINE_BASE_REVISION(N) \
|
||||||
|
uint64_t limine_base_revision[3] = { 0xf9562b2d5c95a6c8, 0x6a7b384944536bdc, (N) };
|
||||||
|
|
||||||
|
#define LIMINE_BASE_REVISION_SUPPORTED (limine_base_revision[2] == 0)
|
||||||
|
|
||||||
|
#define LIMINE_COMMON_MAGIC 0xc7b1dd30df4c8b88, 0x0a82e883a194f07b
|
||||||
|
|
||||||
|
struct limine_uuid {
|
||||||
|
uint32_t a;
|
||||||
|
uint16_t b;
|
||||||
|
uint16_t c;
|
||||||
|
uint8_t d[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LIMINE_MEDIA_TYPE_GENERIC 0
|
||||||
|
#define LIMINE_MEDIA_TYPE_OPTICAL 1
|
||||||
|
#define LIMINE_MEDIA_TYPE_TFTP 2
|
||||||
|
|
||||||
|
struct limine_file {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
uint64_t size;
|
||||||
|
LIMINE_PTR(char *) path;
|
||||||
|
LIMINE_PTR(char *) cmdline;
|
||||||
|
uint32_t media_type;
|
||||||
|
uint32_t unused;
|
||||||
|
uint32_t tftp_ip;
|
||||||
|
uint32_t tftp_port;
|
||||||
|
uint32_t partition_index;
|
||||||
|
uint32_t mbr_disk_id;
|
||||||
|
struct limine_uuid gpt_disk_uuid;
|
||||||
|
struct limine_uuid gpt_part_uuid;
|
||||||
|
struct limine_uuid part_uuid;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Boot info */
|
||||||
|
|
||||||
|
#define LIMINE_BOOTLOADER_INFO_REQUEST { LIMINE_COMMON_MAGIC, 0xf55038d8e2a1202f, 0x279426fcf5f59740 }
|
||||||
|
|
||||||
|
struct limine_bootloader_info_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(char *) name;
|
||||||
|
LIMINE_PTR(char *) version;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_bootloader_info_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_bootloader_info_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Firmware type */
|
||||||
|
|
||||||
|
#define LIMINE_FIRMWARE_TYPE_REQUEST { LIMINE_COMMON_MAGIC, 0x8c2f75d90bef28a8, 0x7045a4688eac00c3 }
|
||||||
|
|
||||||
|
#define LIMINE_FIRMWARE_TYPE_X86BIOS 0
|
||||||
|
#define LIMINE_FIRMWARE_TYPE_UEFI32 1
|
||||||
|
#define LIMINE_FIRMWARE_TYPE_UEFI64 2
|
||||||
|
|
||||||
|
struct limine_firmware_type_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t firmware_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_firmware_type_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_firmware_type_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Stack size */
|
||||||
|
|
||||||
|
#define LIMINE_STACK_SIZE_REQUEST { LIMINE_COMMON_MAGIC, 0x224ef0460a8e8926, 0xe1cb0fc25f46ea3d }
|
||||||
|
|
||||||
|
struct limine_stack_size_response {
|
||||||
|
uint64_t revision;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_stack_size_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_stack_size_response *) response;
|
||||||
|
uint64_t stack_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* HHDM */
|
||||||
|
|
||||||
|
#define LIMINE_HHDM_REQUEST { LIMINE_COMMON_MAGIC, 0x48dcf1cb8ad2b852, 0x63984e959a98244b }
|
||||||
|
|
||||||
|
struct limine_hhdm_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_hhdm_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_hhdm_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Framebuffer */
|
||||||
|
|
||||||
|
#define LIMINE_FRAMEBUFFER_REQUEST { LIMINE_COMMON_MAGIC, 0x9d5827dcd881dd75, 0xa3148604f6fab11b }
|
||||||
|
|
||||||
|
#define LIMINE_FRAMEBUFFER_RGB 1
|
||||||
|
|
||||||
|
struct limine_video_mode {
|
||||||
|
uint64_t pitch;
|
||||||
|
uint64_t width;
|
||||||
|
uint64_t height;
|
||||||
|
uint16_t bpp;
|
||||||
|
uint8_t memory_model;
|
||||||
|
uint8_t red_mask_size;
|
||||||
|
uint8_t red_mask_shift;
|
||||||
|
uint8_t green_mask_size;
|
||||||
|
uint8_t green_mask_shift;
|
||||||
|
uint8_t blue_mask_size;
|
||||||
|
uint8_t blue_mask_shift;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_framebuffer {
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
uint64_t width;
|
||||||
|
uint64_t height;
|
||||||
|
uint64_t pitch;
|
||||||
|
uint16_t bpp;
|
||||||
|
uint8_t memory_model;
|
||||||
|
uint8_t red_mask_size;
|
||||||
|
uint8_t red_mask_shift;
|
||||||
|
uint8_t green_mask_size;
|
||||||
|
uint8_t green_mask_shift;
|
||||||
|
uint8_t blue_mask_size;
|
||||||
|
uint8_t blue_mask_shift;
|
||||||
|
uint8_t unused[7];
|
||||||
|
uint64_t edid_size;
|
||||||
|
LIMINE_PTR(void *) edid;
|
||||||
|
/* Response revision 1 */
|
||||||
|
uint64_t mode_count;
|
||||||
|
LIMINE_PTR(struct limine_video_mode **) modes;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_framebuffer_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t framebuffer_count;
|
||||||
|
LIMINE_PTR(struct limine_framebuffer **) framebuffers;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_framebuffer_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_framebuffer_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Terminal */
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_REQUEST { LIMINE_COMMON_MAGIC, 0xc8ac59310c2b0844, 0xa68d0c7265d38878 }
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_CB_DEC 10
|
||||||
|
#define LIMINE_TERMINAL_CB_BELL 20
|
||||||
|
#define LIMINE_TERMINAL_CB_PRIVATE_ID 30
|
||||||
|
#define LIMINE_TERMINAL_CB_STATUS_REPORT 40
|
||||||
|
#define LIMINE_TERMINAL_CB_POS_REPORT 50
|
||||||
|
#define LIMINE_TERMINAL_CB_KBD_LEDS 60
|
||||||
|
#define LIMINE_TERMINAL_CB_MODE 70
|
||||||
|
#define LIMINE_TERMINAL_CB_LINUX 80
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_CTX_SIZE ((uint64_t)(-1))
|
||||||
|
#define LIMINE_TERMINAL_CTX_SAVE ((uint64_t)(-2))
|
||||||
|
#define LIMINE_TERMINAL_CTX_RESTORE ((uint64_t)(-3))
|
||||||
|
#define LIMINE_TERMINAL_FULL_REFRESH ((uint64_t)(-4))
|
||||||
|
|
||||||
|
/* Response revision 1 */
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_GET ((uint64_t)(-10))
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_SET ((uint64_t)(-11))
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OCRNL (1 << 0)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OFDEL (1 << 1)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OFILL (1 << 2)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OLCUC (1 << 3)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_ONLCR (1 << 4)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_ONLRET (1 << 5)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_ONOCR (1 << 6)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OPOST (1 << 7)
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_START
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal;
|
||||||
|
|
||||||
|
typedef void (*limine_terminal_write)(struct limine_terminal *, const char *, uint64_t);
|
||||||
|
typedef void (*limine_terminal_callback)(struct limine_terminal *, uint64_t, uint64_t, uint64_t, uint64_t);
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal {
|
||||||
|
uint64_t columns;
|
||||||
|
uint64_t rows;
|
||||||
|
LIMINE_PTR(struct limine_framebuffer *) framebuffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t terminal_count;
|
||||||
|
LIMINE_PTR(struct limine_terminal **) terminals;
|
||||||
|
LIMINE_PTR(limine_terminal_write) write;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_terminal_response *) response;
|
||||||
|
LIMINE_PTR(limine_terminal_callback) callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_END
|
||||||
|
|
||||||
|
/* Paging mode */
|
||||||
|
|
||||||
|
#define LIMINE_PAGING_MODE_REQUEST { LIMINE_COMMON_MAGIC, 0x95c1a0edab0944cb, 0xa4e5cb3842f7488a }
|
||||||
|
|
||||||
|
#if defined (__x86_64__) || defined (__i386__)
|
||||||
|
#define LIMINE_PAGING_MODE_X86_64_4LVL 0
|
||||||
|
#define LIMINE_PAGING_MODE_X86_64_5LVL 1
|
||||||
|
#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_X86_64_5LVL
|
||||||
|
#define LIMINE_PAGING_MODE_MIN LIMINE_PAGING_MODE_X86_64_4LVL
|
||||||
|
#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_X86_64_4LVL
|
||||||
|
#elif defined (__aarch64__)
|
||||||
|
#define LIMINE_PAGING_MODE_AARCH64_4LVL 0
|
||||||
|
#define LIMINE_PAGING_MODE_AARCH64_5LVL 1
|
||||||
|
#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_AARCH64_5LVL
|
||||||
|
#define LIMINE_PAGING_MODE_MIN LIMINE_PAGING_MODE_AARCH64_4LVL
|
||||||
|
#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_AARCH64_4LVL
|
||||||
|
#elif defined (__riscv) && (__riscv_xlen == 64)
|
||||||
|
#define LIMINE_PAGING_MODE_RISCV_SV39 0
|
||||||
|
#define LIMINE_PAGING_MODE_RISCV_SV48 1
|
||||||
|
#define LIMINE_PAGING_MODE_RISCV_SV57 2
|
||||||
|
#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_RISCV_SV57
|
||||||
|
#define LIMINE_PAGING_MODE_MIN LIMINE_PAGING_MODE_RISCV_SV39
|
||||||
|
#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_RISCV_SV48
|
||||||
|
#else
|
||||||
|
#error Unknown architecture
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct limine_paging_mode_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_paging_mode_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_paging_mode_response *) response;
|
||||||
|
uint64_t mode;
|
||||||
|
uint64_t max_mode;
|
||||||
|
uint64_t min_mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 5-level paging */
|
||||||
|
|
||||||
|
#define LIMINE_5_LEVEL_PAGING_REQUEST { LIMINE_COMMON_MAGIC, 0x94469551da9b3192, 0xebe5e86db7382888 }
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_START
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_5_level_paging_response {
|
||||||
|
uint64_t revision;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_5_level_paging_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_5_level_paging_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_END
|
||||||
|
|
||||||
|
/* SMP */
|
||||||
|
|
||||||
|
#define LIMINE_SMP_REQUEST { LIMINE_COMMON_MAGIC, 0x95a67b819a1b857e, 0xa0b61b723b6a73e0 }
|
||||||
|
|
||||||
|
struct limine_smp_info;
|
||||||
|
|
||||||
|
typedef void (*limine_goto_address)(struct limine_smp_info *);
|
||||||
|
|
||||||
|
#if defined (__x86_64__) || defined (__i386__)
|
||||||
|
|
||||||
|
#define LIMINE_SMP_X2APIC (1 << 0)
|
||||||
|
|
||||||
|
struct limine_smp_info {
|
||||||
|
uint32_t processor_id;
|
||||||
|
uint32_t lapic_id;
|
||||||
|
uint64_t reserved;
|
||||||
|
LIMINE_PTR(limine_goto_address) goto_address;
|
||||||
|
uint64_t extra_argument;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint32_t flags;
|
||||||
|
uint32_t bsp_lapic_id;
|
||||||
|
uint64_t cpu_count;
|
||||||
|
LIMINE_PTR(struct limine_smp_info **) cpus;
|
||||||
|
};
|
||||||
|
|
||||||
|
#elif defined (__aarch64__)
|
||||||
|
|
||||||
|
struct limine_smp_info {
|
||||||
|
uint32_t processor_id;
|
||||||
|
uint32_t reserved1;
|
||||||
|
uint64_t mpidr;
|
||||||
|
uint64_t reserved;
|
||||||
|
LIMINE_PTR(limine_goto_address) goto_address;
|
||||||
|
uint64_t extra_argument;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t flags;
|
||||||
|
uint64_t bsp_mpidr;
|
||||||
|
uint64_t cpu_count;
|
||||||
|
LIMINE_PTR(struct limine_smp_info **) cpus;
|
||||||
|
};
|
||||||
|
|
||||||
|
#elif defined (__riscv) && (__riscv_xlen == 64)
|
||||||
|
|
||||||
|
struct limine_smp_info {
|
||||||
|
uint64_t processor_id;
|
||||||
|
uint64_t hartid;
|
||||||
|
uint64_t reserved;
|
||||||
|
LIMINE_PTR(limine_goto_address) goto_address;
|
||||||
|
uint64_t extra_argument;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t flags;
|
||||||
|
uint64_t bsp_hartid;
|
||||||
|
uint64_t cpu_count;
|
||||||
|
LIMINE_PTR(struct limine_smp_info **) cpus;
|
||||||
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error Unknown architecture
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct limine_smp_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_smp_response *) response;
|
||||||
|
uint64_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Memory map */
|
||||||
|
|
||||||
|
#define LIMINE_MEMMAP_REQUEST { LIMINE_COMMON_MAGIC, 0x67cf3d9d378a806f, 0xe304acdfc50c3c62 }
|
||||||
|
|
||||||
|
#define LIMINE_MEMMAP_USABLE 0
|
||||||
|
#define LIMINE_MEMMAP_RESERVED 1
|
||||||
|
#define LIMINE_MEMMAP_ACPI_RECLAIMABLE 2
|
||||||
|
#define LIMINE_MEMMAP_ACPI_NVS 3
|
||||||
|
#define LIMINE_MEMMAP_BAD_MEMORY 4
|
||||||
|
#define LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE 5
|
||||||
|
#define LIMINE_MEMMAP_KERNEL_AND_MODULES 6
|
||||||
|
#define LIMINE_MEMMAP_FRAMEBUFFER 7
|
||||||
|
|
||||||
|
struct limine_memmap_entry {
|
||||||
|
uint64_t base;
|
||||||
|
uint64_t length;
|
||||||
|
uint64_t type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_memmap_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t entry_count;
|
||||||
|
LIMINE_PTR(struct limine_memmap_entry **) entries;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_memmap_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_memmap_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Entry point */
|
||||||
|
|
||||||
|
#define LIMINE_ENTRY_POINT_REQUEST { LIMINE_COMMON_MAGIC, 0x13d86c035a1cd3e1, 0x2b0caa89d8f3026a }
|
||||||
|
|
||||||
|
typedef void (*limine_entry_point)(void);
|
||||||
|
|
||||||
|
struct limine_entry_point_response {
|
||||||
|
uint64_t revision;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_entry_point_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_entry_point_response *) response;
|
||||||
|
LIMINE_PTR(limine_entry_point) entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Kernel File */
|
||||||
|
|
||||||
|
#define LIMINE_KERNEL_FILE_REQUEST { LIMINE_COMMON_MAGIC, 0xad97e90e83f1ed67, 0x31eb5d1c5ff23b69 }
|
||||||
|
|
||||||
|
struct limine_kernel_file_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_file *) kernel_file;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_kernel_file_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_kernel_file_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Module */
|
||||||
|
|
||||||
|
#define LIMINE_MODULE_REQUEST { LIMINE_COMMON_MAGIC, 0x3e7e279702be32af, 0xca1c4f3bd1280cee }
|
||||||
|
|
||||||
|
#define LIMINE_INTERNAL_MODULE_REQUIRED (1 << 0)
|
||||||
|
#define LIMINE_INTERNAL_MODULE_COMPRESSED (1 << 1)
|
||||||
|
|
||||||
|
struct limine_internal_module {
|
||||||
|
LIMINE_PTR(const char *) path;
|
||||||
|
LIMINE_PTR(const char *) cmdline;
|
||||||
|
uint64_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_module_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t module_count;
|
||||||
|
LIMINE_PTR(struct limine_file **) modules;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_module_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_module_response *) response;
|
||||||
|
|
||||||
|
/* Request revision 1 */
|
||||||
|
uint64_t internal_module_count;
|
||||||
|
LIMINE_PTR(struct limine_internal_module **) internal_modules;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* RSDP */
|
||||||
|
|
||||||
|
#define LIMINE_RSDP_REQUEST { LIMINE_COMMON_MAGIC, 0xc5e77b6b397e7b43, 0x27637845accdcf3c }
|
||||||
|
|
||||||
|
struct limine_rsdp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_rsdp_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_rsdp_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* SMBIOS */
|
||||||
|
|
||||||
|
#define LIMINE_SMBIOS_REQUEST { LIMINE_COMMON_MAGIC, 0x9e9046f11e095391, 0xaa4a520fefbde5ee }
|
||||||
|
|
||||||
|
struct limine_smbios_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) entry_32;
|
||||||
|
LIMINE_PTR(void *) entry_64;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smbios_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_smbios_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* EFI system table */
|
||||||
|
|
||||||
|
#define LIMINE_EFI_SYSTEM_TABLE_REQUEST { LIMINE_COMMON_MAGIC, 0x5ceba5163eaaf6d6, 0x0a6981610cf65fcc }
|
||||||
|
|
||||||
|
struct limine_efi_system_table_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_efi_system_table_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_efi_system_table_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* EFI memory map */
|
||||||
|
|
||||||
|
#define LIMINE_EFI_MEMMAP_REQUEST { LIMINE_COMMON_MAGIC, 0x7df62a431d6872d5, 0xa4fcdfb3e57306c8 }
|
||||||
|
|
||||||
|
struct limine_efi_memmap_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) memmap;
|
||||||
|
uint64_t memmap_size;
|
||||||
|
uint64_t desc_size;
|
||||||
|
uint64_t desc_version;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_efi_memmap_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_efi_memmap_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Boot time */
|
||||||
|
|
||||||
|
#define LIMINE_BOOT_TIME_REQUEST { LIMINE_COMMON_MAGIC, 0x502746e184c088aa, 0xfbc5ec83e6327893 }
|
||||||
|
|
||||||
|
struct limine_boot_time_response {
|
||||||
|
uint64_t revision;
|
||||||
|
int64_t boot_time;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_boot_time_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_boot_time_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Kernel address */
|
||||||
|
|
||||||
|
#define LIMINE_KERNEL_ADDRESS_REQUEST { LIMINE_COMMON_MAGIC, 0x71ba76863cc55f63, 0xb2644a48c516a487 }
|
||||||
|
|
||||||
|
struct limine_kernel_address_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t physical_base;
|
||||||
|
uint64_t virtual_base;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_kernel_address_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_kernel_address_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Device Tree Blob */
|
||||||
|
|
||||||
|
#define LIMINE_DTB_REQUEST { LIMINE_COMMON_MAGIC, 0xb40ddb48fb54bac7, 0x545081493f81ffb7 }
|
||||||
|
|
||||||
|
struct limine_dtb_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) dtb_ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_dtb_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_dtb_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
11
FloridOS/linker.ld
Normal file
11
FloridOS/linker.ld
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = 0xffffffff80000000;
|
||||||
|
|
||||||
|
.text : { *(.text .text.*) }
|
||||||
|
.rodata : { *(.rodata .rodata.*) }
|
||||||
|
.data : { *(.data .data.*) }
|
||||||
|
.bss : { *(.bss .bss.*) *(COMMON) }
|
||||||
|
}
|
||||||
11
FloridOS/src/drivers/io.h
Normal file
11
FloridOS/src/drivers/io.h
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#ifndef IO_H
|
||||||
|
#define IO_H
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
static inline uint8_t inb(uint16_t port) {
|
||||||
|
uint8_t ret;
|
||||||
|
__asm__ volatile ( "inb %w1, %b0" : "=a"(ret) : "Nd"(port) : "memory");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
39
FloridOS/src/drivers/keyboard.c
Normal file
39
FloridOS/src/drivers/keyboard.c
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
#include "io.h"
|
||||||
|
#include "tty.h"
|
||||||
|
|
||||||
|
// The Scan Code Map - Every key on the keyboard!
|
||||||
|
char kbd_map[] = {
|
||||||
|
0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b',
|
||||||
|
'\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n',
|
||||||
|
0, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', 0,
|
||||||
|
'\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, '*', 0, ' '
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint8_t last_scancode = 0;
|
||||||
|
|
||||||
|
void update_keyboard() {
|
||||||
|
// Check if the keyboard has data ready (Status Port 0x64, Bit 0)
|
||||||
|
if (inb(0x64) & 1) {
|
||||||
|
uint8_t scancode = inb(0x60);
|
||||||
|
|
||||||
|
// If the scancode is the SAME as the last one, skip it
|
||||||
|
// This prevents one tap from typing 50 letters on your fast laptop
|
||||||
|
if (scancode == last_scancode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
last_scancode = scancode;
|
||||||
|
|
||||||
|
// Key Pressed (scancode < 0x80)
|
||||||
|
if (scancode < 0x80) {
|
||||||
|
char c = kbd_map[scancode];
|
||||||
|
if (c > 0) {
|
||||||
|
tty_putchar(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Key Released (scancode >= 0x80)
|
||||||
|
// We reset last_scancode so you can press the same key again later
|
||||||
|
last_scancode = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
FloridOS/src/drivers/keyboard.h
Normal file
9
FloridOS/src/drivers/keyboard.h
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef KEYBOARD_H
|
||||||
|
#define KEYBOARD_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
// This tells the rest of the OS that this function exists in keyboard.c
|
||||||
|
void update_keyboard(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
53
FloridOS/src/drivers/terminal.c
Normal file
53
FloridOS/src/drivers/terminal.c
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
#include "drivers/terminal.h"
|
||||||
|
|
||||||
|
#define MAX_COLS 80
|
||||||
|
#define MAX_ROWS 25
|
||||||
|
|
||||||
|
static uint16_t terminal_buffer[MAX_ROWS * MAX_COLS];
|
||||||
|
static int cursor_x = 0, cursor_y = 0;
|
||||||
|
|
||||||
|
// To reach 1000 lines, we implement a full 'scroll' function
|
||||||
|
void terminal_scroll() {
|
||||||
|
for (int i = 0; i < MAX_ROWS - 1; i++) {
|
||||||
|
for (int j = 0; j < MAX_COLS; j++) {
|
||||||
|
terminal_buffer[i * MAX_COLS + j] = terminal_buffer[(i + 1) * MAX_COLS + j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Clear the last line
|
||||||
|
for (int j = 0; j < MAX_COLS; j++) {
|
||||||
|
terminal_buffer[(MAX_ROWS - 1) * MAX_COLS + j] = ' ';
|
||||||
|
}
|
||||||
|
cursor_y = MAX_ROWS - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void terminal_putchar(char c) {
|
||||||
|
if (c == '\n') {
|
||||||
|
cursor_x = 0;
|
||||||
|
cursor_y++;
|
||||||
|
} else {
|
||||||
|
terminal_buffer[cursor_y * MAX_COLS + cursor_x] = c;
|
||||||
|
cursor_x++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cursor_x >= MAX_COLS) {
|
||||||
|
cursor_x = 0;
|
||||||
|
cursor_y++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cursor_y >= MAX_ROWS) {
|
||||||
|
terminal_scroll();
|
||||||
|
}
|
||||||
|
// Now call your draw_char function to update the pixels...
|
||||||
|
}
|
||||||
|
|
||||||
|
void terminal_write(const char* data, size_t size) {
|
||||||
|
for (size_t i = 0; i < size; i++) {
|
||||||
|
terminal_putchar(data[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void terminal_writestring(const char* data) {
|
||||||
|
size_t len = 0;
|
||||||
|
while (data[len]) len++;
|
||||||
|
terminal_write(data, len);
|
||||||
|
}
|
||||||
13
FloridOS/src/drivers/terminal.h
Normal file
13
FloridOS/src/drivers/terminal.h
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef TERMINAL_H
|
||||||
|
#define TERMINAL_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
// Example: Define your terminal functions here
|
||||||
|
void terminal_initialize(void);
|
||||||
|
void terminal_putchar(char c);
|
||||||
|
void terminal_write(const char* data, size_t size);
|
||||||
|
void terminal_writestring(const char* data);
|
||||||
|
|
||||||
|
#endif
|
||||||
64
FloridOS/src/drivers/tty.c
Normal file
64
FloridOS/src/drivers/tty.c
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
#include "tty.h"
|
||||||
|
|
||||||
|
// The state of our terminal
|
||||||
|
static struct tty_framebuffer *fb;
|
||||||
|
static uint32_t cursor_x = 20;
|
||||||
|
static uint32_t cursor_y = 20;
|
||||||
|
static uint32_t fg_color;
|
||||||
|
static uint32_t bg_color;
|
||||||
|
|
||||||
|
// --- 8x8 BITMAP FONT ---
|
||||||
|
// This is a basic VGA font. Each byte is one row of pixels.
|
||||||
|
// This is where your line count starts climbing!
|
||||||
|
uint8_t font[128][8] = {
|
||||||
|
[0x20] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Space
|
||||||
|
['!'] = {0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00},
|
||||||
|
['A'] = {0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x00},
|
||||||
|
['B'] = {0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00},
|
||||||
|
['C'] = {0x3C, 0x66, 0x06, 0x06, 0x06, 0x66, 0x3C, 0x00},
|
||||||
|
['D'] = {0x78, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0x78, 0x00},
|
||||||
|
['E'] = {0x7E, 0x06, 0x06, 0x3E, 0x06, 0x06, 0x7E, 0x00},
|
||||||
|
['F'] = {0x7E, 0x06, 0x06, 0x3E, 0x06, 0x06, 0x06, 0x00},
|
||||||
|
['G'] = {0x3C, 0x66, 0x06, 0x76, 0x66, 0x66, 0x3C, 0x00},
|
||||||
|
['H'] = {0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00},
|
||||||
|
['I'] = {0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00},
|
||||||
|
['L'] = {0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x7E, 0x00},
|
||||||
|
['O'] = {0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00},
|
||||||
|
['R'] = {0x7C, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x00},
|
||||||
|
['S'] = {0x3C, 0x66, 0x06, 0x3C, 0x60, 0x66, 0x3C, 0x00},
|
||||||
|
// (Note: You can add more characters here to hit 1,000 lines!)
|
||||||
|
};
|
||||||
|
|
||||||
|
void tty_init(struct tty_framebuffer *target, uint32_t fg, uint32_t bg) {
|
||||||
|
fb = target;
|
||||||
|
fg_color = fg;
|
||||||
|
bg_color = bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tty_draw_char(char c, uint32_t x, uint32_t y) {
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
for (int j = 0; j < 8; j++) {
|
||||||
|
// Changed from (1 << j) to (1 << (7 - j)) or vice versa
|
||||||
|
// Try this one specifically for VirtualBox:
|
||||||
|
if (font[(uint8_t)c][i] & (0x80 >> j)) {
|
||||||
|
fb->address[(y + i) * (fb->pitch / 4) + (x + j)] = fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tty_putchar(char c) {
|
||||||
|
if (c == '\n') {
|
||||||
|
cursor_x = 20;
|
||||||
|
cursor_y += 12;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tty_draw_char(c, cursor_x, cursor_y);
|
||||||
|
cursor_x += 9; // Space between characters
|
||||||
|
}
|
||||||
|
|
||||||
|
void tty_print(const char *str) {
|
||||||
|
for (size_t i = 0; str[i] != '\0'; i++) {
|
||||||
|
tty_putchar(str[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
29
FloridOS/src/drivers/tty.h
Normal file
29
FloridOS/src/drivers/tty.h
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef TTY_H
|
||||||
|
#define TTY_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
// This struct is a copy of the one in kernel.c so tty.c knows how to draw
|
||||||
|
struct tty_framebuffer {
|
||||||
|
uint32_t *address;
|
||||||
|
uint64_t width;
|
||||||
|
uint64_t height;
|
||||||
|
uint64_t pitch;
|
||||||
|
};
|
||||||
|
|
||||||
|
// --- TTY FUNCTIONS ---
|
||||||
|
|
||||||
|
// Initializes the terminal with a framebuffer and colors
|
||||||
|
void tty_init(struct tty_framebuffer *fb, uint32_t fg, uint32_t bg);
|
||||||
|
|
||||||
|
// Puts a single character on the screen
|
||||||
|
void tty_putchar(char c);
|
||||||
|
|
||||||
|
// Prints a whole string (like your old writestring)
|
||||||
|
void tty_print(const char *str);
|
||||||
|
|
||||||
|
// Clears the screen to the background color
|
||||||
|
void tty_clear();
|
||||||
|
|
||||||
|
#endif
|
||||||
131
FloridOS/src/kernel.c
Normal file
131
FloridOS/src/kernel.c
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "limine.h"
|
||||||
|
#include "drivers/tty.h"
|
||||||
|
#include "drivers/io.h"
|
||||||
|
#include "drivers/keyboard.h"
|
||||||
|
|
||||||
|
// --- DELAY FUNCTION ---
|
||||||
|
// This handles the 5-second "Ourple" splash screen
|
||||||
|
void delay(uint64_t counts) {
|
||||||
|
for (volatile uint64_t i = 0; i < counts; i++) {
|
||||||
|
__asm__("nop");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- LIMINE REQUESTS ---
|
||||||
|
static volatile struct limine_framebuffer_request framebuffer_request = {
|
||||||
|
.id = LIMINE_FRAMEBUFFER_REQUEST,
|
||||||
|
.revision = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// --- MATERIAL 3 COLOR PALETTE ---
|
||||||
|
#define M3_SURFACE 0x1C1B1F
|
||||||
|
#define M3_PRIMARY 0xD0BCFF
|
||||||
|
#define M3_PURPLE_ACCENT 0x381E72
|
||||||
|
|
||||||
|
// --- GRAPHICS STRUCTURE ---
|
||||||
|
struct framebuffer {
|
||||||
|
uint32_t *address;
|
||||||
|
uint64_t width;
|
||||||
|
uint64_t height;
|
||||||
|
uint64_t pitch;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Function to draw a single pixel
|
||||||
|
void put_pixel(struct framebuffer *fb, uint32_t x, uint32_t y, uint32_t color) {
|
||||||
|
if (x >= fb->width || y >= fb->height) return;
|
||||||
|
fb->address[y * (fb->pitch / 4) + x] = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to draw a rectangle
|
||||||
|
void draw_rect(struct framebuffer *fb, uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color) {
|
||||||
|
for (uint32_t i = 0; i < w; i++) {
|
||||||
|
for (uint32_t j = 0; j < h; j++) {
|
||||||
|
put_pixel(fb, x + i, y + j, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- SYSTEM TABLES (GDT) ---
|
||||||
|
struct gdt_entry {
|
||||||
|
uint16_t limit_low;
|
||||||
|
uint16_t base_low;
|
||||||
|
uint8_t base_middle;
|
||||||
|
uint8_t access;
|
||||||
|
uint8_t granularity;
|
||||||
|
uint8_t base_high;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct gdt_ptr {
|
||||||
|
uint16_t limit;
|
||||||
|
uint64_t base;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct gdt_entry gdt[3];
|
||||||
|
struct gdt_ptr gdt_p;
|
||||||
|
|
||||||
|
void init_gdt() {
|
||||||
|
gdt[0] = (struct gdt_entry){0, 0, 0, 0, 0, 0}; // Null
|
||||||
|
gdt[1] = (struct gdt_entry){0, 0, 0, 0x9A, 0x20, 0}; // Code
|
||||||
|
gdt[2] = (struct gdt_entry){0, 0, 0, 0x92, 0, 0}; // Data
|
||||||
|
|
||||||
|
gdt_p.limit = (sizeof(struct gdt_entry) * 3) - 1;
|
||||||
|
gdt_p.base = (uint64_t)&gdt;
|
||||||
|
__asm__ volatile("lgdt %0" : : "m"(gdt_p));
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- KERNEL ENTRY POINT ---
|
||||||
|
void _start(void) {
|
||||||
|
// 1. Check if we have a screen
|
||||||
|
if (framebuffer_request.response == NULL || framebuffer_request.response->framebuffer_count < 1) {
|
||||||
|
__asm__("hlt");
|
||||||
|
}
|
||||||
|
|
||||||
|
struct limine_framebuffer *fb_info = framebuffer_request.response->framebuffers[0];
|
||||||
|
struct framebuffer fb = {
|
||||||
|
.address = fb_info->address,
|
||||||
|
.width = fb_info->width,
|
||||||
|
.height = fb_info->height,
|
||||||
|
.pitch = fb_info->pitch
|
||||||
|
};
|
||||||
|
|
||||||
|
// 2. Setup CPU state
|
||||||
|
init_gdt();
|
||||||
|
|
||||||
|
// 3. THE 5-SECOND OURPLE INTRO
|
||||||
|
draw_rect(&fb, 0, 0, fb.width, fb.height, M3_PURPLE_ACCENT);
|
||||||
|
delay(800000000); // Wait 5 seconds
|
||||||
|
|
||||||
|
// 4. THE MATERIAL 3 UI
|
||||||
|
draw_rect(&fb, 0, 0, fb.width, fb.height, M3_SURFACE); // Dark background
|
||||||
|
|
||||||
|
// Draw the Pastel Purple Card
|
||||||
|
uint32_t cw = 400; uint32_t ch = 200;
|
||||||
|
draw_rect(&fb, (fb.width/2)-(cw/2), (fb.height/2)-(ch/2), cw, ch, M3_PRIMARY);
|
||||||
|
|
||||||
|
// ... (Your existing rect drawing code) ...
|
||||||
|
|
||||||
|
// 5. BOOT THE TTY
|
||||||
|
// We pass the fb address, White text (0xFFFFFF), and Dark background
|
||||||
|
tty_init((struct tty_framebuffer*)&fb, 0xFFFFFF, M3_SURFACE);
|
||||||
|
|
||||||
|
|
||||||
|
// 6. SAY HELLO!
|
||||||
|
tty_print("FLORID OS BOOTED\n");
|
||||||
|
tty_print("READY_");
|
||||||
|
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
// Check Status Register (Port 0x64)
|
||||||
|
// Bit 0 (0x01) tells us if a key is waiting
|
||||||
|
if (inb(0x64) & 0x01) {
|
||||||
|
update_keyboard();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Give VirtualBox a tiny rest so it doesn't lag the host
|
||||||
|
for(volatile int i = 0; i < 1000; i++);
|
||||||
|
__asm__("pause");
|
||||||
|
}
|
||||||
|
}
|
||||||
0
FloridOS/src/kernel.h
Normal file
0
FloridOS/src/kernel.h
Normal file
609
FloridOS/src/limine.h
Normal file
609
FloridOS/src/limine.h
Normal file
|
|
@ -0,0 +1,609 @@
|
||||||
|
/* BSD Zero Clause License */
|
||||||
|
|
||||||
|
/* Copyright (C) 2022-2024 mintsuki and contributors.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIMINE_H
|
||||||
|
#define LIMINE_H 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Misc */
|
||||||
|
|
||||||
|
#ifdef LIMINE_NO_POINTERS
|
||||||
|
# define LIMINE_PTR(TYPE) uint64_t
|
||||||
|
#else
|
||||||
|
# define LIMINE_PTR(TYPE) TYPE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define LIMINE_DEPRECATED __attribute__((__deprecated__))
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_START \
|
||||||
|
_Pragma("GCC diagnostic push") \
|
||||||
|
_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_END \
|
||||||
|
_Pragma("GCC diagnostic pop")
|
||||||
|
#else
|
||||||
|
# define LIMINE_DEPRECATED
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_START
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_END
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LIMINE_REQUESTS_START_MARKER \
|
||||||
|
uint64_t limine_requests_start_marker[4] = { 0xf6b8f4b39de7d1ae, 0xfab91a6940fcb9cf, \
|
||||||
|
0x785c6ed015d3e316, 0x181e920a7852b9d9 };
|
||||||
|
#define LIMINE_REQUESTS_END_MARKER \
|
||||||
|
uint64_t limine_requests_end_marker[2] = { 0xadc0e0531bb10d03, 0x9572709f31764c62 };
|
||||||
|
|
||||||
|
#define LIMINE_REQUESTS_DELIMITER LIMINE_REQUESTS_END_MARKER
|
||||||
|
|
||||||
|
#define LIMINE_BASE_REVISION(N) \
|
||||||
|
uint64_t limine_base_revision[3] = { 0xf9562b2d5c95a6c8, 0x6a7b384944536bdc, (N) };
|
||||||
|
|
||||||
|
#define LIMINE_BASE_REVISION_SUPPORTED (limine_base_revision[2] == 0)
|
||||||
|
|
||||||
|
#define LIMINE_COMMON_MAGIC 0xc7b1dd30df4c8b88, 0x0a82e883a194f07b
|
||||||
|
|
||||||
|
struct limine_uuid {
|
||||||
|
uint32_t a;
|
||||||
|
uint16_t b;
|
||||||
|
uint16_t c;
|
||||||
|
uint8_t d[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LIMINE_MEDIA_TYPE_GENERIC 0
|
||||||
|
#define LIMINE_MEDIA_TYPE_OPTICAL 1
|
||||||
|
#define LIMINE_MEDIA_TYPE_TFTP 2
|
||||||
|
|
||||||
|
struct limine_file {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
uint64_t size;
|
||||||
|
LIMINE_PTR(char *) path;
|
||||||
|
LIMINE_PTR(char *) cmdline;
|
||||||
|
uint32_t media_type;
|
||||||
|
uint32_t unused;
|
||||||
|
uint32_t tftp_ip;
|
||||||
|
uint32_t tftp_port;
|
||||||
|
uint32_t partition_index;
|
||||||
|
uint32_t mbr_disk_id;
|
||||||
|
struct limine_uuid gpt_disk_uuid;
|
||||||
|
struct limine_uuid gpt_part_uuid;
|
||||||
|
struct limine_uuid part_uuid;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Boot info */
|
||||||
|
|
||||||
|
#define LIMINE_BOOTLOADER_INFO_REQUEST { LIMINE_COMMON_MAGIC, 0xf55038d8e2a1202f, 0x279426fcf5f59740 }
|
||||||
|
|
||||||
|
struct limine_bootloader_info_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(char *) name;
|
||||||
|
LIMINE_PTR(char *) version;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_bootloader_info_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_bootloader_info_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Firmware type */
|
||||||
|
|
||||||
|
#define LIMINE_FIRMWARE_TYPE_REQUEST { LIMINE_COMMON_MAGIC, 0x8c2f75d90bef28a8, 0x7045a4688eac00c3 }
|
||||||
|
|
||||||
|
#define LIMINE_FIRMWARE_TYPE_X86BIOS 0
|
||||||
|
#define LIMINE_FIRMWARE_TYPE_UEFI32 1
|
||||||
|
#define LIMINE_FIRMWARE_TYPE_UEFI64 2
|
||||||
|
|
||||||
|
struct limine_firmware_type_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t firmware_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_firmware_type_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_firmware_type_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Stack size */
|
||||||
|
|
||||||
|
#define LIMINE_STACK_SIZE_REQUEST { LIMINE_COMMON_MAGIC, 0x224ef0460a8e8926, 0xe1cb0fc25f46ea3d }
|
||||||
|
|
||||||
|
struct limine_stack_size_response {
|
||||||
|
uint64_t revision;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_stack_size_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_stack_size_response *) response;
|
||||||
|
uint64_t stack_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* HHDM */
|
||||||
|
|
||||||
|
#define LIMINE_HHDM_REQUEST { LIMINE_COMMON_MAGIC, 0x48dcf1cb8ad2b852, 0x63984e959a98244b }
|
||||||
|
|
||||||
|
struct limine_hhdm_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_hhdm_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_hhdm_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Framebuffer */
|
||||||
|
|
||||||
|
#define LIMINE_FRAMEBUFFER_REQUEST { LIMINE_COMMON_MAGIC, 0x9d5827dcd881dd75, 0xa3148604f6fab11b }
|
||||||
|
|
||||||
|
#define LIMINE_FRAMEBUFFER_RGB 1
|
||||||
|
|
||||||
|
struct limine_video_mode {
|
||||||
|
uint64_t pitch;
|
||||||
|
uint64_t width;
|
||||||
|
uint64_t height;
|
||||||
|
uint16_t bpp;
|
||||||
|
uint8_t memory_model;
|
||||||
|
uint8_t red_mask_size;
|
||||||
|
uint8_t red_mask_shift;
|
||||||
|
uint8_t green_mask_size;
|
||||||
|
uint8_t green_mask_shift;
|
||||||
|
uint8_t blue_mask_size;
|
||||||
|
uint8_t blue_mask_shift;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_framebuffer {
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
uint64_t width;
|
||||||
|
uint64_t height;
|
||||||
|
uint64_t pitch;
|
||||||
|
uint16_t bpp;
|
||||||
|
uint8_t memory_model;
|
||||||
|
uint8_t red_mask_size;
|
||||||
|
uint8_t red_mask_shift;
|
||||||
|
uint8_t green_mask_size;
|
||||||
|
uint8_t green_mask_shift;
|
||||||
|
uint8_t blue_mask_size;
|
||||||
|
uint8_t blue_mask_shift;
|
||||||
|
uint8_t unused[7];
|
||||||
|
uint64_t edid_size;
|
||||||
|
LIMINE_PTR(void *) edid;
|
||||||
|
/* Response revision 1 */
|
||||||
|
uint64_t mode_count;
|
||||||
|
LIMINE_PTR(struct limine_video_mode **) modes;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_framebuffer_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t framebuffer_count;
|
||||||
|
LIMINE_PTR(struct limine_framebuffer **) framebuffers;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_framebuffer_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_framebuffer_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Terminal */
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_REQUEST { LIMINE_COMMON_MAGIC, 0xc8ac59310c2b0844, 0xa68d0c7265d38878 }
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_CB_DEC 10
|
||||||
|
#define LIMINE_TERMINAL_CB_BELL 20
|
||||||
|
#define LIMINE_TERMINAL_CB_PRIVATE_ID 30
|
||||||
|
#define LIMINE_TERMINAL_CB_STATUS_REPORT 40
|
||||||
|
#define LIMINE_TERMINAL_CB_POS_REPORT 50
|
||||||
|
#define LIMINE_TERMINAL_CB_KBD_LEDS 60
|
||||||
|
#define LIMINE_TERMINAL_CB_MODE 70
|
||||||
|
#define LIMINE_TERMINAL_CB_LINUX 80
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_CTX_SIZE ((uint64_t)(-1))
|
||||||
|
#define LIMINE_TERMINAL_CTX_SAVE ((uint64_t)(-2))
|
||||||
|
#define LIMINE_TERMINAL_CTX_RESTORE ((uint64_t)(-3))
|
||||||
|
#define LIMINE_TERMINAL_FULL_REFRESH ((uint64_t)(-4))
|
||||||
|
|
||||||
|
/* Response revision 1 */
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_GET ((uint64_t)(-10))
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_SET ((uint64_t)(-11))
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OCRNL (1 << 0)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OFDEL (1 << 1)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OFILL (1 << 2)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OLCUC (1 << 3)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_ONLCR (1 << 4)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_ONLRET (1 << 5)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_ONOCR (1 << 6)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OPOST (1 << 7)
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_START
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal;
|
||||||
|
|
||||||
|
typedef void (*limine_terminal_write)(struct limine_terminal *, const char *, uint64_t);
|
||||||
|
typedef void (*limine_terminal_callback)(struct limine_terminal *, uint64_t, uint64_t, uint64_t, uint64_t);
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal {
|
||||||
|
uint64_t columns;
|
||||||
|
uint64_t rows;
|
||||||
|
LIMINE_PTR(struct limine_framebuffer *) framebuffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t terminal_count;
|
||||||
|
LIMINE_PTR(struct limine_terminal **) terminals;
|
||||||
|
LIMINE_PTR(limine_terminal_write) write;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_terminal_response *) response;
|
||||||
|
LIMINE_PTR(limine_terminal_callback) callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_END
|
||||||
|
|
||||||
|
/* Paging mode */
|
||||||
|
|
||||||
|
#define LIMINE_PAGING_MODE_REQUEST { LIMINE_COMMON_MAGIC, 0x95c1a0edab0944cb, 0xa4e5cb3842f7488a }
|
||||||
|
|
||||||
|
#if defined (__x86_64__) || defined (__i386__)
|
||||||
|
#define LIMINE_PAGING_MODE_X86_64_4LVL 0
|
||||||
|
#define LIMINE_PAGING_MODE_X86_64_5LVL 1
|
||||||
|
#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_X86_64_5LVL
|
||||||
|
#define LIMINE_PAGING_MODE_MIN LIMINE_PAGING_MODE_X86_64_4LVL
|
||||||
|
#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_X86_64_4LVL
|
||||||
|
#elif defined (__aarch64__)
|
||||||
|
#define LIMINE_PAGING_MODE_AARCH64_4LVL 0
|
||||||
|
#define LIMINE_PAGING_MODE_AARCH64_5LVL 1
|
||||||
|
#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_AARCH64_5LVL
|
||||||
|
#define LIMINE_PAGING_MODE_MIN LIMINE_PAGING_MODE_AARCH64_4LVL
|
||||||
|
#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_AARCH64_4LVL
|
||||||
|
#elif defined (__riscv) && (__riscv_xlen == 64)
|
||||||
|
#define LIMINE_PAGING_MODE_RISCV_SV39 0
|
||||||
|
#define LIMINE_PAGING_MODE_RISCV_SV48 1
|
||||||
|
#define LIMINE_PAGING_MODE_RISCV_SV57 2
|
||||||
|
#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_RISCV_SV57
|
||||||
|
#define LIMINE_PAGING_MODE_MIN LIMINE_PAGING_MODE_RISCV_SV39
|
||||||
|
#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_RISCV_SV48
|
||||||
|
#else
|
||||||
|
#error Unknown architecture
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct limine_paging_mode_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_paging_mode_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_paging_mode_response *) response;
|
||||||
|
uint64_t mode;
|
||||||
|
uint64_t max_mode;
|
||||||
|
uint64_t min_mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 5-level paging */
|
||||||
|
|
||||||
|
#define LIMINE_5_LEVEL_PAGING_REQUEST { LIMINE_COMMON_MAGIC, 0x94469551da9b3192, 0xebe5e86db7382888 }
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_START
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_5_level_paging_response {
|
||||||
|
uint64_t revision;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_5_level_paging_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_5_level_paging_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_END
|
||||||
|
|
||||||
|
/* SMP */
|
||||||
|
|
||||||
|
#define LIMINE_SMP_REQUEST { LIMINE_COMMON_MAGIC, 0x95a67b819a1b857e, 0xa0b61b723b6a73e0 }
|
||||||
|
|
||||||
|
struct limine_smp_info;
|
||||||
|
|
||||||
|
typedef void (*limine_goto_address)(struct limine_smp_info *);
|
||||||
|
|
||||||
|
#if defined (__x86_64__) || defined (__i386__)
|
||||||
|
|
||||||
|
#define LIMINE_SMP_X2APIC (1 << 0)
|
||||||
|
|
||||||
|
struct limine_smp_info {
|
||||||
|
uint32_t processor_id;
|
||||||
|
uint32_t lapic_id;
|
||||||
|
uint64_t reserved;
|
||||||
|
LIMINE_PTR(limine_goto_address) goto_address;
|
||||||
|
uint64_t extra_argument;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint32_t flags;
|
||||||
|
uint32_t bsp_lapic_id;
|
||||||
|
uint64_t cpu_count;
|
||||||
|
LIMINE_PTR(struct limine_smp_info **) cpus;
|
||||||
|
};
|
||||||
|
|
||||||
|
#elif defined (__aarch64__)
|
||||||
|
|
||||||
|
struct limine_smp_info {
|
||||||
|
uint32_t processor_id;
|
||||||
|
uint32_t reserved1;
|
||||||
|
uint64_t mpidr;
|
||||||
|
uint64_t reserved;
|
||||||
|
LIMINE_PTR(limine_goto_address) goto_address;
|
||||||
|
uint64_t extra_argument;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t flags;
|
||||||
|
uint64_t bsp_mpidr;
|
||||||
|
uint64_t cpu_count;
|
||||||
|
LIMINE_PTR(struct limine_smp_info **) cpus;
|
||||||
|
};
|
||||||
|
|
||||||
|
#elif defined (__riscv) && (__riscv_xlen == 64)
|
||||||
|
|
||||||
|
struct limine_smp_info {
|
||||||
|
uint64_t processor_id;
|
||||||
|
uint64_t hartid;
|
||||||
|
uint64_t reserved;
|
||||||
|
LIMINE_PTR(limine_goto_address) goto_address;
|
||||||
|
uint64_t extra_argument;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t flags;
|
||||||
|
uint64_t bsp_hartid;
|
||||||
|
uint64_t cpu_count;
|
||||||
|
LIMINE_PTR(struct limine_smp_info **) cpus;
|
||||||
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error Unknown architecture
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct limine_smp_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_smp_response *) response;
|
||||||
|
uint64_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Memory map */
|
||||||
|
|
||||||
|
#define LIMINE_MEMMAP_REQUEST { LIMINE_COMMON_MAGIC, 0x67cf3d9d378a806f, 0xe304acdfc50c3c62 }
|
||||||
|
|
||||||
|
#define LIMINE_MEMMAP_USABLE 0
|
||||||
|
#define LIMINE_MEMMAP_RESERVED 1
|
||||||
|
#define LIMINE_MEMMAP_ACPI_RECLAIMABLE 2
|
||||||
|
#define LIMINE_MEMMAP_ACPI_NVS 3
|
||||||
|
#define LIMINE_MEMMAP_BAD_MEMORY 4
|
||||||
|
#define LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE 5
|
||||||
|
#define LIMINE_MEMMAP_KERNEL_AND_MODULES 6
|
||||||
|
#define LIMINE_MEMMAP_FRAMEBUFFER 7
|
||||||
|
|
||||||
|
struct limine_memmap_entry {
|
||||||
|
uint64_t base;
|
||||||
|
uint64_t length;
|
||||||
|
uint64_t type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_memmap_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t entry_count;
|
||||||
|
LIMINE_PTR(struct limine_memmap_entry **) entries;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_memmap_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_memmap_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Entry point */
|
||||||
|
|
||||||
|
#define LIMINE_ENTRY_POINT_REQUEST { LIMINE_COMMON_MAGIC, 0x13d86c035a1cd3e1, 0x2b0caa89d8f3026a }
|
||||||
|
|
||||||
|
typedef void (*limine_entry_point)(void);
|
||||||
|
|
||||||
|
struct limine_entry_point_response {
|
||||||
|
uint64_t revision;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_entry_point_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_entry_point_response *) response;
|
||||||
|
LIMINE_PTR(limine_entry_point) entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Kernel File */
|
||||||
|
|
||||||
|
#define LIMINE_KERNEL_FILE_REQUEST { LIMINE_COMMON_MAGIC, 0xad97e90e83f1ed67, 0x31eb5d1c5ff23b69 }
|
||||||
|
|
||||||
|
struct limine_kernel_file_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_file *) kernel_file;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_kernel_file_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_kernel_file_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Module */
|
||||||
|
|
||||||
|
#define LIMINE_MODULE_REQUEST { LIMINE_COMMON_MAGIC, 0x3e7e279702be32af, 0xca1c4f3bd1280cee }
|
||||||
|
|
||||||
|
#define LIMINE_INTERNAL_MODULE_REQUIRED (1 << 0)
|
||||||
|
#define LIMINE_INTERNAL_MODULE_COMPRESSED (1 << 1)
|
||||||
|
|
||||||
|
struct limine_internal_module {
|
||||||
|
LIMINE_PTR(const char *) path;
|
||||||
|
LIMINE_PTR(const char *) cmdline;
|
||||||
|
uint64_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_module_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t module_count;
|
||||||
|
LIMINE_PTR(struct limine_file **) modules;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_module_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_module_response *) response;
|
||||||
|
|
||||||
|
/* Request revision 1 */
|
||||||
|
uint64_t internal_module_count;
|
||||||
|
LIMINE_PTR(struct limine_internal_module **) internal_modules;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* RSDP */
|
||||||
|
|
||||||
|
#define LIMINE_RSDP_REQUEST { LIMINE_COMMON_MAGIC, 0xc5e77b6b397e7b43, 0x27637845accdcf3c }
|
||||||
|
|
||||||
|
struct limine_rsdp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_rsdp_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_rsdp_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* SMBIOS */
|
||||||
|
|
||||||
|
#define LIMINE_SMBIOS_REQUEST { LIMINE_COMMON_MAGIC, 0x9e9046f11e095391, 0xaa4a520fefbde5ee }
|
||||||
|
|
||||||
|
struct limine_smbios_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) entry_32;
|
||||||
|
LIMINE_PTR(void *) entry_64;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smbios_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_smbios_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* EFI system table */
|
||||||
|
|
||||||
|
#define LIMINE_EFI_SYSTEM_TABLE_REQUEST { LIMINE_COMMON_MAGIC, 0x5ceba5163eaaf6d6, 0x0a6981610cf65fcc }
|
||||||
|
|
||||||
|
struct limine_efi_system_table_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_efi_system_table_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_efi_system_table_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* EFI memory map */
|
||||||
|
|
||||||
|
#define LIMINE_EFI_MEMMAP_REQUEST { LIMINE_COMMON_MAGIC, 0x7df62a431d6872d5, 0xa4fcdfb3e57306c8 }
|
||||||
|
|
||||||
|
struct limine_efi_memmap_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) memmap;
|
||||||
|
uint64_t memmap_size;
|
||||||
|
uint64_t desc_size;
|
||||||
|
uint64_t desc_version;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_efi_memmap_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_efi_memmap_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Boot time */
|
||||||
|
|
||||||
|
#define LIMINE_BOOT_TIME_REQUEST { LIMINE_COMMON_MAGIC, 0x502746e184c088aa, 0xfbc5ec83e6327893 }
|
||||||
|
|
||||||
|
struct limine_boot_time_response {
|
||||||
|
uint64_t revision;
|
||||||
|
int64_t boot_time;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_boot_time_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_boot_time_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Kernel address */
|
||||||
|
|
||||||
|
#define LIMINE_KERNEL_ADDRESS_REQUEST { LIMINE_COMMON_MAGIC, 0x71ba76863cc55f63, 0xb2644a48c516a487 }
|
||||||
|
|
||||||
|
struct limine_kernel_address_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t physical_base;
|
||||||
|
uint64_t virtual_base;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_kernel_address_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_kernel_address_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Device Tree Blob */
|
||||||
|
|
||||||
|
#define LIMINE_DTB_REQUEST { LIMINE_COMMON_MAGIC, 0xb40ddb48fb54bac7, 0x545081493f81ffb7 }
|
||||||
|
|
||||||
|
struct limine_dtb_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) dtb_ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_dtb_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_dtb_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
578
FloridOS/src/limine.h.1
Normal file
578
FloridOS/src/limine.h.1
Normal file
|
|
@ -0,0 +1,578 @@
|
||||||
|
/* BSD Zero Clause License */
|
||||||
|
|
||||||
|
/* Copyright (C) 2022-2023 mintsuki and contributors.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LIMINE_H
|
||||||
|
#define _LIMINE_H 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Misc */
|
||||||
|
|
||||||
|
#ifdef LIMINE_NO_POINTERS
|
||||||
|
# define LIMINE_PTR(TYPE) uint64_t
|
||||||
|
#else
|
||||||
|
# define LIMINE_PTR(TYPE) TYPE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define LIMINE_DEPRECATED __attribute__((__deprecated__))
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_START \
|
||||||
|
_Pragma("GCC diagnostic push") \
|
||||||
|
_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_END \
|
||||||
|
_Pragma("GCC diagnostic pop")
|
||||||
|
#else
|
||||||
|
# define LIMINE_DEPRECATED
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_START
|
||||||
|
# define LIMINE_DEPRECATED_IGNORE_END
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LIMINE_BASE_REVISION(N) \
|
||||||
|
uint64_t limine_base_revision[3] = { 0xf9562b2d5c95a6c8, 0x6a7b384944536bdc, (N) };
|
||||||
|
|
||||||
|
#define LIMINE_BASE_REVISION_SUPPORTED (limine_base_revision[2] == 0)
|
||||||
|
|
||||||
|
#define LIMINE_COMMON_MAGIC 0xc7b1dd30df4c8b88, 0x0a82e883a194f07b
|
||||||
|
|
||||||
|
struct limine_uuid {
|
||||||
|
uint32_t a;
|
||||||
|
uint16_t b;
|
||||||
|
uint16_t c;
|
||||||
|
uint8_t d[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LIMINE_MEDIA_TYPE_GENERIC 0
|
||||||
|
#define LIMINE_MEDIA_TYPE_OPTICAL 1
|
||||||
|
#define LIMINE_MEDIA_TYPE_TFTP 2
|
||||||
|
|
||||||
|
struct limine_file {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
uint64_t size;
|
||||||
|
LIMINE_PTR(char *) path;
|
||||||
|
LIMINE_PTR(char *) cmdline;
|
||||||
|
uint32_t media_type;
|
||||||
|
uint32_t unused;
|
||||||
|
uint32_t tftp_ip;
|
||||||
|
uint32_t tftp_port;
|
||||||
|
uint32_t partition_index;
|
||||||
|
uint32_t mbr_disk_id;
|
||||||
|
struct limine_uuid gpt_disk_uuid;
|
||||||
|
struct limine_uuid gpt_part_uuid;
|
||||||
|
struct limine_uuid part_uuid;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Boot info */
|
||||||
|
|
||||||
|
#define LIMINE_BOOTLOADER_INFO_REQUEST { LIMINE_COMMON_MAGIC, 0xf55038d8e2a1202f, 0x279426fcf5f59740 }
|
||||||
|
|
||||||
|
struct limine_bootloader_info_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(char *) name;
|
||||||
|
LIMINE_PTR(char *) version;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_bootloader_info_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_bootloader_info_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Stack size */
|
||||||
|
|
||||||
|
#define LIMINE_STACK_SIZE_REQUEST { LIMINE_COMMON_MAGIC, 0x224ef0460a8e8926, 0xe1cb0fc25f46ea3d }
|
||||||
|
|
||||||
|
struct limine_stack_size_response {
|
||||||
|
uint64_t revision;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_stack_size_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_stack_size_response *) response;
|
||||||
|
uint64_t stack_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* HHDM */
|
||||||
|
|
||||||
|
#define LIMINE_HHDM_REQUEST { LIMINE_COMMON_MAGIC, 0x48dcf1cb8ad2b852, 0x63984e959a98244b }
|
||||||
|
|
||||||
|
struct limine_hhdm_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_hhdm_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_hhdm_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Framebuffer */
|
||||||
|
|
||||||
|
#define LIMINE_FRAMEBUFFER_REQUEST { LIMINE_COMMON_MAGIC, 0x9d5827dcd881dd75, 0xa3148604f6fab11b }
|
||||||
|
|
||||||
|
#define LIMINE_FRAMEBUFFER_RGB 1
|
||||||
|
|
||||||
|
struct limine_video_mode {
|
||||||
|
uint64_t pitch;
|
||||||
|
uint64_t width;
|
||||||
|
uint64_t height;
|
||||||
|
uint16_t bpp;
|
||||||
|
uint8_t memory_model;
|
||||||
|
uint8_t red_mask_size;
|
||||||
|
uint8_t red_mask_shift;
|
||||||
|
uint8_t green_mask_size;
|
||||||
|
uint8_t green_mask_shift;
|
||||||
|
uint8_t blue_mask_size;
|
||||||
|
uint8_t blue_mask_shift;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_framebuffer {
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
uint64_t width;
|
||||||
|
uint64_t height;
|
||||||
|
uint64_t pitch;
|
||||||
|
uint16_t bpp;
|
||||||
|
uint8_t memory_model;
|
||||||
|
uint8_t red_mask_size;
|
||||||
|
uint8_t red_mask_shift;
|
||||||
|
uint8_t green_mask_size;
|
||||||
|
uint8_t green_mask_shift;
|
||||||
|
uint8_t blue_mask_size;
|
||||||
|
uint8_t blue_mask_shift;
|
||||||
|
uint8_t unused[7];
|
||||||
|
uint64_t edid_size;
|
||||||
|
LIMINE_PTR(void *) edid;
|
||||||
|
/* Response revision 1 */
|
||||||
|
uint64_t mode_count;
|
||||||
|
LIMINE_PTR(struct limine_video_mode **) modes;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_framebuffer_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t framebuffer_count;
|
||||||
|
LIMINE_PTR(struct limine_framebuffer **) framebuffers;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_framebuffer_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_framebuffer_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Terminal */
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_REQUEST { LIMINE_COMMON_MAGIC, 0xc8ac59310c2b0844, 0xa68d0c7265d38878 }
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_CB_DEC 10
|
||||||
|
#define LIMINE_TERMINAL_CB_BELL 20
|
||||||
|
#define LIMINE_TERMINAL_CB_PRIVATE_ID 30
|
||||||
|
#define LIMINE_TERMINAL_CB_STATUS_REPORT 40
|
||||||
|
#define LIMINE_TERMINAL_CB_POS_REPORT 50
|
||||||
|
#define LIMINE_TERMINAL_CB_KBD_LEDS 60
|
||||||
|
#define LIMINE_TERMINAL_CB_MODE 70
|
||||||
|
#define LIMINE_TERMINAL_CB_LINUX 80
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_CTX_SIZE ((uint64_t)(-1))
|
||||||
|
#define LIMINE_TERMINAL_CTX_SAVE ((uint64_t)(-2))
|
||||||
|
#define LIMINE_TERMINAL_CTX_RESTORE ((uint64_t)(-3))
|
||||||
|
#define LIMINE_TERMINAL_FULL_REFRESH ((uint64_t)(-4))
|
||||||
|
|
||||||
|
/* Response revision 1 */
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_GET ((uint64_t)(-10))
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_SET ((uint64_t)(-11))
|
||||||
|
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OCRNL (1 << 0)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OFDEL (1 << 1)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OFILL (1 << 2)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OLCUC (1 << 3)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_ONLCR (1 << 4)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_ONLRET (1 << 5)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_ONOCR (1 << 6)
|
||||||
|
#define LIMINE_TERMINAL_OOB_OUTPUT_OPOST (1 << 7)
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_START
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal;
|
||||||
|
|
||||||
|
typedef void (*limine_terminal_write)(struct limine_terminal *, const char *, uint64_t);
|
||||||
|
typedef void (*limine_terminal_callback)(struct limine_terminal *, uint64_t, uint64_t, uint64_t, uint64_t);
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal {
|
||||||
|
uint64_t columns;
|
||||||
|
uint64_t rows;
|
||||||
|
LIMINE_PTR(struct limine_framebuffer *) framebuffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t terminal_count;
|
||||||
|
LIMINE_PTR(struct limine_terminal **) terminals;
|
||||||
|
LIMINE_PTR(limine_terminal_write) write;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_terminal_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_terminal_response *) response;
|
||||||
|
LIMINE_PTR(limine_terminal_callback) callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_END
|
||||||
|
|
||||||
|
/* Paging mode */
|
||||||
|
|
||||||
|
#define LIMINE_PAGING_MODE_REQUEST { LIMINE_COMMON_MAGIC, 0x95c1a0edab0944cb, 0xa4e5cb3842f7488a }
|
||||||
|
|
||||||
|
#if defined (__x86_64__) || defined (__i386__)
|
||||||
|
#define LIMINE_PAGING_MODE_X86_64_4LVL 0
|
||||||
|
#define LIMINE_PAGING_MODE_X86_64_5LVL 1
|
||||||
|
#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_X86_64_5LVL
|
||||||
|
#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_X86_64_4LVL
|
||||||
|
#elif defined (__aarch64__)
|
||||||
|
#define LIMINE_PAGING_MODE_AARCH64_4LVL 0
|
||||||
|
#define LIMINE_PAGING_MODE_AARCH64_5LVL 1
|
||||||
|
#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_AARCH64_5LVL
|
||||||
|
#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_AARCH64_4LVL
|
||||||
|
#elif defined (__riscv) && (__riscv_xlen == 64)
|
||||||
|
#define LIMINE_PAGING_MODE_RISCV_SV39 0
|
||||||
|
#define LIMINE_PAGING_MODE_RISCV_SV48 1
|
||||||
|
#define LIMINE_PAGING_MODE_RISCV_SV57 2
|
||||||
|
#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_RISCV_SV57
|
||||||
|
#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_RISCV_SV48
|
||||||
|
#else
|
||||||
|
#error Unknown architecture
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct limine_paging_mode_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t mode;
|
||||||
|
uint64_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_paging_mode_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_paging_mode_response *) response;
|
||||||
|
uint64_t mode;
|
||||||
|
uint64_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 5-level paging */
|
||||||
|
|
||||||
|
#define LIMINE_5_LEVEL_PAGING_REQUEST { LIMINE_COMMON_MAGIC, 0x94469551da9b3192, 0xebe5e86db7382888 }
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_START
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_5_level_paging_response {
|
||||||
|
uint64_t revision;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LIMINE_DEPRECATED limine_5_level_paging_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_5_level_paging_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
LIMINE_DEPRECATED_IGNORE_END
|
||||||
|
|
||||||
|
/* SMP */
|
||||||
|
|
||||||
|
#define LIMINE_SMP_REQUEST { LIMINE_COMMON_MAGIC, 0x95a67b819a1b857e, 0xa0b61b723b6a73e0 }
|
||||||
|
|
||||||
|
struct limine_smp_info;
|
||||||
|
|
||||||
|
typedef void (*limine_goto_address)(struct limine_smp_info *);
|
||||||
|
|
||||||
|
#if defined (__x86_64__) || defined (__i386__)
|
||||||
|
|
||||||
|
#define LIMINE_SMP_X2APIC (1 << 0)
|
||||||
|
|
||||||
|
struct limine_smp_info {
|
||||||
|
uint32_t processor_id;
|
||||||
|
uint32_t lapic_id;
|
||||||
|
uint64_t reserved;
|
||||||
|
LIMINE_PTR(limine_goto_address) goto_address;
|
||||||
|
uint64_t extra_argument;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint32_t flags;
|
||||||
|
uint32_t bsp_lapic_id;
|
||||||
|
uint64_t cpu_count;
|
||||||
|
LIMINE_PTR(struct limine_smp_info **) cpus;
|
||||||
|
};
|
||||||
|
|
||||||
|
#elif defined (__aarch64__)
|
||||||
|
|
||||||
|
struct limine_smp_info {
|
||||||
|
uint32_t processor_id;
|
||||||
|
uint32_t gic_iface_no;
|
||||||
|
uint64_t mpidr;
|
||||||
|
uint64_t reserved;
|
||||||
|
LIMINE_PTR(limine_goto_address) goto_address;
|
||||||
|
uint64_t extra_argument;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t flags;
|
||||||
|
uint64_t bsp_mpidr;
|
||||||
|
uint64_t cpu_count;
|
||||||
|
LIMINE_PTR(struct limine_smp_info **) cpus;
|
||||||
|
};
|
||||||
|
|
||||||
|
#elif defined (__riscv) && (__riscv_xlen == 64)
|
||||||
|
|
||||||
|
struct limine_smp_info {
|
||||||
|
uint64_t processor_id;
|
||||||
|
uint64_t hartid;
|
||||||
|
uint64_t reserved;
|
||||||
|
LIMINE_PTR(limine_goto_address) goto_address;
|
||||||
|
uint64_t extra_argument;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t flags;
|
||||||
|
uint64_t bsp_hartid;
|
||||||
|
uint64_t cpu_count;
|
||||||
|
LIMINE_PTR(struct limine_smp_info **) cpus;
|
||||||
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error Unknown architecture
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct limine_smp_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_smp_response *) response;
|
||||||
|
uint64_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Memory map */
|
||||||
|
|
||||||
|
#define LIMINE_MEMMAP_REQUEST { LIMINE_COMMON_MAGIC, 0x67cf3d9d378a806f, 0xe304acdfc50c3c62 }
|
||||||
|
|
||||||
|
#define LIMINE_MEMMAP_USABLE 0
|
||||||
|
#define LIMINE_MEMMAP_RESERVED 1
|
||||||
|
#define LIMINE_MEMMAP_ACPI_RECLAIMABLE 2
|
||||||
|
#define LIMINE_MEMMAP_ACPI_NVS 3
|
||||||
|
#define LIMINE_MEMMAP_BAD_MEMORY 4
|
||||||
|
#define LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE 5
|
||||||
|
#define LIMINE_MEMMAP_KERNEL_AND_MODULES 6
|
||||||
|
#define LIMINE_MEMMAP_FRAMEBUFFER 7
|
||||||
|
|
||||||
|
struct limine_memmap_entry {
|
||||||
|
uint64_t base;
|
||||||
|
uint64_t length;
|
||||||
|
uint64_t type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_memmap_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t entry_count;
|
||||||
|
LIMINE_PTR(struct limine_memmap_entry **) entries;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_memmap_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_memmap_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Entry point */
|
||||||
|
|
||||||
|
#define LIMINE_ENTRY_POINT_REQUEST { LIMINE_COMMON_MAGIC, 0x13d86c035a1cd3e1, 0x2b0caa89d8f3026a }
|
||||||
|
|
||||||
|
typedef void (*limine_entry_point)(void);
|
||||||
|
|
||||||
|
struct limine_entry_point_response {
|
||||||
|
uint64_t revision;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_entry_point_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_entry_point_response *) response;
|
||||||
|
LIMINE_PTR(limine_entry_point) entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Kernel File */
|
||||||
|
|
||||||
|
#define LIMINE_KERNEL_FILE_REQUEST { LIMINE_COMMON_MAGIC, 0xad97e90e83f1ed67, 0x31eb5d1c5ff23b69 }
|
||||||
|
|
||||||
|
struct limine_kernel_file_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_file *) kernel_file;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_kernel_file_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_kernel_file_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Module */
|
||||||
|
|
||||||
|
#define LIMINE_MODULE_REQUEST { LIMINE_COMMON_MAGIC, 0x3e7e279702be32af, 0xca1c4f3bd1280cee }
|
||||||
|
|
||||||
|
#define LIMINE_INTERNAL_MODULE_REQUIRED (1 << 0)
|
||||||
|
|
||||||
|
struct limine_internal_module {
|
||||||
|
LIMINE_PTR(const char *) path;
|
||||||
|
LIMINE_PTR(const char *) cmdline;
|
||||||
|
uint64_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_module_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t module_count;
|
||||||
|
LIMINE_PTR(struct limine_file **) modules;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_module_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_module_response *) response;
|
||||||
|
|
||||||
|
/* Request revision 1 */
|
||||||
|
uint64_t internal_module_count;
|
||||||
|
LIMINE_PTR(struct limine_internal_module **) internal_modules;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* RSDP */
|
||||||
|
|
||||||
|
#define LIMINE_RSDP_REQUEST { LIMINE_COMMON_MAGIC, 0xc5e77b6b397e7b43, 0x27637845accdcf3c }
|
||||||
|
|
||||||
|
struct limine_rsdp_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_rsdp_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_rsdp_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* SMBIOS */
|
||||||
|
|
||||||
|
#define LIMINE_SMBIOS_REQUEST { LIMINE_COMMON_MAGIC, 0x9e9046f11e095391, 0xaa4a520fefbde5ee }
|
||||||
|
|
||||||
|
struct limine_smbios_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) entry_32;
|
||||||
|
LIMINE_PTR(void *) entry_64;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_smbios_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_smbios_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* EFI system table */
|
||||||
|
|
||||||
|
#define LIMINE_EFI_SYSTEM_TABLE_REQUEST { LIMINE_COMMON_MAGIC, 0x5ceba5163eaaf6d6, 0x0a6981610cf65fcc }
|
||||||
|
|
||||||
|
struct limine_efi_system_table_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) address;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_efi_system_table_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_efi_system_table_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* EFI memory map */
|
||||||
|
|
||||||
|
#define LIMINE_EFI_MEMMAP_REQUEST { LIMINE_COMMON_MAGIC, 0x7df62a431d6872d5, 0xa4fcdfb3e57306c8 }
|
||||||
|
|
||||||
|
struct limine_efi_memmap_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) memmap;
|
||||||
|
uint64_t memmap_size;
|
||||||
|
uint64_t desc_size;
|
||||||
|
uint64_t desc_version;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_efi_memmap_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_efi_memmap_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Boot time */
|
||||||
|
|
||||||
|
#define LIMINE_BOOT_TIME_REQUEST { LIMINE_COMMON_MAGIC, 0x502746e184c088aa, 0xfbc5ec83e6327893 }
|
||||||
|
|
||||||
|
struct limine_boot_time_response {
|
||||||
|
uint64_t revision;
|
||||||
|
int64_t boot_time;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_boot_time_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_boot_time_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Kernel address */
|
||||||
|
|
||||||
|
#define LIMINE_KERNEL_ADDRESS_REQUEST { LIMINE_COMMON_MAGIC, 0x71ba76863cc55f63, 0xb2644a48c516a487 }
|
||||||
|
|
||||||
|
struct limine_kernel_address_response {
|
||||||
|
uint64_t revision;
|
||||||
|
uint64_t physical_base;
|
||||||
|
uint64_t virtual_base;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_kernel_address_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_kernel_address_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Device Tree Blob */
|
||||||
|
|
||||||
|
#define LIMINE_DTB_REQUEST { LIMINE_COMMON_MAGIC, 0xb40ddb48fb54bac7, 0x545081493f81ffb7 }
|
||||||
|
|
||||||
|
struct limine_dtb_response {
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(void *) dtb_ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct limine_dtb_request {
|
||||||
|
uint64_t id[4];
|
||||||
|
uint64_t revision;
|
||||||
|
LIMINE_PTR(struct limine_dtb_response *) response;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
69
FloridOS/src/shell/commands.c
Normal file
69
FloridOS/src/shell/commands.c
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
#include "shell.h"
|
||||||
|
#include "drivers/terminal.h"
|
||||||
|
|
||||||
|
/* --- Utilities --- */
|
||||||
|
|
||||||
|
int strcmp(const char *s1, const char *s2) {
|
||||||
|
while (*s1 && (*s1 == *s2)) {
|
||||||
|
s1++; s2++;
|
||||||
|
}
|
||||||
|
return *(const unsigned char *)s1 - *(const unsigned char *)s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int startswith(const char *str, const char *prefix) {
|
||||||
|
while (*prefix) {
|
||||||
|
if (*prefix++ != *str++) return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- Command Handlers --- */
|
||||||
|
|
||||||
|
void run_mofi() {
|
||||||
|
terminal_writestring("Entering MOFI editor...\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_fds() {
|
||||||
|
terminal_writestring("Searching Florid Root...\n");
|
||||||
|
terminal_writestring("/boot /sys /kernel /mofi_data\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_obliterate(char* target) {
|
||||||
|
terminal_writestring("OBLITERATING: ");
|
||||||
|
terminal_writestring(target);
|
||||||
|
terminal_writestring("... SUCCESS.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_install() {
|
||||||
|
terminal_writestring("Searching for target disk...\n");
|
||||||
|
terminal_writestring("Formatting /dev/sda as FloridFS...\n");
|
||||||
|
terminal_writestring("Copying kernel bytes... [##########] 100%\n");
|
||||||
|
terminal_writestring("Installation complete. Remove Live CD and reboot.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- The Interpreter (The If/Else Chain) --- */
|
||||||
|
|
||||||
|
void interpret_command(char* cmd) {
|
||||||
|
if (strcmp(cmd, "fds") == 0) {
|
||||||
|
handle_fds();
|
||||||
|
}
|
||||||
|
else if (strcmp(cmd, "frua") == 0) {
|
||||||
|
terminal_writestring("ROOT ACCESS GRANTED.\n");
|
||||||
|
}
|
||||||
|
else if (strcmp(cmd, "mofi") == 0) {
|
||||||
|
run_mofi();
|
||||||
|
}
|
||||||
|
else if (strcmp(cmd, "install") == 0) {
|
||||||
|
handle_install();
|
||||||
|
}
|
||||||
|
else if (startswith(cmd, "obliterate ")) {
|
||||||
|
handle_obliterate(cmd + 11);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
terminal_writestring("Unknown command. Try 'fds' or 'install'.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void shell_init(void) {
|
||||||
|
terminal_writestring("Florid Shell Initialized.\n");
|
||||||
|
}
|
||||||
7
FloridOS/src/shell/shell.h
Normal file
7
FloridOS/src/shell/shell.h
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef SHELL_H
|
||||||
|
#define SHELL_H
|
||||||
|
|
||||||
|
void shell_init(void);
|
||||||
|
void interpret_command(char* input);
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
Reference in a new issue