mirror of
https://github.com/pixelyblah/florid-os.git
synced 2026-05-15 11:38:40 +00:00
Delete FloridOS directory
This commit is contained in:
parent
14e09f5034
commit
88522a2f34
41 changed files with 0 additions and 5514 deletions
Binary file not shown.
|
|
@ -1,40 +0,0 @@
|
||||||
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
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,5 +0,0 @@
|
||||||
TIMEOUT=3
|
|
||||||
|
|
||||||
:Florid OS
|
|
||||||
PROTOCOL=limine
|
|
||||||
KERNEL_PATH=boot:///kernel
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
TIMEOUT=3
|
|
||||||
|
|
||||||
:Florid OS
|
|
||||||
PROTOCOL=limine
|
|
||||||
KERNEL_PATH=boot:///kernel
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,22 +0,0 @@
|
||||||
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.
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
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 $@
|
|
||||||
|
|
@ -1,541 +0,0 @@
|
||||||
#!/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:
|
|
||||||
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
|
|
@ -1,609 +0,0 @@
|
||||||
/* 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
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
ENTRY(_start)
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
. = 0xffffffff80000000;
|
|
||||||
|
|
||||||
.text : { *(.text .text.*) }
|
|
||||||
.rodata : { *(.rodata .rodata.*) }
|
|
||||||
.data : { *(.data .data.*) }
|
|
||||||
.bss : { *(.bss .bss.*) *(COMMON) }
|
|
||||||
}
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
#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
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
#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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
#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
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
#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);
|
|
||||||
}
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
#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
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
||||||
#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]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
#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
|
|
||||||
|
|
@ -1,131 +0,0 @@
|
||||||
#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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,609 +0,0 @@
|
||||||
/* 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
|
|
||||||
|
|
@ -1,578 +0,0 @@
|
||||||
/* 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
|
|
||||||
|
|
@ -1,69 +0,0 @@
|
||||||
#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");
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
#ifndef SHELL_H
|
|
||||||
#define SHELL_H
|
|
||||||
|
|
||||||
void shell_init(void);
|
|
||||||
void interpret_command(char* input);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Loading…
Reference in a new issue