mirror of
https://github.com/EnderIce2/Fennix.git
synced 2025-07-01 18:39:16 +00:00
Compare commits
11 Commits
04edfd46bb
...
Kernel-mem
Author | SHA1 | Date | |
---|---|---|---|
b4c0a78c6c
|
|||
653f5a6042
|
|||
b348932172
|
|||
47cf2c24d1
|
|||
7811c21971
|
|||
c4798a69b1
|
|||
abb9ff0517
|
|||
2fbb8e3df2
|
|||
9a22cfe02e
|
|||
7bff9f260e
|
|||
a32ca16d2b
|
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@ -3,7 +3,7 @@
|
|||||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
patreon: # Replace with a single Patreon username
|
patreon: # Replace with a single Patreon username
|
||||||
open_collective: # Replace with a single Open Collective username
|
open_collective: # Replace with a single Open Collective username
|
||||||
ko_fi: # Replace with a single Ko-fi username
|
ko_fi: EnderIce2 # Replace with a single Ko-fi username
|
||||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||||
liberapay: # Replace with a single Liberapay username
|
liberapay: # Replace with a single Liberapay username
|
||||||
|
86
.github/workflows/codeql.yml
vendored
86
.github/workflows/codeql.yml
vendored
@ -1,86 +0,0 @@
|
|||||||
name: "CodeQL Advanced"
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ "master" ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ "master" ]
|
|
||||||
schedule:
|
|
||||||
- cron: '27 20 * * 0'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
analyze:
|
|
||||||
name: Analyze (${{ matrix.language }})
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
security-events: write
|
|
||||||
packages: read
|
|
||||||
actions: read
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- language: c-cpp
|
|
||||||
build-mode: manual
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Check for cache
|
|
||||||
id: check-cache
|
|
||||||
run: |
|
|
||||||
if [ -z "${{ runner.os }}-cross-${{ hashFiles('tools/Makefile') }}" ]; then
|
|
||||||
echo "No cache found, cancelling job."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
|
||||||
uses: github/codeql-action/init@v3
|
|
||||||
with:
|
|
||||||
languages: ${{ matrix.language }}
|
|
||||||
build-mode: ${{ matrix.build-mode }}
|
|
||||||
|
|
||||||
- if: matrix.build-mode == 'manual'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo 'If you are using a "manual" build mode for one or more of the' \
|
|
||||||
'languages you are analyzing, replace this with the commands to build' \
|
|
||||||
'your code, for example:'
|
|
||||||
echo ' make bootstrap'
|
|
||||||
echo ' make release'
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
- name: Install Packages
|
|
||||||
run: |
|
|
||||||
sudo apt update
|
|
||||||
sudo apt -y install rustc xorriso mtools genisoimage ovmf nasm doxygen make gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 mingw-w64 build-essential bison flex libgmp3-dev libmpc-dev libmpfr-dev texinfo
|
|
||||||
make --quiet -C tools do_limine
|
|
||||||
make --quiet -C Drivers prepare
|
|
||||||
make --quiet -C Userspace prepare
|
|
||||||
make --quiet -C Kernel prepare
|
|
||||||
|
|
||||||
- name: Cache cross
|
|
||||||
id: cache-cross
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: tools/cross
|
|
||||||
key: ${{ runner.os }}-cross-${{ hashFiles('tools/Makefile') }}
|
|
||||||
|
|
||||||
- name: Build OS
|
|
||||||
run: |
|
|
||||||
make build_userspace
|
|
||||||
make build_drivers
|
|
||||||
make build_kernel
|
|
||||||
make build_userspace
|
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
|
||||||
uses: github/codeql-action/analyze@v3
|
|
||||||
with:
|
|
||||||
category: "/language:${{matrix.language}}"
|
|
34
.github/workflows/docs.yml
vendored
34
.github/workflows/docs.yml
vendored
@ -1,34 +0,0 @@
|
|||||||
name: Deploy Documentation
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
deploydoc:
|
|
||||||
name: Deploy Documentation to GitHub Pages
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
|
|
||||||
- name: Update System
|
|
||||||
run: sudo apt update
|
|
||||||
|
|
||||||
- name: Install Doxygen
|
|
||||||
run: sudo apt -y install doxygen make
|
|
||||||
|
|
||||||
- name: Generate Documentation
|
|
||||||
run: make doxygen
|
|
||||||
|
|
||||||
- name: Copy GitHub Pages Website
|
|
||||||
run: cp -r tools/website/* doxygen-doc/
|
|
||||||
|
|
||||||
- name: Deploy documentation
|
|
||||||
uses: JamesIves/github-pages-deploy-action@v4
|
|
||||||
with:
|
|
||||||
folder: doxygen-doc
|
|
215
.github/workflows/makefile.yml
vendored
215
.github/workflows/makefile.yml
vendored
@ -7,6 +7,29 @@ on:
|
|||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
deploydoc:
|
||||||
|
name: Deploy Documentation to GitHub Pages
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Install Doxygen
|
||||||
|
run: sudo apt-get install doxygen make -y
|
||||||
|
|
||||||
|
- name: Generate Documentation
|
||||||
|
run: make doxygen
|
||||||
|
|
||||||
|
- name: Copy GitHub Pages Website
|
||||||
|
run: cp -r tools/website/* doxygen-doc/
|
||||||
|
|
||||||
|
- name: Deploy documentation
|
||||||
|
uses: JamesIves/github-pages-deploy-action@v4
|
||||||
|
with:
|
||||||
|
folder: doxygen-doc
|
||||||
|
|
||||||
buildcompiler:
|
buildcompiler:
|
||||||
name: Build Cross-Compiler & Toolchain
|
name: Build Cross-Compiler & Toolchain
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -24,56 +47,129 @@ jobs:
|
|||||||
|
|
||||||
- name: Update System
|
- name: Update System
|
||||||
if: steps.cache-cross.outputs.cache-hit != 'true'
|
if: steps.cache-cross.outputs.cache-hit != 'true'
|
||||||
run: sudo apt update
|
run: sudo apt-get update
|
||||||
|
|
||||||
- name: Install GCC Dependencies
|
- name: Install GCC Dependencies
|
||||||
if: steps.cache-cross.outputs.cache-hit != 'true'
|
if: steps.cache-cross.outputs.cache-hit != 'true'
|
||||||
run: sudo apt -y install build-essential bison flex libgmp3-dev libmpc-dev libmpfr-dev texinfo libzstd-dev libisl-dev m4 automake gettext gperf dejagnu guile-3.0 guile-3.0-dev expect tcl autogen tex-common sphinx-common git ssh diffutils patch autoconf2.69 libtool wget dpkg
|
run: sudo apt install build-essential bison flex libgmp3-dev libmpc-dev libmpfr-dev texinfo libzstd-dev libisl-dev autoconf m4 automake gettext gperf dejagnu guile-3.0 guile-3.0-dev expect tcl autogen tex-common sphinx-common git ssh diffutils patch -y
|
||||||
|
|
||||||
- name: Check autoconf
|
|
||||||
if: steps.cache-cross.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
if [ "$(autoconf --version | head -n 1 | awk '{print $NF}')" != "2.69" ]; then
|
|
||||||
echo "Autoconf version is not 2.69, performing additional steps..."
|
|
||||||
wget https://launchpad.net/ubuntu/+archive/primary/+files/autoconf_2.69-11.1_all.deb
|
|
||||||
sudo dpkg --force-all -i ./autoconf_2.69-11.1_all.deb
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Check automake
|
|
||||||
if: steps.cache-cross.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
if [ "$(automake --version | head -n 1 | awk '{print $NF}')" != "1.15.1" ]; then
|
|
||||||
echo "Automake version is not 1.15.1, performing additional steps..."
|
|
||||||
wget https://ftp.gnu.org/gnu/automake/automake-1.15.1.tar.gz
|
|
||||||
tar -xzf automake-1.15.1.tar.gz
|
|
||||||
cd automake-1.15.1
|
|
||||||
./configure
|
|
||||||
make
|
|
||||||
sudo make install
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Clone All
|
- name: Clone All
|
||||||
if: steps.cache-cross.outputs.cache-hit != 'true'
|
if: steps.cache-cross.outputs.cache-hit != 'true'
|
||||||
run: make --quiet -C tools __clone_all_no_qemu
|
run: make --quiet -C tools __clone_all_no_qemu
|
||||||
|
|
||||||
- name: Compile Binutils
|
- name: Compile Binutils amd64
|
||||||
if: steps.cache-cross.outputs.cache-hit != 'true'
|
if: steps.cache-cross.outputs.cache-hit != 'true'
|
||||||
run: make --quiet -C tools do_binutils
|
run: make --quiet -C tools do_binutils_64
|
||||||
|
|
||||||
- name: Compile GCC
|
- name: Compile Binutils i386
|
||||||
if: steps.cache-cross.outputs.cache-hit != 'true'
|
if: steps.cache-cross.outputs.cache-hit != 'true'
|
||||||
run: make --quiet -C tools do_gcc
|
run: make --quiet -C tools do_binutils_32
|
||||||
|
|
||||||
|
- name: Compile GCC amd64
|
||||||
|
if: steps.cache-cross.outputs.cache-hit != 'true'
|
||||||
|
run: make --quiet -C tools do_gcc_64
|
||||||
|
|
||||||
|
- name: Compile GCC i386
|
||||||
|
if: steps.cache-cross.outputs.cache-hit != 'true'
|
||||||
|
run: make --quiet -C tools do_gcc_32
|
||||||
|
|
||||||
- name: Clean Up
|
- name: Clean Up
|
||||||
if: steps.cache-cross.outputs.cache-hit != 'true'
|
if: steps.cache-cross.outputs.cache-hit != 'true'
|
||||||
run: |
|
run: |
|
||||||
cd tools
|
cd tools
|
||||||
rm -rf binutils-gdb gcc
|
rm -rf binutils-gdb gcc build-binutils64 build-gcc64 build-binutils32 build-gcc32
|
||||||
|
|
||||||
|
compilegnuefi:
|
||||||
|
name: Build GNU-EFI
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Cache gnu-efi Folder
|
||||||
|
id: cache-gnuefi
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: Lynx/gnu-efi
|
||||||
|
key: ${{ runner.os }}-gnuefi-${{ hashFiles('Lynx/Makefile') }}
|
||||||
|
|
||||||
|
- name: Update System
|
||||||
|
if: steps.cache-gnuefi.outputs.cache-hit != 'true'
|
||||||
|
run: sudo apt-get update
|
||||||
|
|
||||||
|
- name: Install MinGW compiler
|
||||||
|
if: steps.cache-gnuefi.outputs.cache-hit != 'true'
|
||||||
|
run: sudo apt-get install make gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 mingw-w64 -y
|
||||||
|
|
||||||
|
- name: Get GNU-EFI source code and compile it
|
||||||
|
if: steps.cache-gnuefi.outputs.cache-hit != 'true'
|
||||||
|
run: make --quiet -C Lynx prepare
|
||||||
|
|
||||||
|
analyze:
|
||||||
|
name: Analyze with CodeQL
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [buildcompiler, compilegnuefi]
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: [ 'cpp' ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v2
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
|
||||||
|
- name: Install Packages
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install rustc xorriso mtools genisoimage ovmf nasm doxygen make gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 mingw-w64 build-essential bison flex libgmp3-dev libmpc-dev libmpfr-dev texinfo -y
|
||||||
|
make --quiet -C tools do_limine
|
||||||
|
make --quiet -C Drivers prepare
|
||||||
|
make --quiet -C Userspace prepare
|
||||||
|
make --quiet -C Lynx prepare
|
||||||
|
make --quiet -C Kernel prepare
|
||||||
|
|
||||||
|
- name: Cache cross
|
||||||
|
id: cache-cross
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: tools/cross
|
||||||
|
key: ${{ runner.os }}-cross-${{ hashFiles('tools/Makefile') }}
|
||||||
|
|
||||||
|
- name: Cache gnuefi
|
||||||
|
id: cache-gnuefi
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: Lynx/gnu-efi
|
||||||
|
key: ${{ runner.os }}-gnuefi-${{ hashFiles('Lynx/Makefile') }}
|
||||||
|
|
||||||
|
- name: Build OS
|
||||||
|
run: |
|
||||||
|
make build_lynx
|
||||||
|
make build_userspace
|
||||||
|
make build_drivers
|
||||||
|
make build_kernel
|
||||||
|
make build_userspace
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v2
|
||||||
|
|
||||||
compile64:
|
compile64:
|
||||||
name: Build amd64
|
name: Build amd64
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [buildcompiler]
|
needs: [buildcompiler, compilegnuefi]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@ -81,11 +177,12 @@ jobs:
|
|||||||
|
|
||||||
- name: Update & Install Required Packages
|
- name: Update & Install Required Packages
|
||||||
run: |
|
run: |
|
||||||
sudo apt update
|
sudo apt-get update
|
||||||
sudo apt install rustc xorriso mtools genisoimage ovmf nasm doxygen make meson gcc-10 g++-10 gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 mingw-w64 -y
|
sudo apt-get install rustc xorriso mtools genisoimage ovmf nasm doxygen make meson gcc-10 g++-10 gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 mingw-w64 -y
|
||||||
make --quiet -C tools do_limine
|
make --quiet -C tools do_limine
|
||||||
make --quiet -C Drivers prepare
|
make --quiet -C Drivers prepare
|
||||||
make --quiet -C Userspace prepare
|
make --quiet -C Userspace prepare
|
||||||
|
make --quiet -C Lynx prepare
|
||||||
make --quiet -C Kernel prepare
|
make --quiet -C Kernel prepare
|
||||||
|
|
||||||
- name: Cache cross Folder
|
- name: Cache cross Folder
|
||||||
@ -95,15 +192,22 @@ jobs:
|
|||||||
path: tools/cross
|
path: tools/cross
|
||||||
key: ${{ runner.os }}-cross-${{ hashFiles('tools/Makefile') }}
|
key: ${{ runner.os }}-cross-${{ hashFiles('tools/Makefile') }}
|
||||||
|
|
||||||
- name: Configure config.mk
|
- name: Cache gnu-efi Folder
|
||||||
run: sed -i 's/.*OSARCH = .*/OSARCH = amd64/' ./config.mk && cat config.mk | grep OSARCH
|
id: cache-gnuefi
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: Lynx/gnu-efi
|
||||||
|
key: ${{ runner.os }}-gnuefi-${{ hashFiles('Lynx/Makefile') }}
|
||||||
|
|
||||||
|
- name: Configure Makefile.conf
|
||||||
|
run: sed -i 's/.*OSARCH = .*/OSARCH = amd64/' ./Makefile.conf && cat Makefile.conf | grep OSARCH
|
||||||
|
|
||||||
- name: Compile Debug and Release ISO
|
- name: Compile Debug and Release ISO
|
||||||
run: |
|
run: |
|
||||||
make build
|
make build
|
||||||
mv Fennix.iso Fennix-debug.iso
|
mv Fennix.iso Fennix-debug.iso
|
||||||
make clean
|
make clean
|
||||||
sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./config.mk && cat config.mk | grep DEBUG
|
sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./Makefile.conf && cat Makefile.conf | grep DEBUG
|
||||||
make build
|
make build
|
||||||
mv Fennix.iso Fennix-release.iso
|
mv Fennix.iso Fennix-release.iso
|
||||||
|
|
||||||
@ -122,7 +226,7 @@ jobs:
|
|||||||
compile32:
|
compile32:
|
||||||
name: Build i386
|
name: Build i386
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [buildcompiler]
|
needs: [buildcompiler, compilegnuefi]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@ -130,11 +234,12 @@ jobs:
|
|||||||
|
|
||||||
- name: Update & Install Required Packages
|
- name: Update & Install Required Packages
|
||||||
run: |
|
run: |
|
||||||
sudo apt update
|
sudo apt-get update
|
||||||
sudo apt install rustc xorriso mtools genisoimage ovmf nasm doxygen make meson gcc-10 g++-10 gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 mingw-w64 -y
|
sudo apt-get install rustc xorriso mtools genisoimage ovmf nasm doxygen make meson gcc-10 g++-10 gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 mingw-w64 -y
|
||||||
make --quiet -C tools do_limine
|
make --quiet -C tools do_limine
|
||||||
make --quiet -C Drivers prepare
|
make --quiet -C Drivers prepare
|
||||||
make --quiet -C Userspace prepare
|
make --quiet -C Userspace prepare
|
||||||
|
make --quiet -C Lynx prepare
|
||||||
make --quiet -C Kernel prepare
|
make --quiet -C Kernel prepare
|
||||||
|
|
||||||
- name: Cache cross Folder
|
- name: Cache cross Folder
|
||||||
@ -144,15 +249,22 @@ jobs:
|
|||||||
path: tools/cross
|
path: tools/cross
|
||||||
key: ${{ runner.os }}-cross-${{ hashFiles('tools/Makefile') }}
|
key: ${{ runner.os }}-cross-${{ hashFiles('tools/Makefile') }}
|
||||||
|
|
||||||
- name: Configure config.mk
|
- name: Cache gnu-efi Folder
|
||||||
run: sed -i 's/.*OSARCH = .*/OSARCH = i386/' ./config.mk && cat config.mk | grep OSARCH
|
id: cache-gnuefi
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: Lynx/gnu-efi
|
||||||
|
key: ${{ runner.os }}-gnuefi-${{ hashFiles('Lynx/Makefile') }}
|
||||||
|
|
||||||
|
- name: Configure Makefile.conf
|
||||||
|
run: sed -i 's/.*OSARCH = .*/OSARCH = i386/' ./Makefile.conf && cat Makefile.conf | grep OSARCH
|
||||||
|
|
||||||
- name: Compile Debug and Release ISO
|
- name: Compile Debug and Release ISO
|
||||||
run: |
|
run: |
|
||||||
make build
|
make build
|
||||||
mv Fennix.iso Fennix-debug.iso
|
mv Fennix.iso Fennix-debug.iso
|
||||||
make clean
|
make clean
|
||||||
sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./config.mk && cat config.mk | grep DEBUG
|
sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./Makefile.conf && cat Makefile.conf | grep DEBUG
|
||||||
make build
|
make build
|
||||||
mv Fennix.iso Fennix-release.iso
|
mv Fennix.iso Fennix-release.iso
|
||||||
|
|
||||||
@ -169,9 +281,10 @@ jobs:
|
|||||||
path: Fennix-release.iso
|
path: Fennix-release.iso
|
||||||
|
|
||||||
compilearm64:
|
compilearm64:
|
||||||
|
if: ${{ false }} # Disabled until we can get it to work
|
||||||
name: Build aarch64
|
name: Build aarch64
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [buildcompiler]
|
needs: [buildcompiler, compilegnuefi]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@ -179,11 +292,12 @@ jobs:
|
|||||||
|
|
||||||
- name: Update & Install Required Packages
|
- name: Update & Install Required Packages
|
||||||
run: |
|
run: |
|
||||||
sudo apt update
|
sudo apt-get update
|
||||||
sudo apt install rustc xorriso mtools genisoimage ovmf nasm doxygen make meson gcc-10 g++-10 gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 mingw-w64 -y
|
sudo apt-get install rustc xorriso mtools genisoimage ovmf nasm doxygen make meson gcc-10 g++-10 gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 mingw-w64 -y
|
||||||
make --quiet -C tools do_limine
|
make --quiet -C tools do_limine
|
||||||
make --quiet -C Drivers prepare
|
make --quiet -C Drivers prepare
|
||||||
make --quiet -C Userspace prepare
|
make --quiet -C Userspace prepare
|
||||||
|
make --quiet -C Lynx prepare
|
||||||
make --quiet -C Kernel prepare
|
make --quiet -C Kernel prepare
|
||||||
|
|
||||||
- name: Cache cross Folder
|
- name: Cache cross Folder
|
||||||
@ -193,15 +307,22 @@ jobs:
|
|||||||
path: tools/cross
|
path: tools/cross
|
||||||
key: ${{ runner.os }}-cross-${{ hashFiles('tools/Makefile') }}
|
key: ${{ runner.os }}-cross-${{ hashFiles('tools/Makefile') }}
|
||||||
|
|
||||||
- name: Configure config.mk
|
- name: Cache gnu-efi Folder
|
||||||
run: sed -i 's/.*OSARCH = .*/OSARCH = aarch64/' ./config.mk && cat config.mk | grep OSARCH
|
id: cache-gnuefi
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: Lynx/gnu-efi
|
||||||
|
key: ${{ runner.os }}-gnuefi-${{ hashFiles('Lynx/Makefile') }}
|
||||||
|
|
||||||
|
- name: Configure Makefile.conf
|
||||||
|
run: sed -i 's/.*OSARCH = .*/OSARCH = aarch64/' ./Makefile.conf && cat Makefile.conf | grep OSARCH
|
||||||
|
|
||||||
- name: Compile Debug and Release ISO
|
- name: Compile Debug and Release ISO
|
||||||
run: |
|
run: |
|
||||||
make build
|
make build
|
||||||
mv Fennix.iso Fennix-debug.iso
|
mv Fennix.iso Fennix-debug.iso
|
||||||
make clean
|
make clean
|
||||||
sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./config.mk && cat config.mk | grep DEBUG
|
sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./Makefile.conf && cat Makefile.conf | grep DEBUG
|
||||||
make build
|
make build
|
||||||
mv Fennix.iso Fennix-release.iso
|
mv Fennix.iso Fennix-release.iso
|
||||||
|
|
||||||
|
7
.gitignore
vendored
7
.gitignore
vendored
@ -6,16 +6,14 @@ tools/*
|
|||||||
!tools/ExtMemDbg
|
!tools/ExtMemDbg
|
||||||
!tools/stage2_eltorito
|
!tools/stage2_eltorito
|
||||||
!tools/*.md
|
!tools/*.md
|
||||||
|
!tools/*.css
|
||||||
!tools/README.md
|
!tools/README.md
|
||||||
!tools/website
|
!tools/website
|
||||||
!tools/Makefile
|
!tools/Makefile
|
||||||
!tools/*.c
|
!tools/*.c
|
||||||
!tools/*.patch
|
|
||||||
!tools/*.cpp
|
!tools/*.cpp
|
||||||
!tools/*.cfg
|
!tools/*.cfg
|
||||||
!tools/acpi
|
!tools/SSDT1.dat
|
||||||
!tools/doxygen
|
|
||||||
!tools/.gdbinit
|
|
||||||
doxygen-doc
|
doxygen-doc
|
||||||
initrd.tar
|
initrd.tar
|
||||||
.dccache
|
.dccache
|
||||||
@ -30,4 +28,3 @@ initrd.tar
|
|||||||
*.so
|
*.so
|
||||||
*.o
|
*.o
|
||||||
*.dmp
|
*.dmp
|
||||||
*.pcap
|
|
||||||
|
@ -87,11 +87,11 @@ build64:
|
|||||||
- make --quiet -C Userspace prepare
|
- make --quiet -C Userspace prepare
|
||||||
- make --quiet -C Lynx prepare
|
- make --quiet -C Lynx prepare
|
||||||
- make --quiet -C Kernel prepare
|
- make --quiet -C Kernel prepare
|
||||||
- sed -i 's/.*OSARCH = .*/OSARCH = amd64/' ./config.mk && cat config.mk | grep OSARCH
|
- sed -i 's/.*OSARCH = .*/OSARCH = amd64/' ./Makefile.conf && cat Makefile.conf | grep OSARCH
|
||||||
- make build
|
- make build
|
||||||
- mv Fennix.iso Fennix-debug.iso
|
- mv Fennix.iso Fennix-debug.iso
|
||||||
- make clean
|
- make clean
|
||||||
- sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./config.mk && cat config.mk | grep DEBUG
|
- sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./Makefile.conf && cat Makefile.conf | grep DEBUG
|
||||||
- make build
|
- make build
|
||||||
- mv Fennix.iso Fennix-release.iso
|
- mv Fennix.iso Fennix-release.iso
|
||||||
artifacts:
|
artifacts:
|
||||||
@ -111,11 +111,11 @@ build32:
|
|||||||
- make --quiet -C Userspace prepare
|
- make --quiet -C Userspace prepare
|
||||||
- make --quiet -C Lynx prepare
|
- make --quiet -C Lynx prepare
|
||||||
- make --quiet -C Kernel prepare
|
- make --quiet -C Kernel prepare
|
||||||
- sed -i 's/.*OSARCH = .*/OSARCH = i386/' ./config.mk && cat config.mk | grep OSARCH
|
- sed -i 's/.*OSARCH = .*/OSARCH = i386/' ./Makefile.conf && cat Makefile.conf | grep OSARCH
|
||||||
- make build
|
- make build
|
||||||
- mv Fennix.iso Fennix-debug.iso
|
- mv Fennix.iso Fennix-debug.iso
|
||||||
- make clean
|
- make clean
|
||||||
- sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./config.mk && cat config.mk | grep DEBUG
|
- sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./Makefile.conf && cat Makefile.conf | grep DEBUG
|
||||||
- make build
|
- make build
|
||||||
- mv Fennix.iso Fennix-release.iso
|
- mv Fennix.iso Fennix-release.iso
|
||||||
artifacts:
|
artifacts:
|
||||||
@ -134,11 +134,11 @@ buildarm64:
|
|||||||
- make --quiet -C Userspace prepare
|
- make --quiet -C Userspace prepare
|
||||||
- make --quiet -C Lynx prepare
|
- make --quiet -C Lynx prepare
|
||||||
- make --quiet -C Kernel prepare
|
- make --quiet -C Kernel prepare
|
||||||
- sed -i 's/.*OSARCH = .*/OSARCH = arm64/' ./config.mk && cat config.mk | grep OSARCH
|
- sed -i 's/.*OSARCH = .*/OSARCH = arm64/' ./Makefile.conf && cat Makefile.conf | grep OSARCH
|
||||||
- make build
|
- make build
|
||||||
- mv Fennix.iso Fennix-debug.iso
|
- mv Fennix.iso Fennix-debug.iso
|
||||||
- make clean
|
- make clean
|
||||||
- sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./config.mk && cat config.mk | grep DEBUG
|
- sed -i 's/.*DEBUG = .*/DEBUG = 0/' ./Makefile.conf && cat Makefile.conf | grep DEBUG
|
||||||
- make build
|
- make build
|
||||||
- mv Fennix.iso Fennix-release.iso
|
- mv Fennix.iso Fennix-release.iso
|
||||||
artifacts:
|
artifacts:
|
||||||
|
20
.vscode/c_boilerplates.code-snippets
vendored
Normal file
20
.vscode/c_boilerplates.code-snippets
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"Fennix Kernel Header": {
|
||||||
|
"scope": "c",
|
||||||
|
"prefix": [
|
||||||
|
"head",
|
||||||
|
],
|
||||||
|
"body": [
|
||||||
|
"#ifndef __FENNIX_KERNEL_${2:header}_H__",
|
||||||
|
"#define __FENNIX_KERNEL_${2:header}_H__",
|
||||||
|
"",
|
||||||
|
"#include <types.h>",
|
||||||
|
"",
|
||||||
|
"$0",
|
||||||
|
"",
|
||||||
|
"#endif // !__FENNIX_KERNEL_${2:header}_H__",
|
||||||
|
""
|
||||||
|
],
|
||||||
|
"description": "Create kernel header."
|
||||||
|
}
|
||||||
|
}
|
69
.vscode/launch.json
vendored
69
.vscode/launch.json
vendored
@ -1,69 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"name": "Launch QEMU & debug the kernel",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/../Kernel/fennix.elf",
|
|
||||||
"cwd": "${workspaceFolder}",
|
|
||||||
"args": [],
|
|
||||||
"targetArchitecture": "x64",
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"miDebuggerServerAddress": "/tmp/gdb-fennix",
|
|
||||||
"miDebuggerPath": "${workspaceFolder}/../tools/cross/bin/x86_64-fennix-gdb",
|
|
||||||
"miDebuggerArgs": "",
|
|
||||||
"externalConsole": false,
|
|
||||||
"additionalSOLibSearchPath": "${workspaceFolder}",
|
|
||||||
"internalConsoleOptions": "neverOpen",
|
|
||||||
"customLaunchSetupCommands": [
|
|
||||||
// {
|
|
||||||
// "text": "target remote localhost:1234",
|
|
||||||
// "description": "Connect to QEMU remote debugger"
|
|
||||||
// }
|
|
||||||
],
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing for gdb",
|
|
||||||
"text": "-enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "set breakpoint pending on",
|
|
||||||
"description": "Make breakpoint pending on future shared library load."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "file ${workspaceFolder}/../Kernel/fennix.elf",
|
|
||||||
"description": "Load binary"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "add-symbol-file ${workspaceFolder}/../initrd_tmp_data/bin/utest",
|
|
||||||
"description": "Load /bin/utest",
|
|
||||||
"ignoreFailures": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"text": "source ${workspaceFolder}/../tools/.gdbinit"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"preLaunchTask": "launch-qemu"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "gdb",
|
|
||||||
"request": "attach",
|
|
||||||
"name": "Launch QEMU & attach to gdbserver",
|
|
||||||
"executable": "${workspaceFolder}/../Kernel/fennix.elf",
|
|
||||||
"target": "/tmp/gdb-fennix",
|
|
||||||
"remote": true,
|
|
||||||
"cwd": "${workspaceRoot}",
|
|
||||||
"valuesFormatting": "parseText",
|
|
||||||
"gdbpath": "${workspaceFolder}/../tools/cross/bin/x86_64-fennix-gdb",
|
|
||||||
"autorun": [
|
|
||||||
"set auto-load safe-path ${workspaceFolder}",
|
|
||||||
"source ${workspaceFolder}/../tools/.gdbinit",
|
|
||||||
],
|
|
||||||
"internalConsoleOptions": "neverOpen",
|
|
||||||
"printCalls": false,
|
|
||||||
"preLaunchTask": "launch-qemu"
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
|
10
.vscode/settings.json
vendored
10
.vscode/settings.json
vendored
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"C_Cpp.errorSquiggles": "enabled",
|
"C_Cpp.errorSquiggles": "Enabled",
|
||||||
"C_Cpp.autocompleteAddParentheses": true,
|
"C_Cpp.autocompleteAddParentheses": true,
|
||||||
"C_Cpp.codeAnalysis.clangTidy.enabled": true,
|
"C_Cpp.codeAnalysis.clangTidy.enabled": true,
|
||||||
"C_Cpp.clang_format_style": "Visual Studio",
|
"C_Cpp.clang_format_style": "Visual Studio",
|
||||||
@ -11,10 +11,16 @@
|
|||||||
"editor.cursorSmoothCaretAnimation": "on",
|
"editor.cursorSmoothCaretAnimation": "on",
|
||||||
"files.watcherExclude": {
|
"files.watcherExclude": {
|
||||||
"**/tools/binutils-gdb/**": true,
|
"**/tools/binutils-gdb/**": true,
|
||||||
|
"**/tools/build-binutilsamd64/**": true,
|
||||||
|
"**/tools/build-binutilsarm64/**": true,
|
||||||
|
"**/tools/build-binutilsi386/**": true,
|
||||||
|
"**/tools/build-gccamd64/**": true,
|
||||||
|
"**/tools/build-gccarm64/**": true,
|
||||||
|
"**/tools/build-gcci386/**": true,
|
||||||
|
"**/tools/cross/**": true,
|
||||||
"**/tools/gcc/**": true,
|
"**/tools/gcc/**": true,
|
||||||
"**/tools/limine/**": true,
|
"**/tools/limine/**": true,
|
||||||
"**/tools/qemu/**": true,
|
"**/tools/qemu/**": true,
|
||||||
"**/tools/cross/**": true,
|
|
||||||
"**/doxygen-doc/**": true,
|
"**/doxygen-doc/**": true,
|
||||||
}
|
}
|
||||||
}
|
}
|
28
.vscode/tasks.json
vendored
28
.vscode/tasks.json
vendored
@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "2.0.0",
|
|
||||||
"tasks": [
|
|
||||||
{
|
|
||||||
"label": "launch-qemu",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "make -C ../ build && make -C ../ vscode_debug_only",
|
|
||||||
"isBackground": true,
|
|
||||||
"problemMatcher": [],
|
|
||||||
"group": {
|
|
||||||
"kind": "build",
|
|
||||||
"isDefault": true
|
|
||||||
},
|
|
||||||
"presentation": {
|
|
||||||
"reveal": "always",
|
|
||||||
"panel": "shared"
|
|
||||||
},
|
|
||||||
"options": {
|
|
||||||
"shell": {
|
|
||||||
"executable": "bash",
|
|
||||||
"args": [
|
|
||||||
"-c"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,128 +0,0 @@
|
|||||||
# Contributor Covenant Code of Conduct
|
|
||||||
|
|
||||||
## Our Pledge
|
|
||||||
|
|
||||||
We as members, contributors, and leaders pledge to make participation in our
|
|
||||||
community a harassment-free experience for everyone, regardless of age, body
|
|
||||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
|
||||||
identity and expression, level of experience, education, socio-economic status,
|
|
||||||
nationality, personal appearance, race, religion, or sexual identity
|
|
||||||
and orientation.
|
|
||||||
|
|
||||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
|
||||||
diverse, inclusive, and healthy community.
|
|
||||||
|
|
||||||
## Our Standards
|
|
||||||
|
|
||||||
Examples of behavior that contributes to a positive environment for our
|
|
||||||
community include:
|
|
||||||
|
|
||||||
* Demonstrating empathy and kindness toward other people
|
|
||||||
* Being respectful of differing opinions, viewpoints, and experiences
|
|
||||||
* Giving and gracefully accepting constructive feedback
|
|
||||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
|
||||||
and learning from the experience
|
|
||||||
* Focusing on what is best not just for us as individuals, but for the
|
|
||||||
overall community
|
|
||||||
|
|
||||||
Examples of unacceptable behavior include:
|
|
||||||
|
|
||||||
* The use of sexualized language or imagery, and sexual attention or
|
|
||||||
advances of any kind
|
|
||||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
|
||||||
* Public or private harassment
|
|
||||||
* Publishing others' private information, such as a physical or email
|
|
||||||
address, without their explicit permission
|
|
||||||
* Other conduct which could reasonably be considered inappropriate in a
|
|
||||||
professional setting
|
|
||||||
|
|
||||||
## Enforcement Responsibilities
|
|
||||||
|
|
||||||
Community leaders are responsible for clarifying and enforcing our standards of
|
|
||||||
acceptable behavior and will take appropriate and fair corrective action in
|
|
||||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
|
||||||
or harmful.
|
|
||||||
|
|
||||||
Community leaders have the right and responsibility to remove, edit, or reject
|
|
||||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
|
||||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
|
||||||
decisions when appropriate.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
This Code of Conduct applies within all community spaces, and also applies when
|
|
||||||
an individual is officially representing the community in public spaces.
|
|
||||||
Examples of representing our community include using an official e-mail address,
|
|
||||||
posting via an official social media account, or acting as an appointed
|
|
||||||
representative at an online or offline event.
|
|
||||||
|
|
||||||
## Enforcement
|
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
||||||
reported to the community leaders responsible for enforcement at
|
|
||||||
enderice2@protonmail.com.
|
|
||||||
All complaints will be reviewed and investigated promptly and fairly.
|
|
||||||
|
|
||||||
All community leaders are obligated to respect the privacy and security of the
|
|
||||||
reporter of any incident.
|
|
||||||
|
|
||||||
## Enforcement Guidelines
|
|
||||||
|
|
||||||
Community leaders will follow these Community Impact Guidelines in determining
|
|
||||||
the consequences for any action they deem in violation of this Code of Conduct:
|
|
||||||
|
|
||||||
### 1. Correction
|
|
||||||
|
|
||||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
|
||||||
unprofessional or unwelcome in the community.
|
|
||||||
|
|
||||||
**Consequence**: A private, written warning from community leaders, providing
|
|
||||||
clarity around the nature of the violation and an explanation of why the
|
|
||||||
behavior was inappropriate. A public apology may be requested.
|
|
||||||
|
|
||||||
### 2. Warning
|
|
||||||
|
|
||||||
**Community Impact**: A violation through a single incident or series
|
|
||||||
of actions.
|
|
||||||
|
|
||||||
**Consequence**: A warning with consequences for continued behavior. No
|
|
||||||
interaction with the people involved, including unsolicited interaction with
|
|
||||||
those enforcing the Code of Conduct, for a specified period of time. This
|
|
||||||
includes avoiding interactions in community spaces as well as external channels
|
|
||||||
like social media. Violating these terms may lead to a temporary or
|
|
||||||
permanent ban.
|
|
||||||
|
|
||||||
### 3. Temporary Ban
|
|
||||||
|
|
||||||
**Community Impact**: A serious violation of community standards, including
|
|
||||||
sustained inappropriate behavior.
|
|
||||||
|
|
||||||
**Consequence**: A temporary ban from any sort of interaction or public
|
|
||||||
communication with the community for a specified period of time. No public or
|
|
||||||
private interaction with the people involved, including unsolicited interaction
|
|
||||||
with those enforcing the Code of Conduct, is allowed during this period.
|
|
||||||
Violating these terms may lead to a permanent ban.
|
|
||||||
|
|
||||||
### 4. Permanent Ban
|
|
||||||
|
|
||||||
**Community Impact**: Demonstrating a pattern of violation of community
|
|
||||||
standards, including sustained inappropriate behavior, harassment of an
|
|
||||||
individual, or aggression toward or disparagement of classes of individuals.
|
|
||||||
|
|
||||||
**Consequence**: A permanent ban from any sort of public interaction within
|
|
||||||
the community.
|
|
||||||
|
|
||||||
## Attribution
|
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
|
||||||
version 2.0, available at
|
|
||||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
|
||||||
|
|
||||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
|
||||||
enforcement ladder](https://github.com/mozilla/diversity).
|
|
||||||
|
|
||||||
[homepage]: https://www.contributor-covenant.org
|
|
||||||
|
|
||||||
For answers to common questions about this code of conduct, see the FAQ at
|
|
||||||
https://www.contributor-covenant.org/faq. Translations are available at
|
|
||||||
https://www.contributor-covenant.org/translations.
|
|
@ -1,70 +0,0 @@
|
|||||||
# Contributing to Fennix
|
|
||||||
|
|
||||||
We welcome contributions to Fennix! Whether you are reporting a bug, suggesting a feature, or submitting a pull request, we’re excited to collaborate with you.
|
|
||||||
|
|
||||||
## Table of Contents
|
|
||||||
- [How to Contribute](#how-to-contribute)
|
|
||||||
- [Code of Conduct](#code-of-conduct)
|
|
||||||
- [Getting Started](#getting-started)
|
|
||||||
- [Pull Request Guidelines](#pull-request-guidelines)
|
|
||||||
- [Reporting Issues](#reporting-issues)
|
|
||||||
- [Style Guide](#style-guide)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## How to Contribute
|
|
||||||
|
|
||||||
1. **Check existing issues or discussions** to see if your idea has already been mentioned or if someone is already working on it.
|
|
||||||
2. If you’re new to the project, consider contributing to [good first issues](https://github.com/EnderIce2/Fennix/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22).
|
|
||||||
3. Fork the repository and create a new branch for your changes.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Code of Conduct
|
|
||||||
|
|
||||||
By participating in this project, you agree to abide by our [Code of Conduct](CODE_OF_CONDUCT.md). Be respectful and inclusive while interacting with the community.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
1. Fork this repository and clone your fork.
|
|
||||||
2. Set up your development environment according to the [README.md](README.md) or any other setup guide provided.
|
|
||||||
3. Ensure all tests pass before submitting changes. Add tests for new features where applicable.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Pull Request Guidelines
|
|
||||||
|
|
||||||
1. Keep pull requests focused on a single issue or feature.
|
|
||||||
2. Write clear, descriptive commit messages.
|
|
||||||
3. Ensure all tests pass before submitting your PR.
|
|
||||||
4. Include a detailed description of your changes and reference any relevant issue numbers.
|
|
||||||
5. Be open to feedback and revise your pull request if requested.
|
|
||||||
6. Mark your pull request as a draft if it’s still a work in progress.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Reporting Issues
|
|
||||||
|
|
||||||
1. Check if the issue has already been reported.
|
|
||||||
2. Include a clear and descriptive title.
|
|
||||||
3. Provide detailed steps to reproduce the problem (if applicable).
|
|
||||||
4. Mention your environment details (e.g., OS, version, etc.).
|
|
||||||
5. Attach screenshots or logs if they help explain the issue.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Style Guide
|
|
||||||
|
|
||||||
Follow the coding style used in the repository to ensure consistency. Adhere to:
|
|
||||||
- Use CamelCase for all names.
|
|
||||||
- Start function and global declaration names with an uppercase letter.
|
|
||||||
- Start local variable names with a lowercase letter.
|
|
||||||
- Maintain consistent formatting and commenting guidelines.
|
|
||||||
|
|
||||||
Refer to the [style guide document](STYLE_GUIDE.md) if available.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Thank you for contributing! Your effort makes Fennix better for everyone. If you have any questions, feel free to reach out by opening an issue or joining our discussions.
|
|
125
CREDITS.md
125
CREDITS.md
@ -1,125 +0,0 @@
|
|||||||
# Credits and References
|
|
||||||
|
|
||||||
This project has been influenced and inspired by other projects and resources.
|
|
||||||
|
|
||||||
License information can be found in the [LICENSES.md](LICENSES.md) file.
|
|
||||||
|
|
||||||
## General
|
|
||||||
- [OSDev Wiki](https://wiki.osdev.org/Main_Page)
|
|
||||||
- [GCC x86 Built-in Functions](https://gcc.gnu.org/onlinedocs/gcc/x86-Built-in-Functions.html#x86-Built-in-Functions)
|
|
||||||
- [GCC Common Function Attributes](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes)
|
|
||||||
- [LemonOS Project](https://github.com/LemonOSProject/LemonOS)
|
|
||||||
- [ToaruOS](https://github.com/klange/toaruos)
|
|
||||||
- [Various SIMD functions](https://wiki.osdev.org/User:01000101/optlib/)
|
|
||||||
|
|
||||||
## C++ STL
|
|
||||||
- [cppreference.com](https://cppreference.com)
|
|
||||||
|
|
||||||
## Virtual terminal
|
|
||||||
- [vtconsole](https://github.com/sleepy-monax/vtconsole)
|
|
||||||
|
|
||||||
## Font
|
|
||||||
- [Tamsyn Font](http://www.fial.com/~scott/tamsyn-font/)
|
|
||||||
|
|
||||||
## CPU XCR0 Structure
|
|
||||||
- [CPU Registers x86 - XCR0](https://wiki.osdev.org/CPU_Registers_x86#XCR0)
|
|
||||||
|
|
||||||
## CPUID 0x7
|
|
||||||
- [CPUID](https://en.wikipedia.org/wiki/CPUID)
|
|
||||||
|
|
||||||
## Network
|
|
||||||
- [Beej's Guide to Network Programming](https://web.archive.org/web/20051210132103/http://users.pcnet.ro/dmoroian/beej/Beej.html)
|
|
||||||
- [UDP Socket Programming](https://web.archive.org/web/20060229214053/http://www.cs.rutgers.edu/~pxk/417/notes/sockets/udp.html)
|
|
||||||
- [EtherType](https://en.wikipedia.org/wiki/EtherType)
|
|
||||||
- [Linux Network Packet Reception](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-network-packet-reception)
|
|
||||||
- [Linux Kernel Networking Labs](https://linux-kernel-labs.github.io/refs/heads/master/labs/networking.html)
|
|
||||||
- [smoltcp](https://github.com/smoltcp-rs/smoltcp)
|
|
||||||
- [Understanding Linux Network Internals](https://www.cs.unh.edu/~cruse/cs326f04/RTL8139D_DataSheet.pdf)
|
|
||||||
- [Address Resolution Protocol (ARP)](https://en.wikipedia.org/wiki/Address_Resolution_Protocol)
|
|
||||||
- [C++ Operators](https://en.cppreference.com/w/cpp/language/operators)
|
|
||||||
- [Dynamic Host Configuration Protocol (DHCP)](https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol)
|
|
||||||
- [RTL8139 Programmer's Guide](https://www.cs.usfca.edu/~cruse/cs326f04/RTL8139_ProgrammersGuide.pdf)
|
|
||||||
- [RTL8139CP Datasheet](http://realtek.info/pdf/rtl8139cp.pdf)
|
|
||||||
- [IPv4](https://en.wikipedia.org/wiki/IPv4)
|
|
||||||
- [ICMP Parameters](https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml)
|
|
||||||
|
|
||||||
## Loading ELF Shared Libraries and Dynamic Linking
|
|
||||||
- [How To Write Shared Libraries](https://www.akkadia.org/drepper/dsohowto.pdf)
|
|
||||||
- [Dynamic Linker](https://wiki.osdev.org/Dynamic_Linker)
|
|
||||||
- [Nightingale OS](https://github.com/tyler569/nightingale)
|
|
||||||
- [PLT and GOT: The Key to Code Sharing and Dynamic Libraries](https://www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html)
|
|
||||||
- [YouTube Video on Dynamic Linking](https://www.youtube.com/watch?v=kUk5pw4w0h4)
|
|
||||||
- [Oracle: Position Independent Code](https://docs.oracle.com/cd/E19683-01/817-3677/chapter6-42444/index.html)
|
|
||||||
- [PLT and GOT Explained](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt_and_got)
|
|
||||||
|
|
||||||
## Inter-Process Communication (IPC)
|
|
||||||
- [Oracle IPC](https://docs.oracle.com/cd/E19048-01/chorus5/806-6897/architecture-103/index.html)
|
|
||||||
- [Inter-Process Communication in OS](https://www.scaler.com/topics/operating-system/inter-process-communication-in-os/)
|
|
||||||
- [IPC on Wikipedia](https://en.wikipedia.org/wiki/Inter-process_communication)
|
|
||||||
- [GeeksforGeeks IPC Guide](https://www.geeksforgeeks.org/inter-process-communication-ipc/)
|
|
||||||
|
|
||||||
## PCI (Peripheral Component Interconnect)
|
|
||||||
- [OSDev PCI](https://wiki.osdev.org/PCI)
|
|
||||||
- [PCI Configuration Space](https://en.wikipedia.org/wiki/PCI_configuration_space)
|
|
||||||
|
|
||||||
## Audio
|
|
||||||
- [FFmpeg Audio Types](https://trac.ffmpeg.org/wiki/audio%20types)
|
|
||||||
- [AC97 on OSDev](https://wiki.osdev.org/AC97)
|
|
||||||
- [AC97 Revision 2.3 Specification](https://inst.eecs.berkeley.edu//~cs150/Documents/ac97_r23.pdf)
|
|
||||||
|
|
||||||
## Intrinsics (x86)
|
|
||||||
- [Microsoft x86 Intrinsics](https://learn.microsoft.com/en-us/cpp/intrinsics/x86-intrinsics-list)
|
|
||||||
- [Intel Intrinsics Guide](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html)
|
|
||||||
|
|
||||||
## CPUID Information
|
|
||||||
- [AMD CPUID Instruction](https://www.amd.com/system/files/TechDocs/40332.pdf)
|
|
||||||
- [CPUID Instruction Note](https://www.scss.tcd.ie/~jones/CS4021/processor-identification-cpuid-instruction-note.pdf)
|
|
||||||
|
|
||||||
## SMBIOS (System Management BIOS)
|
|
||||||
- [DMTF DSP0134](https://www.dmtf.org/dsp/DSP0134)
|
|
||||||
- [DSP0134 Version 3.6.0](https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.6.0.pdf)
|
|
||||||
- [OSDev SMBIOS](https://wiki.osdev.org/System_Management_BIOS)
|
|
||||||
|
|
||||||
## EDBA (Effective Direct Bus Access)
|
|
||||||
- [Memory Map (x86)](https://wiki.osdev.org/Memory_Map_(x86))
|
|
||||||
|
|
||||||
## UMIP, SMAP, and SMEP
|
|
||||||
- [Control Register on Wikipedia](https://en.wikipedia.org/wiki/Control_register)
|
|
||||||
- [Control Register and UMIP](https://web.archive.org/web/20160312223150/http://ncsi.com/nsatc11/presentations/wednesday/emerging_technologies/fischer.pdf)
|
|
||||||
- [Supervisor Mode Access Prevention (SMEP)](https://en.wikipedia.org/wiki/Supervisor_Mode_Access_Prevention)
|
|
||||||
|
|
||||||
## Atomic Operations
|
|
||||||
- [C++ Atomic Operations](https://en.cppreference.com/w/cpp/atomic/atomic)
|
|
||||||
|
|
||||||
## ELF (Executable and Linkable Format)
|
|
||||||
- [ELF Header Format](https://www.sco.com/developers/gabi/latest/ch4.eheader.html)
|
|
||||||
- [ELF File Format Specification](https://refspecs.linuxfoundation.org/elf/elf.pdf)
|
|
||||||
- [Oracle: Executable and Linkable Format](https://docs.oracle.com/cd/E19683-01/817-3677/chapter6-42444/index.html)
|
|
||||||
- [Oracle: ELF Program Headers](https://docs.oracle.com/cd/E19683-01/816-1386/chapter6-83432/index.html)
|
|
||||||
- [YouTube Video on ELF](https://www.youtube.com/watch?v=nC1U1LJQL8o)
|
|
||||||
- [Stevens' UNIX Network Programming](https://stevens.netmeister.org/631/elf.html)
|
|
||||||
- [Linux Kernel ELF Header](https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h)
|
|
||||||
|
|
||||||
## C++ ABI (Application Binary Interface)
|
|
||||||
- [GCC libstdc++ Source](https://github.com/gcc-mirror/gcc/tree/master/libstdc%2B%2B-v3)
|
|
||||||
- [Itanium C++ ABI](https://itanium-cxx-abi.github.io/cxx-abi/abi.html)
|
|
||||||
|
|
||||||
## signal.h
|
|
||||||
- [POSIX signal.h](https://pubs.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html)
|
|
||||||
- [Linux signal(7) Manual](https://man7.org/linux/man-pages/man7/signal.7.html)
|
|
||||||
|
|
||||||
## PS/2
|
|
||||||
- [Scan Codes](https://www.win.tue.nl/~aeb/linux/kbd/scancodes-11.html)
|
|
||||||
- [PS/2 Keyboard on OSDev](https://wiki.osdev.org/PS2_Keyboard)
|
|
||||||
- [PS/2 Mouse on OSDev](https://wiki.osdev.org/PS2_Mouse)
|
|
||||||
- [Mouse Input on OSDev](https://wiki.osdev.org/Mouse_Input)
|
|
||||||
- [I/O Ports on OSDev](https://wiki.osdev.org/I/O_ports)
|
|
||||||
- [PS/2 Controller on OSDev](https://wiki.osdev.org/%228042%22_PS/2_Controller)
|
|
||||||
- [AIP on OSDev](https://wiki.osdev.org/Advanced_Integrated_Peripheral)
|
|
||||||
|
|
||||||
## UART
|
|
||||||
- [Interfacing the Serial / RS232 Port V5.0](http://www.senet.com.au/~cpeacock)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Special thanks to all contributors and the creators of the referenced projects and resources!
|
|
42
Doxyfile
42
Doxyfile
@ -44,14 +44,14 @@ PROJECT_NUMBER = 1.0.0
|
|||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
# quick idea about the purpose of the project. Keep the description short.
|
# quick idea about the purpose of the project. Keep the description short.
|
||||||
|
|
||||||
PROJECT_BRIEF = "Full Documentation"
|
PROJECT_BRIEF = "Opeating System from scratch made in C and C++"
|
||||||
|
|
||||||
# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
|
# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
|
||||||
# in the documentation. The maximum height of the logo should not exceed 55
|
# in the documentation. The maximum height of the logo should not exceed 55
|
||||||
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
|
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
|
||||||
# the logo to the output directory.
|
# the logo to the output directory.
|
||||||
|
|
||||||
PROJECT_LOGO = tools/doxygen/favicon.ico
|
PROJECT_LOGO =
|
||||||
|
|
||||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
|
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
|
||||||
# into which the generated documentation will be written. If a relative path is
|
# into which the generated documentation will be written. If a relative path is
|
||||||
@ -246,7 +246,7 @@ INHERIT_DOCS = YES
|
|||||||
# of the file/class/namespace that contains it.
|
# of the file/class/namespace that contains it.
|
||||||
# The default value is: NO.
|
# The default value is: NO.
|
||||||
|
|
||||||
SEPARATE_MEMBER_PAGES = NO
|
SEPARATE_MEMBER_PAGES = YES
|
||||||
|
|
||||||
# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
|
# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
|
||||||
# uses this value to replace tabs by spaces in code fragments.
|
# uses this value to replace tabs by spaces in code fragments.
|
||||||
@ -424,7 +424,7 @@ SUBGROUPING = YES
|
|||||||
# SEPARATE_MEMBER_PAGES.
|
# SEPARATE_MEMBER_PAGES.
|
||||||
# The default value is: NO.
|
# The default value is: NO.
|
||||||
|
|
||||||
INLINE_GROUPED_CLASSES = NO
|
INLINE_GROUPED_CLASSES = YES
|
||||||
|
|
||||||
# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
|
# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
|
||||||
# with only public data fields or simple typedef fields will be shown inline in
|
# with only public data fields or simple typedef fields will be shown inline in
|
||||||
@ -614,7 +614,7 @@ HIDE_COMPOUND_REFERENCE= NO
|
|||||||
# the files that are included by a file in the documentation of that file.
|
# the files that are included by a file in the documentation of that file.
|
||||||
# The default value is: YES.
|
# The default value is: YES.
|
||||||
|
|
||||||
SHOW_INCLUDE_FILES = NO
|
SHOW_INCLUDE_FILES = YES
|
||||||
|
|
||||||
# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
|
# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
|
||||||
# grouped member an include statement to the documentation, telling the reader
|
# grouped member an include statement to the documentation, telling the reader
|
||||||
@ -794,7 +794,7 @@ CITE_BIB_FILES =
|
|||||||
# messages are off.
|
# messages are off.
|
||||||
# The default value is: NO.
|
# The default value is: NO.
|
||||||
|
|
||||||
QUIET = YES
|
QUIET = NO
|
||||||
|
|
||||||
# The WARNINGS tag can be used to turn on/off the warning messages that are
|
# The WARNINGS tag can be used to turn on/off the warning messages that are
|
||||||
# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
|
# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
|
||||||
@ -864,14 +864,7 @@ WARN_LOGFILE =
|
|||||||
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
|
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
|
||||||
# Note: If this tag is empty the current directory is searched.
|
# Note: If this tag is empty the current directory is searched.
|
||||||
|
|
||||||
INPUT = tools/doxygen/index.md \
|
INPUT = Kernel Lynx Userspace Drivers tools/doxymds/main.md
|
||||||
tools/doxygen/api.md \
|
|
||||||
tools/doxygen/develop.md \
|
|
||||||
README \
|
|
||||||
Userspace/README.md \
|
|
||||||
Drivers/README.md \
|
|
||||||
Kernel/README.md \
|
|
||||||
Kernel/include/interface
|
|
||||||
|
|
||||||
# This tag can be used to specify the character encoding of the source files
|
# This tag can be used to specify the character encoding of the source files
|
||||||
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
|
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
|
||||||
@ -962,7 +955,7 @@ RECURSIVE = YES
|
|||||||
# Note that relative paths are relative to the directory from which doxygen is
|
# Note that relative paths are relative to the directory from which doxygen is
|
||||||
# run.
|
# run.
|
||||||
|
|
||||||
EXCLUDE = .vscode .github
|
EXCLUDE = .vscode tools
|
||||||
|
|
||||||
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
|
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
|
||||||
# directories that are symbolic links (a Unix file system feature) are excluded
|
# directories that are symbolic links (a Unix file system feature) are excluded
|
||||||
@ -1071,7 +1064,7 @@ FILTER_SOURCE_PATTERNS =
|
|||||||
# (index.html). This can be useful if you have a project on for instance GitHub
|
# (index.html). This can be useful if you have a project on for instance GitHub
|
||||||
# and want to reuse the introduction page also for the doxygen output.
|
# and want to reuse the introduction page also for the doxygen output.
|
||||||
|
|
||||||
USE_MDFILE_AS_MAINPAGE = tools/doxygen/index.md
|
USE_MDFILE_AS_MAINPAGE = tools/doxymds/main.md
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to source browsing
|
# Configuration options related to source browsing
|
||||||
@ -1231,7 +1224,7 @@ GENERATE_HTML = YES
|
|||||||
# The default directory is: html.
|
# The default directory is: html.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_OUTPUT = doxygen-doc/docs
|
HTML_OUTPUT = doxygen-doc/fulldoc
|
||||||
|
|
||||||
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
|
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
|
||||||
# generated HTML page (for example: .htm, .php, .asp).
|
# generated HTML page (for example: .htm, .php, .asp).
|
||||||
@ -1258,7 +1251,7 @@ HTML_FILE_EXTENSION = .html
|
|||||||
# of the possible markers and block names see the documentation.
|
# of the possible markers and block names see the documentation.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_HEADER = tools/doxygen/header.html
|
HTML_HEADER =
|
||||||
|
|
||||||
# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
|
# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
|
||||||
# generated HTML page. If the tag is left blank doxygen will generate a standard
|
# generated HTML page. If the tag is left blank doxygen will generate a standard
|
||||||
@ -1293,8 +1286,7 @@ HTML_STYLESHEET =
|
|||||||
# list). For an example see the documentation.
|
# list). For an example see the documentation.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_EXTRA_STYLESHEET = tools/doxygen/theme/doxygen-awesome.css \
|
HTML_EXTRA_STYLESHEET = tools/doxygen-awesome.css tools/custom.css
|
||||||
tools/doxygen/custom.css
|
|
||||||
|
|
||||||
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
|
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
|
||||||
# other source files which should be copied to the HTML output directory. Note
|
# other source files which should be copied to the HTML output directory. Note
|
||||||
@ -1304,11 +1296,7 @@ HTML_EXTRA_STYLESHEET = tools/doxygen/theme/doxygen-awesome.css \
|
|||||||
# files will be copied as-is; there are no commands or markers available.
|
# files will be copied as-is; there are no commands or markers available.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_EXTRA_FILES = tools/doxygen/theme/doxygen-awesome-darkmode-toggle.js \
|
HTML_EXTRA_FILES =
|
||||||
tools/doxygen/theme/doxygen-awesome-fragment-copy-button.js \
|
|
||||||
tools/doxygen/theme/doxygen-awesome-paragraph-link.js \
|
|
||||||
tools/doxygen/theme/doxygen-awesome-interactive-toc.js \
|
|
||||||
tools/doxygen/theme/doxygen-awesome-tabs.js
|
|
||||||
|
|
||||||
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
|
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
|
||||||
# will adjust the colors in the style sheet and background images according to
|
# will adjust the colors in the style sheet and background images according to
|
||||||
@ -1347,7 +1335,7 @@ HTML_COLORSTYLE_GAMMA = 80
|
|||||||
# The default value is: NO.
|
# The default value is: NO.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_TIMESTAMP = YES
|
HTML_TIMESTAMP = NO
|
||||||
|
|
||||||
# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
|
# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
|
||||||
# documentation will contain a main index with vertical navigation menus that
|
# documentation will contain a main index with vertical navigation menus that
|
||||||
@ -2083,7 +2071,7 @@ MAN_OUTPUT = man
|
|||||||
# The default value is: .3.
|
# The default value is: .3.
|
||||||
# This tag requires that the tag GENERATE_MAN is set to YES.
|
# This tag requires that the tag GENERATE_MAN is set to YES.
|
||||||
|
|
||||||
MAN_EXTENSION = .2
|
MAN_EXTENSION = .3
|
||||||
|
|
||||||
# The MAN_SUBDIR tag determines the name of the directory created within
|
# The MAN_SUBDIR tag determines the name of the directory created within
|
||||||
# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
|
# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
|
||||||
|
2
Drivers/.vscode/c_cpp_properties.json
vendored
2
Drivers/.vscode/c_cpp_properties.json
vendored
@ -12,6 +12,7 @@
|
|||||||
"KERNEL_VERSION=\"1.0\"",
|
"KERNEL_VERSION=\"1.0\"",
|
||||||
"GIT_COMMIT=\"0000000000000000000000000000000000000000\"",
|
"GIT_COMMIT=\"0000000000000000000000000000000000000000\"",
|
||||||
"GIT_COMMIT_SHORT=\"0000000\"",
|
"GIT_COMMIT_SHORT=\"0000000\"",
|
||||||
|
"a64",
|
||||||
"DEBUG=\"1\""
|
"DEBUG=\"1\""
|
||||||
],
|
],
|
||||||
"compilerPath": "${workspaceFolder}/../tools/cross/bin/x86_64-fennix-gcc",
|
"compilerPath": "${workspaceFolder}/../tools/cross/bin/x86_64-fennix-gcc",
|
||||||
@ -68,6 +69,7 @@
|
|||||||
"KERNEL_VERSION=\"1.0\"",
|
"KERNEL_VERSION=\"1.0\"",
|
||||||
"GIT_COMMIT=\"0000000000000000000000000000000000000000\"",
|
"GIT_COMMIT=\"0000000000000000000000000000000000000000\"",
|
||||||
"GIT_COMMIT_SHORT=\"0000000\"",
|
"GIT_COMMIT_SHORT=\"0000000\"",
|
||||||
|
"a32",
|
||||||
"DEBUG=\"1\""
|
"DEBUG=\"1\""
|
||||||
],
|
],
|
||||||
"compilerPath": "${workspaceFolder}/../tools/cross/bin/i386-elf-gcc",
|
"compilerPath": "${workspaceFolder}/../tools/cross/bin/i386-elf-gcc",
|
||||||
|
1
Drivers/.vscode/launch.json
vendored
1
Drivers/.vscode/launch.json
vendored
@ -1 +0,0 @@
|
|||||||
../../.vscode/launch.json
|
|
1
Drivers/.vscode/tasks.json
vendored
1
Drivers/.vscode/tasks.json
vendored
@ -1 +0,0 @@
|
|||||||
../../.vscode/tasks.json
|
|
2659
Drivers/Doxyfile
Normal file
2659
Drivers/Doxyfile
Normal file
File diff suppressed because it is too large
Load Diff
29
Drivers/LICENSE
Normal file
29
Drivers/LICENSE
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
BSD 3-Clause License
|
||||||
|
|
||||||
|
Copyright (c) 2022, EnderIce2
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
3. Neither the name of the copyright holder nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
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,48 +1,3 @@
|
|||||||
default:
|
|
||||||
$(error Do not run this Makefile directly!)
|
|
||||||
|
|
||||||
export CC := $(__CONF_CC)
|
|
||||||
export CXX := $(__CONF_CXX)
|
|
||||||
export LD := $(__CONF_LD)
|
|
||||||
export AS := $(__CONF_AS)
|
|
||||||
export OBJDUMP := $(__CONF_OBJDUMP)
|
|
||||||
|
|
||||||
export OUTPUT_DIR := $(CURDIR)/out/
|
|
||||||
export INCLUDE_DIR := $(CURDIR)/include
|
|
||||||
|
|
||||||
DRIVER_LDFLAGS = -nostdlib -nodefaultlibs -nolibc -zmax-page-size=0x1000 \
|
|
||||||
-Wl,-Map file.map -fvisibility=hidden -Wl,--dynamic-linker=/boot/fennix.elf
|
|
||||||
|
|
||||||
ifeq ($(OSARCH), amd64)
|
|
||||||
DRIVER_CFLAGS = -fPIC -fPIE -pie -mno-80387 -mno-mmx -mno-3dnow \
|
|
||||||
-mno-red-zone -mno-sse -mno-sse2 \
|
|
||||||
-march=x86-64 -pipe -ffunction-sections \
|
|
||||||
-msoft-float -fno-builtin
|
|
||||||
|
|
||||||
else ifeq ($(OSARCH), i386)
|
|
||||||
DRIVER_CFLAGS = -fPIC -fPIE -pie -mno-80387 -mno-mmx -mno-3dnow \
|
|
||||||
-mno-red-zone -mno-sse -mno-sse2 -ffunction-sections \
|
|
||||||
-march=i386 -pipe -msoft-float -fno-builtin
|
|
||||||
else ifeq ($(OSARCH), aarch64)
|
|
||||||
DRIVER_CFLAGS = -pipe -fno-builtin -fPIC
|
|
||||||
endif
|
|
||||||
|
|
||||||
DRIVER_CFLAGS += -I$(CURDIR)/include
|
|
||||||
|
|
||||||
ifeq ($(DEBUG), 1)
|
|
||||||
DRIVER_CFLAGS += -DDEBUG -ggdb3 -O0 -fdiagnostics-color=always -fstack-usage
|
|
||||||
ifeq ($(OSARCH), amd64)
|
|
||||||
DRIVER_CFLAGS += -fverbose-asm
|
|
||||||
endif
|
|
||||||
ifneq ($(OSARCH), aarch64)
|
|
||||||
DRIVER_CFLAGS += -fstack-check
|
|
||||||
endif
|
|
||||||
DRIVER_LDFLAGS += -ggdb3 -O0
|
|
||||||
endif
|
|
||||||
|
|
||||||
export DRIVER_LDFLAGS
|
|
||||||
export DRIVER_CFLAGS
|
|
||||||
|
|
||||||
build:
|
build:
|
||||||
cp -rf ../Kernel/include/interface/* include/
|
cp -rf ../Kernel/include/interface/* include/
|
||||||
mkdir -p out
|
mkdir -p out
|
||||||
|
@ -1 +1,11 @@
|
|||||||
# Drivers
|
# Drivers
|
||||||
|
|
||||||
|
Drivers for [Fennix](https://github.com/Fennix-Project/Fennix).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Use `Fennix` repo to build the operating system.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone --recurse-submodules https://github.com/Fennix-Project/Fennix.git
|
||||||
|
```
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
MAKE_TARGETS := build clean
|
build:
|
||||||
DIRECTORIES := $(sort $(dir $(wildcard ./*/)))
|
make -C ac97 build
|
||||||
|
make -C hda build
|
||||||
|
|
||||||
.PHONY: $(MAKE_TARGETS) $(DIRECTORIES)
|
clean:
|
||||||
|
make -C ac97 clean
|
||||||
$(MAKE_TARGETS): $(DIRECTORIES)
|
make -C hda clean
|
||||||
|
|
||||||
$(DIRECTORIES):
|
|
||||||
$(MAKE) -C $@ $(MAKECMDGOALS)
|
|
||||||
|
@ -1,35 +1,22 @@
|
|||||||
default:
|
# Config files
|
||||||
$(error Do not run this Makefile directly!)
|
include ../../../Makefile.conf
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
||||||
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
||||||
CXX_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
CPP_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
||||||
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
||||||
OBJ = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
||||||
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CXX_SOURCES:.cpp=.su)
|
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CPP_SOURCES:.cpp=.su)
|
||||||
|
|
||||||
FILENAME = $(notdir $(shell pwd)).drv
|
FILENAME = ac97.drv
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
mv $(FILENAME) $(OUTPUT_DIR)$(FILENAME)
|
mv $(FILENAME) ../../out/$(FILENAME)
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(info Linking $@)
|
$(info Linking $@)
|
||||||
$(CC) $(DRIVER_LDFLAGS) $(OBJ) $(OUTPUT_DIR)dcrt0.o -L$(OUTPUT_DIR) -lkernel -o $@
|
$(CC) $(DRIVER_LDFLAGS) $(OBJ) ../../out/dcrt0.o -L../../out -lkernel -o $@
|
||||||
|
|
||||||
WARNCFLAG = -Wall -Wextra
|
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CC) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.cpp $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CXX) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c++20 -fno-exceptions -fno-rtti -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.S
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(AS) -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
||||||
|
@ -1,35 +1,22 @@
|
|||||||
default:
|
# Config files
|
||||||
$(error Do not run this Makefile directly!)
|
include ../../../Makefile.conf
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
||||||
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
||||||
CXX_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
CPP_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
||||||
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
||||||
OBJ = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
||||||
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CXX_SOURCES:.cpp=.su)
|
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CPP_SOURCES:.cpp=.su)
|
||||||
|
|
||||||
FILENAME = $(notdir $(shell pwd)).drv
|
FILENAME = hda.drv
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
mv $(FILENAME) $(OUTPUT_DIR)$(FILENAME)
|
mv $(FILENAME) ../../out/$(FILENAME)
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(info Linking $@)
|
$(info Linking $@)
|
||||||
$(CC) $(DRIVER_LDFLAGS) $(OBJ) $(OUTPUT_DIR)dcrt0.o -L$(OUTPUT_DIR) -lkernel -o $@
|
$(CC) $(DRIVER_LDFLAGS) $(OBJ) ../../out/dcrt0.o -L../../out -lkernel -o $@
|
||||||
|
|
||||||
WARNCFLAG = -Wall -Wextra
|
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CC) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.cpp $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CXX) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c++20 -fno-exceptions -fno-rtti -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.S
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(AS) -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
||||||
|
54
Drivers/config.mk
Normal file
54
Drivers/config.mk
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
CC = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)gcc
|
||||||
|
CPP = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)g++
|
||||||
|
LD = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)ld
|
||||||
|
AS = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)as
|
||||||
|
OBJDUMP = ../../../$(COMPILER_PATH)/$(COMPILER_ARCH)objdump
|
||||||
|
|
||||||
|
DRIVER_LDFLAGS := -nostdlib -nodefaultlibs -nolibc -zmax-page-size=0x1000 \
|
||||||
|
-Wl,-Map file.map -fvisibility=hidden -Wl,--dynamic-linker=/boot/fennix.elf
|
||||||
|
|
||||||
|
ifeq ($(OSARCH), amd64)
|
||||||
|
|
||||||
|
DRIVER_CFLAGS := -fPIC -fPIE -pie -mno-80387 -mno-mmx -mno-3dnow \
|
||||||
|
-mno-red-zone -mno-sse -mno-sse2 \
|
||||||
|
-march=x86-64 -pipe -ffunction-sections \
|
||||||
|
-msoft-float -fno-builtin
|
||||||
|
|
||||||
|
else ifeq ($(OSARCH), i386)
|
||||||
|
|
||||||
|
DRIVER_CFLAGS := -fPIC -fPIE -pie -mno-80387 -mno-mmx -mno-3dnow \
|
||||||
|
-mno-red-zone -mno-sse -mno-sse2 -ffunction-sections \
|
||||||
|
-march=i386 -pipe -msoft-float -fno-builtin
|
||||||
|
|
||||||
|
else ifeq ($(OSARCH), aarch64)
|
||||||
|
|
||||||
|
DRIVER_CFLAGS += -pipe -fno-builtin -fPIC
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
DRIVER_CFLAGS += -I../../include
|
||||||
|
|
||||||
|
ifeq ($(DEBUG), 1)
|
||||||
|
DRIVER_CFLAGS += -DDEBUG -ggdb3 -O0 -fdiagnostics-color=always -fstack-usage
|
||||||
|
ifeq ($(OSARCH), amd64)
|
||||||
|
DRIVER_CFLAGS += -fverbose-asm
|
||||||
|
endif
|
||||||
|
ifneq ($(OSARCH), aarch64)
|
||||||
|
DRIVER_CFLAGS += -fstack-check
|
||||||
|
endif
|
||||||
|
DRIVER_LDFLAGS += -ggdb3 -O0
|
||||||
|
endif
|
||||||
|
|
||||||
|
WARNCFLAG = -Wall -Wextra
|
||||||
|
|
||||||
|
%.o: %.c $(HEADERS)
|
||||||
|
$(info Compiling $<)
|
||||||
|
$(CC) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@
|
||||||
|
|
||||||
|
%.o: %.cpp $(HEADERS)
|
||||||
|
$(info Compiling $<)
|
||||||
|
$(CPP) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c++20 -fno-exceptions -fno-rtti -c $< -o $@
|
||||||
|
|
||||||
|
%.o: %.S
|
||||||
|
$(info Compiling $<)
|
||||||
|
$(AS) -o $@ $<
|
@ -1,9 +1,5 @@
|
|||||||
MAKE_TARGETS := build clean
|
build:
|
||||||
DIRECTORIES := $(sort $(dir $(wildcard ./*/)))
|
make -C fat build
|
||||||
|
|
||||||
.PHONY: $(MAKE_TARGETS) $(DIRECTORIES)
|
clean:
|
||||||
|
make -C fat clean
|
||||||
$(MAKE_TARGETS): $(DIRECTORIES)
|
|
||||||
|
|
||||||
$(DIRECTORIES):
|
|
||||||
$(MAKE) -C $@ $(MAKECMDGOALS)
|
|
||||||
|
@ -1,35 +1,22 @@
|
|||||||
default:
|
# Config files
|
||||||
$(error Do not run this Makefile directly!)
|
include ../../../Makefile.conf
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
||||||
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
||||||
CXX_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
CPP_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
||||||
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
||||||
OBJ = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
||||||
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CXX_SOURCES:.cpp=.su)
|
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CPP_SOURCES:.cpp=.su)
|
||||||
|
|
||||||
FILENAME = $(notdir $(shell pwd)).drv
|
FILENAME = fat.drv
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
mv $(FILENAME) $(OUTPUT_DIR)$(FILENAME)
|
mv $(FILENAME) ../../out/$(FILENAME)
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(info Linking $@)
|
$(info Linking $@)
|
||||||
$(CC) $(DRIVER_LDFLAGS) $(OBJ) $(OUTPUT_DIR)dcrt0.o -L$(OUTPUT_DIR) -lkernel -o $@
|
$(CC) $(DRIVER_LDFLAGS) $(OBJ) ../../out/dcrt0.o -L../../out -lkernel -o $@
|
||||||
|
|
||||||
WARNCFLAG = -Wall -Wextra
|
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CC) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.cpp $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CXX) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c++20 -fno-exceptions -fno-rtti -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.S
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(AS) -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
/*
|
/*
|
||||||
This file is part of Fennix Kernel.
|
This file is part of Fennix Drivers.
|
||||||
|
|
||||||
Fennix Kernel is free software: you can redistribute it and/or
|
Fennix Drivers is free software: you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License as
|
modify it under the terms of the GNU General Public License as
|
||||||
published by the Free Software Foundation, either version 3 of
|
published by the Free Software Foundation, either version 3 of
|
||||||
the License, or (at your option) any later version.
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
Fennix Kernel is distributed in the hope that it will be useful,
|
Fennix Drivers is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
along with Fennix Drivers. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __FENNIX_API_AIP_H__
|
#ifndef __FENNIX_API_AIP_H__
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __FENNIX_API_ERRNO_H__
|
#ifndef __FENNIX_KERNEL_ERRNO_H__
|
||||||
#define __FENNIX_API_ERRNO_H__
|
#define __FENNIX_KERNEL_ERRNO_H__
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The documentation for these error codes are from:
|
* The documentation for these error codes are from:
|
||||||
@ -416,8 +416,8 @@ typedef enum
|
|||||||
* Not a directory. A component of the specified pathname exists, but
|
* Not a directory. A component of the specified pathname exists, but
|
||||||
* it is not a directory, when a directory was expected; or an
|
* it is not a directory, when a directory was expected; or an
|
||||||
* attempt was made to create a non-directory file, and the specified
|
* attempt was made to create a non-directory file, and the specified
|
||||||
* pathname contains at least one non- \<slash\> character and ends
|
* pathname contains at least one non- <slash> character and ends
|
||||||
* with one or more trailing \<slash\> characters.
|
* with one or more trailing <slash> characters.
|
||||||
*/
|
*/
|
||||||
ENOTDIR = 57,
|
ENOTDIR = 57,
|
||||||
|
|
||||||
@ -588,18 +588,17 @@ typedef enum
|
|||||||
__ERRNO_MAX
|
__ERRNO_MAX
|
||||||
} KernelErrors;
|
} KernelErrors;
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
EXTERNC int *__errno_location(void) __attribute__((const));
|
||||||
|
#define errno (*__errno_location())
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int *__errno_location(void) __attribute__((const));
|
|
||||||
char *strerror(int errnum);
|
char *strerror(int errnum);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define errno (*__errno_location())
|
#endif // !__FENNIX_KERNEL_ERRNO_H__
|
||||||
|
|
||||||
#endif // !__FENNIX_API_ERRNO_H__
|
|
||||||
|
@ -348,7 +348,6 @@ struct SuperBlockOperations
|
|||||||
* Write all pending changes to the disk.
|
* Write all pending changes to the disk.
|
||||||
*
|
*
|
||||||
* @param Info Inode to synchronize. If NULL, synchronize all inodes.
|
* @param Info Inode to synchronize. If NULL, synchronize all inodes.
|
||||||
* @param Node Inode to synchronize.
|
|
||||||
*
|
*
|
||||||
* @return Zero on success, otherwise an error code.
|
* @return Zero on success, otherwise an error code.
|
||||||
*/
|
*/
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
/*
|
/*
|
||||||
This file is part of Fennix Kernel.
|
This file is part of Fennix Drivers.
|
||||||
|
|
||||||
Fennix Kernel is free software: you can redistribute it and/or
|
Fennix Drivers is free software: you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License as
|
modify it under the terms of the GNU General Public License as
|
||||||
published by the Free Software Foundation, either version 3 of
|
published by the Free Software Foundation, either version 3 of
|
||||||
the License, or (at your option) any later version.
|
the License, or (at your option) any later version.
|
||||||
|
|
||||||
Fennix Kernel is distributed in the hope that it will be useful,
|
Fennix Drivers is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.
|
along with Fennix Drivers. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __FENNIX_API_PCI_H__
|
#ifndef __FENNIX_API_PCI_H__
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,9 +1,5 @@
|
|||||||
MAKE_TARGETS := build clean
|
build:
|
||||||
DIRECTORIES := $(sort $(dir $(wildcard ./*/)))
|
make -C aip build
|
||||||
|
|
||||||
.PHONY: $(MAKE_TARGETS) $(DIRECTORIES)
|
clean:
|
||||||
|
make -C aip clean
|
||||||
$(MAKE_TARGETS): $(DIRECTORIES)
|
|
||||||
|
|
||||||
$(DIRECTORIES):
|
|
||||||
$(MAKE) -C $@ $(MAKECMDGOALS)
|
|
||||||
|
@ -1,35 +1,22 @@
|
|||||||
default:
|
# Config files
|
||||||
$(error Do not run this Makefile directly!)
|
include ../../../Makefile.conf
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
||||||
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
||||||
CXX_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
CPP_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
||||||
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
||||||
OBJ = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
||||||
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CXX_SOURCES:.cpp=.su)
|
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CPP_SOURCES:.cpp=.su)
|
||||||
|
|
||||||
FILENAME = $(notdir $(shell pwd)).drv
|
FILENAME = aip.drv
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
mv $(FILENAME) $(OUTPUT_DIR)$(FILENAME)
|
mv $(FILENAME) ../../out/$(FILENAME)
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(info Linking $@)
|
$(info Linking $@)
|
||||||
$(CC) $(DRIVER_LDFLAGS) $(OBJ) $(OUTPUT_DIR)dcrt0.o -L$(OUTPUT_DIR) -lkernel -o $@
|
$(CC) $(DRIVER_LDFLAGS) $(OBJ) ../../out/dcrt0.o -L../../out -lkernel -o $@
|
||||||
|
|
||||||
WARNCFLAG = -Wall -Wextra
|
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CC) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.cpp $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CXX) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c++20 -fno-exceptions -fno-rtti -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.S
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(AS) -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
||||||
|
@ -1,14 +1,21 @@
|
|||||||
|
# Config file
|
||||||
|
include ../../Makefile.conf
|
||||||
|
|
||||||
FILENAME = libkernel.so
|
FILENAME = libkernel.so
|
||||||
|
|
||||||
default:
|
CC = ../../$(COMPILER_PATH)/$(COMPILER_ARCH)gcc
|
||||||
$(error Do not run this Makefile directly!)
|
CPP = ../../$(COMPILER_PATH)/$(COMPILER_ARCH)g++
|
||||||
|
LD = ../../$(COMPILER_PATH)/$(COMPILER_ARCH)ld
|
||||||
|
AS = ../../$(COMPILER_PATH)/$(COMPILER_ARCH)as
|
||||||
|
AR = ../../$(COMPILER_PATH)/$(COMPILER_ARCH)ar
|
||||||
|
|
||||||
S_SOURCES = $(shell find ./ -type f -name '*.S' -not -path "./crt/*")
|
S_SOURCES = $(shell find ./ -type f -name '*.S' -not -path "./crt/*")
|
||||||
C_SOURCES = $(shell find ./ -type f -name '*.c' -not -path "./crt/*")
|
C_SOURCES = $(shell find ./ -type f -name '*.c' -not -path "./crt/*")
|
||||||
CXX_SOURCES = $(shell find ./ -type f -name '*.cpp' -not -path "./crt/*")
|
CPP_SOURCES = $(shell find ./ -type f -name '*.cpp' -not -path "./crt/*")
|
||||||
HEADERS = $(sort $(dir $(wildcard $(INCLUDE_DIR)/*)))
|
HEADERS = $(sort $(dir $(wildcard ../include/*)))
|
||||||
OBJ = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(ASM_SOURCES:.asm=.o) $(S_SOURCES:.S=.o) $(PSF_SOURCES:.psf=.o) $(BMP_SOURCES:.bmp=.o)
|
OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(ASM_SOURCES:.asm=.o) $(S_SOURCES:.S=.o) $(PSF_SOURCES:.psf=.o) $(BMP_SOURCES:.bmp=.o)
|
||||||
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CXX_SOURCES:.cpp=.su)
|
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CPP_SOURCES:.cpp=.su)
|
||||||
|
INCLUDE_DIR = ../include
|
||||||
|
|
||||||
LDFLAGS := -fPIC -fPIE -pie -nostdlib -nodefaultlibs -nolibc \
|
LDFLAGS := -fPIC -fPIE -pie -nostdlib -nodefaultlibs -nolibc \
|
||||||
-zmax-page-size=0x1000 -Wl,-Map libkernel.map -shared
|
-zmax-page-size=0x1000 -Wl,-Map libkernel.map -shared
|
||||||
@ -36,7 +43,7 @@ CFLAGS += -pipe -fno-builtin -fPIC
|
|||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CRT_CFLAGS := -fPIC -fPIE -pie -mno-red-zone -std=c++20 -I$(INCLUDE_DIR)
|
CRT_CFLAGS := -fPIC -fPIE -pie -mno-red-zone -std=c++20 -I../include
|
||||||
|
|
||||||
ifeq ($(DEBUG), 1)
|
ifeq ($(DEBUG), 1)
|
||||||
CFLAGS += -DDEBUG -ggdb3 -O0 -fdiagnostics-color=always -fstack-usage
|
CFLAGS += -DDEBUG -ggdb3 -O0 -fdiagnostics-color=always -fstack-usage
|
||||||
@ -53,12 +60,12 @@ endif
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
$(CXX) $(CRT_CFLAGS) -c crt/crt0.cpp -o dcrt0.o
|
$(CPP) $(CRT_CFLAGS) -c crt/crt0.cpp -o dcrt0.o
|
||||||
mv dcrt0.o $(OUTPUT_DIR)dcrt0.o
|
mv dcrt0.o ../out/dcrt0.o
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(info Linking $@)
|
$(info Linking $@)
|
||||||
$(CC) $(LDFLAGS) $(OBJ) -o $(OUTPUT_DIR)$(FILENAME)
|
$(CC) $(LDFLAGS) $(OBJ) -o ../out/$(FILENAME)
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
%.o: %.c $(HEADERS)
|
||||||
$(info Compiling $<)
|
$(info Compiling $<)
|
||||||
@ -66,7 +73,7 @@ $(FILENAME): $(OBJ)
|
|||||||
|
|
||||||
%.o: %.cpp $(HEADERS)
|
%.o: %.cpp $(HEADERS)
|
||||||
$(info Compiling $<)
|
$(info Compiling $<)
|
||||||
$(CXX) $(CFLAGS) $(WARNCFLAG) -std=c++20 -fexceptions -c $< -o $@
|
$(CPP) $(CFLAGS) $(WARNCFLAG) -std=c++20 -fexceptions -c $< -o $@
|
||||||
|
|
||||||
%.o: %.S
|
%.o: %.S
|
||||||
$(info Compiling $<)
|
$(info Compiling $<)
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
MAKE_TARGETS := build clean
|
build:
|
||||||
DIRECTORIES := $(sort $(dir $(wildcard ./*/)))
|
make -C example build
|
||||||
|
make -C vmware build
|
||||||
|
|
||||||
.PHONY: $(MAKE_TARGETS) $(DIRECTORIES)
|
clean:
|
||||||
|
make -C example clean
|
||||||
$(MAKE_TARGETS): $(DIRECTORIES)
|
make -C vmware clean
|
||||||
|
|
||||||
$(DIRECTORIES):
|
|
||||||
$(MAKE) -C $@ $(MAKECMDGOALS)
|
|
||||||
|
@ -1,35 +1,22 @@
|
|||||||
default:
|
# Config files
|
||||||
$(error Do not run this Makefile directly!)
|
include ../../../Makefile.conf
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
||||||
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
||||||
CXX_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
CPP_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
||||||
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
||||||
OBJ = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
||||||
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CXX_SOURCES:.cpp=.su)
|
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CPP_SOURCES:.cpp=.su)
|
||||||
|
|
||||||
FILENAME = $(notdir $(shell pwd)).drv
|
FILENAME = example.drv
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
mv $(FILENAME) $(OUTPUT_DIR)$(FILENAME)
|
mv $(FILENAME) ../../out/$(FILENAME)
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(info Linking $@)
|
$(info Linking $@)
|
||||||
$(CC) $(DRIVER_LDFLAGS) $(OBJ) $(OUTPUT_DIR)dcrt0.o -L$(OUTPUT_DIR) -lkernel -o $@
|
$(CC) $(DRIVER_LDFLAGS) $(OBJ) ../../out/dcrt0.o -L../../out -lkernel -o $@
|
||||||
|
|
||||||
WARNCFLAG = -Wall -Wextra
|
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CC) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.cpp $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CXX) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c++20 -fno-exceptions -fno-rtti -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.S
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(AS) -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
||||||
|
@ -66,14 +66,15 @@ int DriverProbe()
|
|||||||
* This function is to test if the driver is compatible
|
* This function is to test if the driver is compatible
|
||||||
* with the hardware.
|
* with the hardware.
|
||||||
* Example: Like if there is a PCI device that the driver
|
* Example: Like if there is a PCI device that the driver
|
||||||
* is for, or a CPU feature etc.
|
* is for, or a CPU feature that etc.
|
||||||
*
|
*
|
||||||
* Return 0 if the driver is compatible with the hardware.
|
* Return 0 if the driver is compatible with the hardware.
|
||||||
|
* Otherwise, return a value that is not 0.
|
||||||
*
|
*
|
||||||
* Note: In this function you cannot use variables that
|
* Note: In this function you cannot use variables that
|
||||||
* have constructors or destructors. Before DriverEntry,
|
* have constructors or destructors. Before DriverEntry,
|
||||||
* the constructors are called and after DriverFinalize,
|
* the constructors are called and after DriverFinalize,
|
||||||
* the destructors.
|
* the destructors are called.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1,35 +1,22 @@
|
|||||||
default:
|
# Config files
|
||||||
$(error Do not run this Makefile directly!)
|
include ../../../Makefile.conf
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
||||||
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
||||||
CXX_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
CPP_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
||||||
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
||||||
OBJ = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
||||||
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CXX_SOURCES:.cpp=.su)
|
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CPP_SOURCES:.cpp=.su)
|
||||||
|
|
||||||
FILENAME = $(notdir $(shell pwd)).drv
|
FILENAME = vmware.drv
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
mv $(FILENAME) $(OUTPUT_DIR)$(FILENAME)
|
mv $(FILENAME) ../../out/$(FILENAME)
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(info Linking $@)
|
$(info Linking $@)
|
||||||
$(CC) $(DRIVER_LDFLAGS) $(OBJ) $(OUTPUT_DIR)dcrt0.o -L$(OUTPUT_DIR) -lkernel -o $@
|
$(CC) $(DRIVER_LDFLAGS) $(OBJ) ../../out/dcrt0.o -L../../out -lkernel -o $@
|
||||||
|
|
||||||
WARNCFLAG = -Wall -Wextra
|
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CC) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.cpp $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CXX) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c++20 -fno-exceptions -fno-rtti -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.S
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(AS) -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
MAKE_TARGETS := build clean
|
build:
|
||||||
DIRECTORIES := $(sort $(dir $(wildcard ./*/)))
|
make -C e1000 build
|
||||||
|
make -C rtl8139 build
|
||||||
|
|
||||||
.PHONY: $(MAKE_TARGETS) $(DIRECTORIES)
|
clean:
|
||||||
|
make -C e1000 clean
|
||||||
$(MAKE_TARGETS): $(DIRECTORIES)
|
make -C rtl8139 clean
|
||||||
|
|
||||||
$(DIRECTORIES):
|
|
||||||
$(MAKE) -C $@ $(MAKECMDGOALS)
|
|
||||||
|
@ -1,35 +1,22 @@
|
|||||||
default:
|
# Config files
|
||||||
$(error Do not run this Makefile directly!)
|
include ../../../Makefile.conf
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
||||||
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
||||||
CXX_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
CPP_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
||||||
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
||||||
OBJ = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
||||||
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CXX_SOURCES:.cpp=.su)
|
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CPP_SOURCES:.cpp=.su)
|
||||||
|
|
||||||
FILENAME = $(notdir $(shell pwd)).drv
|
FILENAME = e1000.drv
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
mv $(FILENAME) $(OUTPUT_DIR)$(FILENAME)
|
mv $(FILENAME) ../../out/$(FILENAME)
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(info Linking $@)
|
$(info Linking $@)
|
||||||
$(CC) $(DRIVER_LDFLAGS) $(OBJ) $(OUTPUT_DIR)dcrt0.o -L$(OUTPUT_DIR) -lkernel -o $@
|
$(CC) $(DRIVER_LDFLAGS) $(OBJ) ../../out/dcrt0.o -L../../out -lkernel -o $@
|
||||||
|
|
||||||
WARNCFLAG = -Wall -Wextra
|
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CC) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.cpp $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CXX) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c++20 -fno-exceptions -fno-rtti -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.S
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(AS) -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
||||||
|
@ -1,35 +1,22 @@
|
|||||||
default:
|
# Config files
|
||||||
$(error Do not run this Makefile directly!)
|
include ../../../Makefile.conf
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
||||||
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
||||||
CXX_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
CPP_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
||||||
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
||||||
OBJ = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
||||||
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CXX_SOURCES:.cpp=.su)
|
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CPP_SOURCES:.cpp=.su)
|
||||||
|
|
||||||
FILENAME = $(notdir $(shell pwd)).drv
|
FILENAME = rtl8139.drv
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
mv $(FILENAME) $(OUTPUT_DIR)$(FILENAME)
|
mv $(FILENAME) ../../out/$(FILENAME)
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(info Linking $@)
|
$(info Linking $@)
|
||||||
$(CC) $(DRIVER_LDFLAGS) $(OBJ) $(OUTPUT_DIR)dcrt0.o -L$(OUTPUT_DIR) -lkernel -o $@
|
$(CC) $(DRIVER_LDFLAGS) $(OBJ) ../../out/dcrt0.o -L../../out -lkernel -o $@
|
||||||
|
|
||||||
WARNCFLAG = -Wall -Wextra
|
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CC) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.cpp $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CXX) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c++20 -fno-exceptions -fno-rtti -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.S
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(AS) -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
||||||
|
@ -1,35 +1,22 @@
|
|||||||
default:
|
# Config files
|
||||||
$(error Do not run this Makefile directly!)
|
include ../../../Makefile.conf
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
||||||
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
||||||
CXX_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
CPP_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
||||||
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
||||||
OBJ = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
||||||
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CXX_SOURCES:.cpp=.su)
|
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CPP_SOURCES:.cpp=.su)
|
||||||
|
|
||||||
FILENAME = $(notdir $(shell pwd)).drv
|
FILENAME = ahci.drv
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
mv $(FILENAME) $(OUTPUT_DIR)$(FILENAME)
|
mv $(FILENAME) ../../out/$(FILENAME)
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(info Linking $@)
|
$(info Linking $@)
|
||||||
$(CC) $(DRIVER_LDFLAGS) $(OBJ) $(OUTPUT_DIR)dcrt0.o -L$(OUTPUT_DIR) -lkernel -o $@
|
$(CC) $(DRIVER_LDFLAGS) $(OBJ) ../../out/dcrt0.o -L../../out -lkernel -o $@
|
||||||
|
|
||||||
WARNCFLAG = -Wall -Wextra
|
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CC) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.cpp $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CXX) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c++20 -fno-exceptions -fno-rtti -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.S
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(AS) -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
||||||
|
@ -1,35 +1,22 @@
|
|||||||
default:
|
# Config files
|
||||||
$(error Do not run this Makefile directly!)
|
include ../../../Makefile.conf
|
||||||
|
include ../../config.mk
|
||||||
|
|
||||||
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
S_SOURCES = $(shell find ./ -type f -name '*.S')
|
||||||
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
C_SOURCES = $(shell find ./ -type f -name '*.c')
|
||||||
CXX_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
CPP_SOURCES = $(shell find ./ -type f -name '*.cpp')
|
||||||
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
HEADERS = $(sort $(dir $(wildcard ../../include/*)))
|
||||||
OBJ = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
OBJ = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o) $(S_SOURCES:.S=.o)
|
||||||
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CXX_SOURCES:.cpp=.su)
|
STACK_USAGE_OBJ = $(C_SOURCES:.c=.su) $(CPP_SOURCES:.cpp=.su)
|
||||||
|
|
||||||
FILENAME = $(notdir $(shell pwd)).drv
|
FILENAME = ata.drv
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
mv $(FILENAME) $(OUTPUT_DIR)$(FILENAME)
|
mv $(FILENAME) ../../out/$(FILENAME)
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(info Linking $@)
|
$(info Linking $@)
|
||||||
$(CC) $(DRIVER_LDFLAGS) $(OBJ) $(OUTPUT_DIR)dcrt0.o -L$(OUTPUT_DIR) -lkernel -o $@
|
$(CC) $(DRIVER_LDFLAGS) $(OBJ) ../../out/dcrt0.o -L../../out -lkernel -o $@
|
||||||
|
|
||||||
WARNCFLAG = -Wall -Wextra
|
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CC) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c17 -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.cpp $(HEADERS)
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(CXX) $(DRIVER_CFLAGS) $(WARNCFLAG) -std=c++20 -fno-exceptions -fno-rtti -c $< -o $@
|
|
||||||
|
|
||||||
%.o: %.S
|
|
||||||
$(info Compiling $<)
|
|
||||||
$(AS) -o $@ $<
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
rm -f file.map $(OBJ) $(STACK_USAGE_OBJ)
|
||||||
|
@ -5,11 +5,108 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"settings": {
|
"settings": {
|
||||||
"terminal.integrated.cwd": "../",
|
|
||||||
"debug.allowBreakpointsEverywhere": true,
|
"debug.allowBreakpointsEverywhere": true,
|
||||||
"git.alwaysSignOff": true,
|
"cSpell.words": [
|
||||||
"git.defaultBranchName": "master",
|
"ABAR",
|
||||||
"git.openRepositoryInParentFolders": "always",
|
"ABSPOINTER",
|
||||||
"C_Cpp.autoAddFileAssociations": false
|
"AHCI",
|
||||||
|
"BIST",
|
||||||
|
"Cardbus",
|
||||||
|
"CFIEN",
|
||||||
|
"cmdret",
|
||||||
|
"cmpb",
|
||||||
|
"driverinfo",
|
||||||
|
"ECTRL",
|
||||||
|
"EEPROM",
|
||||||
|
"Fennix",
|
||||||
|
"GETVERSION",
|
||||||
|
"HBAPRDT",
|
||||||
|
"IFCS",
|
||||||
|
"inportb",
|
||||||
|
"inportl",
|
||||||
|
"inportw",
|
||||||
|
"INTX",
|
||||||
|
"KAPI",
|
||||||
|
"LEDS",
|
||||||
|
"LPBK",
|
||||||
|
"LSTA",
|
||||||
|
"mminb",
|
||||||
|
"mminl",
|
||||||
|
"mminq",
|
||||||
|
"mminw",
|
||||||
|
"mmioin",
|
||||||
|
"mmioout",
|
||||||
|
"mmoutb",
|
||||||
|
"mmoutl",
|
||||||
|
"mmoutw",
|
||||||
|
"NABM",
|
||||||
|
"NABMB",
|
||||||
|
"NABMBOFF",
|
||||||
|
"outportb",
|
||||||
|
"outportl",
|
||||||
|
"outportw",
|
||||||
|
"PCIBAR",
|
||||||
|
"PCMOUT",
|
||||||
|
"PCNET",
|
||||||
|
"PCTRL",
|
||||||
|
"PMCF",
|
||||||
|
"PORTHB",
|
||||||
|
"PRDT",
|
||||||
|
"Prefetchable",
|
||||||
|
"RCTL",
|
||||||
|
"RCTRL",
|
||||||
|
"RDMTS",
|
||||||
|
"RDTR",
|
||||||
|
"rpci",
|
||||||
|
"RSRPD",
|
||||||
|
"RTCL",
|
||||||
|
"RTLC",
|
||||||
|
"RTLIB",
|
||||||
|
"RTLIL",
|
||||||
|
"RTLIW",
|
||||||
|
"RTLOB",
|
||||||
|
"RTLOL",
|
||||||
|
"RTLOW",
|
||||||
|
"RXDCTL",
|
||||||
|
"RXDESCHEAD",
|
||||||
|
"RXDESCHI",
|
||||||
|
"RXDESCLEN",
|
||||||
|
"RXDESCLO",
|
||||||
|
"RXDESCTAIL",
|
||||||
|
"Sata",
|
||||||
|
"SATAPI",
|
||||||
|
"SECRC",
|
||||||
|
"SEMB",
|
||||||
|
"SWXOFF",
|
||||||
|
"tclo",
|
||||||
|
"TCTL",
|
||||||
|
"TCTRL",
|
||||||
|
"TFES",
|
||||||
|
"TIPG",
|
||||||
|
"TSAD",
|
||||||
|
"TSTA",
|
||||||
|
"TXDESCHEAD",
|
||||||
|
"TXDESCHI",
|
||||||
|
"TXDESCLEN",
|
||||||
|
"TXDESCLO",
|
||||||
|
"TXDESCTAIL",
|
||||||
|
"TYPEMATIC",
|
||||||
|
"ubit",
|
||||||
|
"Virtio",
|
||||||
|
"Wmissing"
|
||||||
|
],
|
||||||
|
"files.associations": {
|
||||||
|
"*.su": "tsv",
|
||||||
|
"driver.h": "c",
|
||||||
|
"base.h": "c",
|
||||||
|
"types.h": "c",
|
||||||
|
"syscall.h": "c",
|
||||||
|
"aip.h": "c",
|
||||||
|
"input.h": "c",
|
||||||
|
"errno.h": "c",
|
||||||
|
"io.h": "c",
|
||||||
|
"rtl8139.hpp": "c",
|
||||||
|
"net.h": "c"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,8 +5,513 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"settings": {
|
"settings": {
|
||||||
"terminal.integrated.cwd": "../",
|
|
||||||
"debug.allowBreakpointsEverywhere": true,
|
"debug.allowBreakpointsEverywhere": true,
|
||||||
|
"files.associations": {
|
||||||
|
"*.su": "tsv",
|
||||||
|
"thread": "cpp",
|
||||||
|
"bitset": "cpp",
|
||||||
|
"initializer_list": "cpp",
|
||||||
|
"semaphore": "cpp",
|
||||||
|
"memory": "cpp",
|
||||||
|
"limits": "cpp",
|
||||||
|
"climits": "cpp",
|
||||||
|
"iterator": "cpp",
|
||||||
|
"ranges": "cpp",
|
||||||
|
"cassert": "cpp",
|
||||||
|
"concepts": "cpp",
|
||||||
|
"cctype": "cpp",
|
||||||
|
"tuple": "cpp",
|
||||||
|
"streambuf": "cpp",
|
||||||
|
"system_error": "cpp",
|
||||||
|
"coroutine": "cpp",
|
||||||
|
"static_vector": "cpp",
|
||||||
|
"string_view": "cpp",
|
||||||
|
"compare": "cpp",
|
||||||
|
"limine.h": "c",
|
||||||
|
"types.h": "c",
|
||||||
|
"binfo.h": "c",
|
||||||
|
"liballoc_1_1.h": "c",
|
||||||
|
"cstring": "cpp",
|
||||||
|
"cargs.h": "c",
|
||||||
|
"memory.hpp": "c",
|
||||||
|
"convert.h": "c",
|
||||||
|
"limits.h": "c",
|
||||||
|
"assert.h": "c",
|
||||||
|
"cwalk.h": "c",
|
||||||
|
"md5.h": "c",
|
||||||
|
"stdint.h": "c",
|
||||||
|
"debug.h": "c",
|
||||||
|
"ubsan.h": "c",
|
||||||
|
"kernel.h": "c",
|
||||||
|
"filesystem.hpp": "c",
|
||||||
|
"vector.hpp": "c",
|
||||||
|
"string.hpp": "c",
|
||||||
|
"nc.hpp": "c",
|
||||||
|
"vector": "c",
|
||||||
|
"task.hpp": "c",
|
||||||
|
"recovery.hpp": "c",
|
||||||
|
"symbols.hpp": "c",
|
||||||
|
"cstddef": "cpp",
|
||||||
|
"atomic.hpp": "c",
|
||||||
|
"atomic": "cpp",
|
||||||
|
"syscalls.h": "c",
|
||||||
|
"cmath": "cpp",
|
||||||
|
"typeinfo": "c",
|
||||||
|
"exception": "cpp",
|
||||||
|
"errno.h": "c",
|
||||||
|
"float.h": "c",
|
||||||
|
"mutex": "cpp",
|
||||||
|
"type_trails": "cpp",
|
||||||
|
"utility": "cpp",
|
||||||
|
"algorithm": "cpp",
|
||||||
|
"functional": "cpp",
|
||||||
|
"stdio.h": "c",
|
||||||
|
"string": "cpp",
|
||||||
|
"list": "cpp",
|
||||||
|
"stdexcept": "cpp",
|
||||||
|
"unistd.h": "c",
|
||||||
|
"unordered_map": "cpp",
|
||||||
|
"sched.h": "c",
|
||||||
|
"mman.h": "c",
|
||||||
|
"string.h": "c",
|
||||||
|
"macro.hpp": "c",
|
||||||
|
"stddef.h": "c",
|
||||||
|
"cfloat": "c",
|
||||||
|
"type_traits": "cpp",
|
||||||
|
"stdlib.h": "c",
|
||||||
|
"new": "cpp",
|
||||||
|
"ostream": "cpp",
|
||||||
|
"iostream": "cpp",
|
||||||
|
"istream": "cpp",
|
||||||
|
"ios": "cpp",
|
||||||
|
"locale": "cpp",
|
||||||
|
"unwind.h": "c",
|
||||||
|
"memory.h": "c",
|
||||||
|
"physical.hpp": "c",
|
||||||
|
"swap_pt.hpp": "c",
|
||||||
|
"brk.hpp": "c",
|
||||||
|
"bitmap.hpp": "c",
|
||||||
|
"lock.hpp": "c",
|
||||||
|
"virtual.hpp": "c",
|
||||||
|
"table.hpp": "c",
|
||||||
|
"vma.hpp": "c",
|
||||||
|
"abi.h": "c",
|
||||||
|
"kstack.hpp": "c",
|
||||||
|
"stack.hpp": "c",
|
||||||
|
"optional": "cpp"
|
||||||
|
},
|
||||||
|
"cSpell.words": [
|
||||||
|
"AABBCC",
|
||||||
|
"AAFF",
|
||||||
|
"AAFFAA",
|
||||||
|
"ABAR",
|
||||||
|
"ABIVERSION",
|
||||||
|
"ABSPOINTER",
|
||||||
|
"ACPI",
|
||||||
|
"ACPINVS",
|
||||||
|
"addralign",
|
||||||
|
"AEFF",
|
||||||
|
"AFAFAF",
|
||||||
|
"AHBA",
|
||||||
|
"AHCI",
|
||||||
|
"ALTLBA",
|
||||||
|
"APERF",
|
||||||
|
"apic",
|
||||||
|
"APICID",
|
||||||
|
"archaux",
|
||||||
|
"AROS",
|
||||||
|
"ARRAYSZ",
|
||||||
|
"auxv",
|
||||||
|
"BABABA",
|
||||||
|
"BADRAM",
|
||||||
|
"BGRT",
|
||||||
|
"bimi",
|
||||||
|
"binfo",
|
||||||
|
"biosdev",
|
||||||
|
"BIST",
|
||||||
|
"BITALG",
|
||||||
|
"BLOCKDEV",
|
||||||
|
"BLOCKDEVICE",
|
||||||
|
"BNDCFGS",
|
||||||
|
"bochs",
|
||||||
|
"bootanim",
|
||||||
|
"bootdev",
|
||||||
|
"Bootloader",
|
||||||
|
"brontobyte",
|
||||||
|
"CACACA",
|
||||||
|
"calloc",
|
||||||
|
"Cardbus",
|
||||||
|
"CCCCCCCPU",
|
||||||
|
"CHARDEV",
|
||||||
|
"CHARDEVICE",
|
||||||
|
"charsize",
|
||||||
|
"clac",
|
||||||
|
"CLOUDABI",
|
||||||
|
"CMCI",
|
||||||
|
"CMOS",
|
||||||
|
"cntvct",
|
||||||
|
"COMNULL",
|
||||||
|
"copydoc",
|
||||||
|
"cpudata",
|
||||||
|
"CPUID",
|
||||||
|
"crashdata",
|
||||||
|
"CSTAR",
|
||||||
|
"CTLS",
|
||||||
|
"cutlim",
|
||||||
|
"DADADA",
|
||||||
|
"daif",
|
||||||
|
"daifclr",
|
||||||
|
"daifset",
|
||||||
|
"DAPI",
|
||||||
|
"DBGP",
|
||||||
|
"DEBUGCTL",
|
||||||
|
"defragment",
|
||||||
|
"dfdesc",
|
||||||
|
"dialup",
|
||||||
|
"Didx",
|
||||||
|
"DLAB",
|
||||||
|
"Drivermemcpy",
|
||||||
|
"Drivermemset",
|
||||||
|
"Driversprintf",
|
||||||
|
"drvdir",
|
||||||
|
"DRVER",
|
||||||
|
"DSDT",
|
||||||
|
"DUID",
|
||||||
|
"dynstr",
|
||||||
|
"dynsym",
|
||||||
|
"EBDA",
|
||||||
|
"edid",
|
||||||
|
"EEPROM",
|
||||||
|
"EFER",
|
||||||
|
"Ehdr",
|
||||||
|
"ehsize",
|
||||||
|
"EISA",
|
||||||
|
"ELFABI",
|
||||||
|
"ELFCLASS",
|
||||||
|
"ELFDATA",
|
||||||
|
"ELFMAG",
|
||||||
|
"ELFOSABI",
|
||||||
|
"EMMINTRIN",
|
||||||
|
"endregion",
|
||||||
|
"Ensoniq",
|
||||||
|
"EVTSEL",
|
||||||
|
"EXECFN",
|
||||||
|
"exobyte",
|
||||||
|
"EXTD",
|
||||||
|
"FADT",
|
||||||
|
"FAFAFA",
|
||||||
|
"FAFAFAI",
|
||||||
|
"Fargc",
|
||||||
|
"Fargv",
|
||||||
|
"fcreat",
|
||||||
|
"fctprintf",
|
||||||
|
"Femto",
|
||||||
|
"FENIXOS",
|
||||||
|
"FENNIX",
|
||||||
|
"FFAA",
|
||||||
|
"FFAAAA",
|
||||||
|
"FFSMBIOS",
|
||||||
|
"FFXSR",
|
||||||
|
"filestatus",
|
||||||
|
"FMAPS",
|
||||||
|
"fonthdr",
|
||||||
|
"Framebuffer",
|
||||||
|
"FSGSBASE",
|
||||||
|
"fsmi",
|
||||||
|
"fxrstor",
|
||||||
|
"fxsave",
|
||||||
|
"Gamepad",
|
||||||
|
"Gameport",
|
||||||
|
"geopbyte",
|
||||||
|
"GETVERSION",
|
||||||
|
"GFNI",
|
||||||
|
"haddpd",
|
||||||
|
"headersize",
|
||||||
|
"HIPROC",
|
||||||
|
"HPET",
|
||||||
|
"hwaddress",
|
||||||
|
"ICRHI",
|
||||||
|
"ICRLO",
|
||||||
|
"IDIV",
|
||||||
|
"idtd",
|
||||||
|
"IFHLNK",
|
||||||
|
"infloop",
|
||||||
|
"inportb",
|
||||||
|
"inportl",
|
||||||
|
"inportw",
|
||||||
|
"INTFASTX",
|
||||||
|
"INTLEASTX",
|
||||||
|
"INTX",
|
||||||
|
"invlpg",
|
||||||
|
"ioapic",
|
||||||
|
"ioapicirq",
|
||||||
|
"IOCTLFS",
|
||||||
|
"IPCID",
|
||||||
|
"IRET",
|
||||||
|
"iretq",
|
||||||
|
"isdelim",
|
||||||
|
"ishld",
|
||||||
|
"ishst",
|
||||||
|
"itimerspec",
|
||||||
|
"itrfb",
|
||||||
|
"JMPREL",
|
||||||
|
"KAPI",
|
||||||
|
"KAPIPCI",
|
||||||
|
"kcalloc",
|
||||||
|
"kcon",
|
||||||
|
"kdentry",
|
||||||
|
"kdirent",
|
||||||
|
"kernelctl",
|
||||||
|
"kfree",
|
||||||
|
"klog",
|
||||||
|
"kmalloc",
|
||||||
|
"kproc",
|
||||||
|
"krealloc",
|
||||||
|
"kthrd",
|
||||||
|
"lapic",
|
||||||
|
"lfanew",
|
||||||
|
"LFLR",
|
||||||
|
"lgdt",
|
||||||
|
"liballoc",
|
||||||
|
"LIBLIST",
|
||||||
|
"lidt",
|
||||||
|
"limine",
|
||||||
|
"LMSLE",
|
||||||
|
"LOPROC",
|
||||||
|
"lsacpi",
|
||||||
|
"LSTAR",
|
||||||
|
"MADT",
|
||||||
|
"MADTIO",
|
||||||
|
"malloc",
|
||||||
|
"MCFG",
|
||||||
|
"memdbg",
|
||||||
|
"memmap",
|
||||||
|
"memsz",
|
||||||
|
"MEMTEST",
|
||||||
|
"mfence",
|
||||||
|
"MIDR",
|
||||||
|
"mminb",
|
||||||
|
"mminl",
|
||||||
|
"mminq",
|
||||||
|
"mminw",
|
||||||
|
"mmioin",
|
||||||
|
"mmioout",
|
||||||
|
"mmoutb",
|
||||||
|
"mmoutl",
|
||||||
|
"mmoutq",
|
||||||
|
"mmoutw",
|
||||||
|
"modbg",
|
||||||
|
"Modulememcpy",
|
||||||
|
"Modulememset",
|
||||||
|
"Modulesprintf",
|
||||||
|
"movaps",
|
||||||
|
"movddup",
|
||||||
|
"movdqa",
|
||||||
|
"movdqu",
|
||||||
|
"movntdq",
|
||||||
|
"movntdqa",
|
||||||
|
"movw",
|
||||||
|
"MPERF",
|
||||||
|
"MSRID",
|
||||||
|
"MTRR",
|
||||||
|
"MTRRCAP",
|
||||||
|
"multiboot",
|
||||||
|
"MWAIT",
|
||||||
|
"newfstatat",
|
||||||
|
"NIDENT",
|
||||||
|
"NOBITS",
|
||||||
|
"nullfd",
|
||||||
|
"nullptr",
|
||||||
|
"objptr",
|
||||||
|
"OEMID",
|
||||||
|
"Ofast",
|
||||||
|
"okstat",
|
||||||
|
"oldfd",
|
||||||
|
"OPENVOS",
|
||||||
|
"OPTMZ",
|
||||||
|
"OSABI",
|
||||||
|
"OSFXSR",
|
||||||
|
"OSXMMEXCPT",
|
||||||
|
"OSXSAVE",
|
||||||
|
"Outof",
|
||||||
|
"outportb",
|
||||||
|
"outportl",
|
||||||
|
"outportw",
|
||||||
|
"PAGESZ",
|
||||||
|
"palignr",
|
||||||
|
"PCIDE",
|
||||||
|
"pcmpistri",
|
||||||
|
"PCNET",
|
||||||
|
"PDBR",
|
||||||
|
"PDPTE",
|
||||||
|
"PEBS",
|
||||||
|
"PERFEVTSEL",
|
||||||
|
"PEXIT",
|
||||||
|
"PFLA",
|
||||||
|
"Phdrs",
|
||||||
|
"pheader",
|
||||||
|
"PHENT",
|
||||||
|
"phentsize",
|
||||||
|
"phnum",
|
||||||
|
"phoff",
|
||||||
|
"PHYSBASE",
|
||||||
|
"PHYSMASK",
|
||||||
|
"Pico",
|
||||||
|
"PINBASED",
|
||||||
|
"Pipefd",
|
||||||
|
"PKRU",
|
||||||
|
"PLTGOT",
|
||||||
|
"PLTREL",
|
||||||
|
"PLTRELSZ",
|
||||||
|
"POPCNT",
|
||||||
|
"PORTHB",
|
||||||
|
"powerline",
|
||||||
|
"Prefetchable",
|
||||||
|
"PREINIT",
|
||||||
|
"PROCBASED",
|
||||||
|
"PROGBITS",
|
||||||
|
"PTMX",
|
||||||
|
"ptys",
|
||||||
|
"pushfl",
|
||||||
|
"pushfq",
|
||||||
|
"Raphson",
|
||||||
|
"RARP",
|
||||||
|
"RBSTART",
|
||||||
|
"rdmsr",
|
||||||
|
"RDRAND",
|
||||||
|
"rdseed",
|
||||||
|
"rdtsc",
|
||||||
|
"readcr",
|
||||||
|
"readxcr",
|
||||||
|
"realloc",
|
||||||
|
"Realtek",
|
||||||
|
"RELAENT",
|
||||||
|
"RELASZ",
|
||||||
|
"RELSZ",
|
||||||
|
"Rodata",
|
||||||
|
"RPCI",
|
||||||
|
"rpmalloc",
|
||||||
|
"RRGGBB",
|
||||||
|
"RSDP",
|
||||||
|
"RSDT",
|
||||||
|
"RTIT",
|
||||||
|
"SATA",
|
||||||
|
"schedbg",
|
||||||
|
"SERCOS",
|
||||||
|
"serialports",
|
||||||
|
"sfence",
|
||||||
|
"sgdt",
|
||||||
|
"SGXLEPUBKEYHASH",
|
||||||
|
"Shdr",
|
||||||
|
"Sheader",
|
||||||
|
"shentsize",
|
||||||
|
"shnum",
|
||||||
|
"shoff",
|
||||||
|
"showbuf",
|
||||||
|
"shstrndx",
|
||||||
|
"shstrtab",
|
||||||
|
"sidt",
|
||||||
|
"SIGCOMP",
|
||||||
|
"sigsetsize",
|
||||||
|
"SIVR",
|
||||||
|
"SMAP",
|
||||||
|
"SMBASE",
|
||||||
|
"SMBIOSBIOS",
|
||||||
|
"SMEP",
|
||||||
|
"SMRR",
|
||||||
|
"SMXE",
|
||||||
|
"SNTP",
|
||||||
|
"SRAT",
|
||||||
|
"SSDT",
|
||||||
|
"sspt",
|
||||||
|
"SSSE",
|
||||||
|
"stac",
|
||||||
|
"strdbg",
|
||||||
|
"STRSZ",
|
||||||
|
"SVME",
|
||||||
|
"swapgs",
|
||||||
|
"Symbios",
|
||||||
|
"SYMENT",
|
||||||
|
"SYSENTER",
|
||||||
|
"sysret",
|
||||||
|
"sysretq",
|
||||||
|
"Tamsyn",
|
||||||
|
"targp",
|
||||||
|
"TCCR",
|
||||||
|
"TCLO",
|
||||||
|
"TCPA",
|
||||||
|
"TDCR",
|
||||||
|
"TEXIT",
|
||||||
|
"TEXTREL",
|
||||||
|
"Thrd",
|
||||||
|
"TICR",
|
||||||
|
"tlbi",
|
||||||
|
"Touchpad",
|
||||||
|
"tracepagetable",
|
||||||
|
"tskdbg",
|
||||||
|
"ttbr",
|
||||||
|
"uarch",
|
||||||
|
"uartmemdmp",
|
||||||
|
"ubsan",
|
||||||
|
"UINTFASTX",
|
||||||
|
"UINTLEASTX",
|
||||||
|
"UINTX",
|
||||||
|
"ultoa",
|
||||||
|
"UMIP",
|
||||||
|
"UMWAIT",
|
||||||
|
"UNMAP",
|
||||||
|
"Unmaskable",
|
||||||
|
"Unreserving",
|
||||||
|
"unseek",
|
||||||
|
"Unswap",
|
||||||
|
"unsynchronized",
|
||||||
|
"UPDT",
|
||||||
|
"UPID",
|
||||||
|
"uroot",
|
||||||
|
"UTID",
|
||||||
|
"VAES",
|
||||||
|
"VBMI",
|
||||||
|
"vectorize",
|
||||||
|
"vfctprintf",
|
||||||
|
"vfsdbg",
|
||||||
|
"Vidx",
|
||||||
|
"Virtio",
|
||||||
|
"VMCS",
|
||||||
|
"VMFUNC",
|
||||||
|
"vmouse",
|
||||||
|
"VMXE",
|
||||||
|
"VNNI",
|
||||||
|
"VNNIW",
|
||||||
|
"VPCLMULQDQ",
|
||||||
|
"VPID",
|
||||||
|
"VPOKE",
|
||||||
|
"VPOPCNTDQ",
|
||||||
|
"WAET",
|
||||||
|
"weakrefalias",
|
||||||
|
"Wignored",
|
||||||
|
"Wmissing",
|
||||||
|
"writecr",
|
||||||
|
"writexcr",
|
||||||
|
"wrmsr",
|
||||||
|
"WWVB",
|
||||||
|
"WWVH",
|
||||||
|
"Xalloc",
|
||||||
|
"xallocv",
|
||||||
|
"Xclac",
|
||||||
|
"xgetbv",
|
||||||
|
"Xmemcpy",
|
||||||
|
"Xmemset",
|
||||||
|
"XSDT",
|
||||||
|
"Xsize",
|
||||||
|
"XSLC",
|
||||||
|
"XSLF",
|
||||||
|
"XSLM",
|
||||||
|
"XSLR",
|
||||||
|
"Xstac",
|
||||||
|
"Xuintptr",
|
||||||
|
"yottabyte",
|
||||||
|
"zettabyte"
|
||||||
|
],
|
||||||
"editor.tabCompletion": "on",
|
"editor.tabCompletion": "on",
|
||||||
"diffEditor.codeLens": true,
|
"diffEditor.codeLens": true,
|
||||||
"editor.quickSuggestionsDelay": 100,
|
"editor.quickSuggestionsDelay": 100,
|
||||||
@ -22,10 +527,6 @@
|
|||||||
"editor.cursorBlinking": "blink",
|
"editor.cursorBlinking": "blink",
|
||||||
"editor.cursorSmoothCaretAnimation": "on",
|
"editor.cursorSmoothCaretAnimation": "on",
|
||||||
"editor.cursorStyle": "line",
|
"editor.cursorStyle": "line",
|
||||||
"editor.cursorWidth": 2,
|
"editor.cursorWidth": 2
|
||||||
"git.alwaysSignOff": true,
|
|
||||||
"git.defaultBranchName": "master",
|
|
||||||
"git.openRepositoryInParentFolders": "always",
|
|
||||||
"C_Cpp.autoAddFileAssociations": false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
22
Fennix Lynx.code-workspace
Normal file
22
Fennix Lynx.code-workspace
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"folders": [
|
||||||
|
{
|
||||||
|
"path": "./Lynx"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"settings": {
|
||||||
|
"debug.allowBreakpointsEverywhere": true,
|
||||||
|
"files.associations": {
|
||||||
|
"*.su": "tsv",
|
||||||
|
"limine.h": "c"
|
||||||
|
},
|
||||||
|
"cSpell.words": [
|
||||||
|
"Bootloader",
|
||||||
|
"COMNULL",
|
||||||
|
"CPUID",
|
||||||
|
"FENNIX",
|
||||||
|
"JMPREL",
|
||||||
|
"UBSAN"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
@ -5,11 +5,67 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"settings": {
|
"settings": {
|
||||||
"terminal.integrated.cwd": "../",
|
|
||||||
"debug.allowBreakpointsEverywhere": true,
|
"debug.allowBreakpointsEverywhere": true,
|
||||||
"git.alwaysSignOff": true,
|
"files.associations": {
|
||||||
"git.defaultBranchName": "master",
|
"*.su": "tsv",
|
||||||
"git.openRepositoryInParentFolders": "always",
|
"thread": "cpp",
|
||||||
"C_Cpp.autoAddFileAssociations": false
|
"bitset": "cpp",
|
||||||
|
"initializer_list": "cpp",
|
||||||
|
"fex.hpp": "c",
|
||||||
|
"types.h": "c",
|
||||||
|
"dlfcn.h": "c",
|
||||||
|
"aux.h": "c",
|
||||||
|
"stddef.h": "c",
|
||||||
|
"stdio.h": "c",
|
||||||
|
"syscalls.h": "c",
|
||||||
|
"syslib.h": "c",
|
||||||
|
"sysfile.h": "c",
|
||||||
|
"ipc.h": "c",
|
||||||
|
"sysbase.h": "c",
|
||||||
|
"inttypes.h": "c",
|
||||||
|
"doomkeys.h": "c",
|
||||||
|
"doomgeneric.h": "c",
|
||||||
|
"elf.h": "c",
|
||||||
|
"init.h": "c",
|
||||||
|
"unused_code": "cpp",
|
||||||
|
"liballoc_1_1.h": "c",
|
||||||
|
"errno.h": "c",
|
||||||
|
"stdlib.h": "c",
|
||||||
|
"stdarg.h": "c",
|
||||||
|
"printf.h": "c",
|
||||||
|
"ctype.h": "c",
|
||||||
|
"unistd.h": "c",
|
||||||
|
"stat.h": "c",
|
||||||
|
"wait.h": "c",
|
||||||
|
"base.h": "c",
|
||||||
|
"ld.h": "c",
|
||||||
|
"syscall.h": "c",
|
||||||
|
"stdint.h": "c",
|
||||||
|
"setjmp.h": "c",
|
||||||
|
"limits.h": "c",
|
||||||
|
"fcntl.h": "c",
|
||||||
|
"pty.h": "c",
|
||||||
|
"string.h": "c",
|
||||||
|
"time.h": "c",
|
||||||
|
"reboot.h": "c",
|
||||||
|
"*.in": "c",
|
||||||
|
"signal.h": "c",
|
||||||
|
"alltypes.h": "c",
|
||||||
|
"pr44328.C": "cpp"
|
||||||
|
},
|
||||||
|
"cSpell.words": [
|
||||||
|
"auxv",
|
||||||
|
"cmpq",
|
||||||
|
"FENNIX",
|
||||||
|
"JMPREL",
|
||||||
|
"Krnl",
|
||||||
|
"liballoc",
|
||||||
|
"libinit",
|
||||||
|
"oldpath",
|
||||||
|
"preinit",
|
||||||
|
"Shdr",
|
||||||
|
"vfctprintf",
|
||||||
|
"WAITSTATUS"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"folders": [
|
|
||||||
{
|
|
||||||
"path": "./tools/website"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"settings": {
|
|
||||||
"debug.allowBreakpointsEverywhere": true,
|
|
||||||
"git.alwaysSignOff": true,
|
|
||||||
"git.defaultBranchName": "master",
|
|
||||||
"git.openRepositoryInParentFolders": "always",
|
|
||||||
"C_Cpp.autoAddFileAssociations": false
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,9 +6,30 @@
|
|||||||
],
|
],
|
||||||
"settings": {
|
"settings": {
|
||||||
"debug.allowBreakpointsEverywhere": true,
|
"debug.allowBreakpointsEverywhere": true,
|
||||||
"git.alwaysSignOff": true,
|
"files.associations": {
|
||||||
"git.defaultBranchName": "master",
|
"*.su": "tsv",
|
||||||
"git.openRepositoryInParentFolders": "always",
|
"thread": "cpp",
|
||||||
"C_Cpp.autoAddFileAssociations": false
|
"bitset": "cpp",
|
||||||
|
"initializer_list": "cpp",
|
||||||
|
"semaphore": "cpp",
|
||||||
|
"memory": "cpp",
|
||||||
|
"limits": "cpp",
|
||||||
|
"climits": "cpp",
|
||||||
|
"iterator": "cpp",
|
||||||
|
"ranges": "cpp",
|
||||||
|
"cassert": "cpp",
|
||||||
|
"concepts": "cpp",
|
||||||
|
"cctype": "cpp",
|
||||||
|
"tuple": "cpp",
|
||||||
|
"streambuf": "cpp",
|
||||||
|
"system_error": "cpp",
|
||||||
|
"coroutine": "cpp",
|
||||||
|
"static_vector": "cpp",
|
||||||
|
"string_view": "cpp",
|
||||||
|
"compare": "cpp",
|
||||||
|
"ostream": "cpp",
|
||||||
|
"unordered_map": "cpp",
|
||||||
|
"vector": "cpp"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,91 +0,0 @@
|
|||||||
# Usage: add-symbol-file-all <filename> [<offset>]
|
|
||||||
# remove-symbol-file-all <filename> [<offset>]
|
|
||||||
#
|
|
||||||
# Credit: https://stackoverflow.com/a/33087762/9352057
|
|
||||||
# CC BY-SA 4.0
|
|
||||||
|
|
||||||
python
|
|
||||||
import subprocess
|
|
||||||
import re
|
|
||||||
|
|
||||||
def relocatesections(filename, addr):
|
|
||||||
p = subprocess.Popen(["readelf", "-S", filename], stdout = subprocess.PIPE)
|
|
||||||
|
|
||||||
sections = []
|
|
||||||
textaddr = '0'
|
|
||||||
for line in p.stdout.readlines():
|
|
||||||
line = line.decode("utf-8").strip()
|
|
||||||
if not line.startswith('[') or line.startswith('[Nr]'):
|
|
||||||
continue
|
|
||||||
|
|
||||||
line = re.sub(r' +', ' ', line)
|
|
||||||
line = re.sub(r'\[ *(\d+)\]', '\g<1>', line)
|
|
||||||
fieldsvalue = line.split(' ')
|
|
||||||
fieldsname = ['number', 'name', 'type', 'addr', 'offset', 'size', 'entsize', 'flags', 'link', 'info', 'addralign']
|
|
||||||
sec = dict(zip(fieldsname, fieldsvalue))
|
|
||||||
|
|
||||||
if sec['number'] == '0':
|
|
||||||
continue
|
|
||||||
|
|
||||||
sections.append(sec)
|
|
||||||
|
|
||||||
if sec['name'] == '.text':
|
|
||||||
textaddr = sec['addr']
|
|
||||||
|
|
||||||
return (textaddr, sections)
|
|
||||||
|
|
||||||
|
|
||||||
class AddSymbolFileAll(gdb.Command):
|
|
||||||
"""The right version for add-symbol-file"""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(AddSymbolFileAll, self).__init__("add-symbol-file-all", gdb.COMMAND_USER)
|
|
||||||
self.dont_repeat()
|
|
||||||
|
|
||||||
def invoke(self, arg, from_tty):
|
|
||||||
argv = gdb.string_to_argv(arg)
|
|
||||||
filename = argv[0]
|
|
||||||
|
|
||||||
if len(argv) > 1:
|
|
||||||
offset = int(str(gdb.parse_and_eval(argv[1])), 0)
|
|
||||||
else:
|
|
||||||
offset = 0
|
|
||||||
|
|
||||||
(textaddr, sections) = relocatesections(filename, offset)
|
|
||||||
|
|
||||||
cmd = "add-symbol-file %s 0x%08x" % (filename, int(textaddr, 16) + offset)
|
|
||||||
|
|
||||||
for s in sections:
|
|
||||||
addr = int(s['addr'], 16)
|
|
||||||
if s['name'] == '.text' or addr == 0:
|
|
||||||
continue
|
|
||||||
|
|
||||||
cmd += " -s %s 0x%08x" % (s['name'], addr + offset)
|
|
||||||
|
|
||||||
gdb.execute(cmd)
|
|
||||||
|
|
||||||
class RemoveSymbolFileAll(gdb.Command):
|
|
||||||
"""The right version for remove-symbol-file"""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(RemoveSymbolFileAll, self).__init__("remove-symbol-file-all", gdb.COMMAND_USER)
|
|
||||||
self.dont_repeat()
|
|
||||||
|
|
||||||
def invoke(self, arg, from_tty):
|
|
||||||
argv = gdb.string_to_argv(arg)
|
|
||||||
filename = argv[0]
|
|
||||||
|
|
||||||
if len(argv) > 1:
|
|
||||||
offset = int(str(gdb.parse_and_eval(argv[1])), 0)
|
|
||||||
else:
|
|
||||||
offset = 0
|
|
||||||
|
|
||||||
(textaddr, _) = relocatesections(filename, offset)
|
|
||||||
|
|
||||||
cmd = "remove-symbol-file -a 0x%08x" % (int(textaddr, 16) + offset)
|
|
||||||
gdb.execute(cmd)
|
|
||||||
|
|
||||||
|
|
||||||
AddSymbolFileAll()
|
|
||||||
RemoveSymbolFileAll()
|
|
||||||
end
|
|
38
Kernel/.github/workflows/flawfinder.yml
vendored
Normal file
38
Kernel/.github/workflows/flawfinder.yml
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# This workflow uses actions that are not certified by GitHub.
|
||||||
|
# They are provided by a third-party and are governed by
|
||||||
|
# separate terms of service, privacy policy, and support
|
||||||
|
# documentation.
|
||||||
|
|
||||||
|
name: flawfinder
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "main" ]
|
||||||
|
pull_request:
|
||||||
|
# The branches below must be a subset of the branches above
|
||||||
|
branches: [ "main" ]
|
||||||
|
schedule:
|
||||||
|
- cron: '21 1 * * 1'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
flawfinder:
|
||||||
|
name: Flawfinder
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: flawfinder_scan
|
||||||
|
uses: david-a-wheeler/flawfinder@8e4a779ad59dbfaee5da586aa9210853b701959c
|
||||||
|
with:
|
||||||
|
arguments: '--sarif ./'
|
||||||
|
output: 'flawfinder_results.sarif'
|
||||||
|
|
||||||
|
- name: Upload analysis results to GitHub Security tab
|
||||||
|
uses: github/codeql-action/upload-sarif@v2
|
||||||
|
with:
|
||||||
|
sarif_file: ${{github.workspace}}/flawfinder_results.sarif
|
4
Kernel/.gitignore
vendored
4
Kernel/.gitignore
vendored
@ -2,5 +2,7 @@
|
|||||||
*.su
|
*.su
|
||||||
*.gcno
|
*.gcno
|
||||||
*.map
|
*.map
|
||||||
fennix.elf
|
*.fsys
|
||||||
*.log
|
*.log
|
||||||
|
Files/*.psf
|
||||||
|
.dccache
|
||||||
|
85
Kernel/.vscode/c_boilerplates.code-snippets
vendored
85
Kernel/.vscode/c_boilerplates.code-snippets
vendored
@ -1,69 +1,17 @@
|
|||||||
{
|
{
|
||||||
"Fennix Kernel C++ Header": {
|
"Fennix Kernel Header": {
|
||||||
"isFileTemplate": true,
|
|
||||||
"scope": "c,cpp",
|
|
||||||
"prefix": [
|
"prefix": [
|
||||||
"head",
|
"head",
|
||||||
],
|
],
|
||||||
"body": [
|
"body": [
|
||||||
"/*",
|
"#ifndef __FENNIX_KERNEL_${2:header}_H__",
|
||||||
"\tThis file is part of Fennix Kernel.",
|
"#define __FENNIX_KERNEL_${2:header}_H__",
|
||||||
"",
|
|
||||||
"\tFennix Kernel is free software: you can redistribute it and/or",
|
|
||||||
"\tmodify it under the terms of the GNU General Public License as",
|
|
||||||
"\tpublished by the Free Software Foundation, either version 3 of",
|
|
||||||
"\tthe License, or (at your option) any later version.",
|
|
||||||
"",
|
|
||||||
"\tFennix Kernel is distributed in the hope that it will be useful,",
|
|
||||||
"\tbut WITHOUT ANY WARRANTY; without even the implied warranty of",
|
|
||||||
"\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the",
|
|
||||||
"\tGNU General Public License for more details.",
|
|
||||||
"",
|
|
||||||
"\tYou should have received a copy of the GNU General Public License",
|
|
||||||
"\talong with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.",
|
|
||||||
"*/",
|
|
||||||
"",
|
|
||||||
"#pragma once",
|
|
||||||
"",
|
|
||||||
"$0",
|
|
||||||
"",
|
|
||||||
"$1",
|
|
||||||
""
|
|
||||||
],
|
|
||||||
"description": "Create kernel header."
|
|
||||||
},
|
|
||||||
"Fennix Kernel C Header": {
|
|
||||||
"isFileTemplate": true,
|
|
||||||
"scope": "c,cpp",
|
|
||||||
"prefix": [
|
|
||||||
"headc",
|
|
||||||
],
|
|
||||||
"body": [
|
|
||||||
"/*",
|
|
||||||
"\tThis file is part of Fennix Kernel.",
|
|
||||||
"",
|
|
||||||
"\tFennix Kernel is free software: you can redistribute it and/or",
|
|
||||||
"\tmodify it under the terms of the GNU General Public License as",
|
|
||||||
"\tpublished by the Free Software Foundation, either version 3 of",
|
|
||||||
"\tthe License, or (at your option) any later version.",
|
|
||||||
"",
|
|
||||||
"\tFennix Kernel is distributed in the hope that it will be useful,",
|
|
||||||
"\tbut WITHOUT ANY WARRANTY; without even the implied warranty of",
|
|
||||||
"\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the",
|
|
||||||
"\tGNU General Public License for more details.",
|
|
||||||
"",
|
|
||||||
"\tYou should have received a copy of the GNU General Public License",
|
|
||||||
"\talong with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.",
|
|
||||||
"*/",
|
|
||||||
"",
|
|
||||||
"#ifndef __FENNIX_KERNEL_${1:header}_H__",
|
|
||||||
"#define __FENNIX_KERNEL_${1:header}_H__",
|
|
||||||
"",
|
"",
|
||||||
"#include <types.h>",
|
"#include <types.h>",
|
||||||
"",
|
"",
|
||||||
"$0",
|
"$0",
|
||||||
"",
|
"",
|
||||||
"#endif // !__FENNIX_KERNEL_${1:header}_H__",
|
"#endif // !__FENNIX_KERNEL_${2:header}_H__",
|
||||||
""
|
""
|
||||||
],
|
],
|
||||||
"description": "Create kernel header."
|
"description": "Create kernel header."
|
||||||
@ -76,30 +24,5 @@
|
|||||||
"/** @brief $0 */"
|
"/** @brief $0 */"
|
||||||
],
|
],
|
||||||
"description": "Create kernel documentation brief."
|
"description": "Create kernel documentation brief."
|
||||||
},
|
|
||||||
"License": {
|
|
||||||
"isFileTemplate": true,
|
|
||||||
"prefix": [
|
|
||||||
"license",
|
|
||||||
],
|
|
||||||
"body": [
|
|
||||||
"/*",
|
|
||||||
"\tThis file is part of Fennix Kernel.",
|
|
||||||
"",
|
|
||||||
"\tFennix Kernel is free software: you can redistribute it and/or",
|
|
||||||
"\tmodify it under the terms of the GNU General Public License as",
|
|
||||||
"\tpublished by the Free Software Foundation, either version 3 of",
|
|
||||||
"\tthe License, or (at your option) any later version.",
|
|
||||||
"",
|
|
||||||
"\tFennix Kernel is distributed in the hope that it will be useful,",
|
|
||||||
"\tbut WITHOUT ANY WARRANTY; without even the implied warranty of",
|
|
||||||
"\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the",
|
|
||||||
"\tGNU General Public License for more details.",
|
|
||||||
"",
|
|
||||||
"\tYou should have received a copy of the GNU General Public License",
|
|
||||||
"\talong with Fennix Kernel. If not, see <https://www.gnu.org/licenses/>.",
|
|
||||||
"*/"
|
|
||||||
],
|
|
||||||
"description": "Create kernel license."
|
|
||||||
}
|
}
|
||||||
}
|
}
|
190
Kernel/.vscode/c_cpp_properties.json
vendored
190
Kernel/.vscode/c_cpp_properties.json
vendored
@ -1,199 +1,47 @@
|
|||||||
{
|
{
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
{
|
||||||
"name": "Fennix x64 (Linux, GCC, debug)",
|
"name": "Linux",
|
||||||
"includePath": [
|
"includePath": [
|
||||||
"${workspaceFolder}/include",
|
"${workspaceFolder}/include/**"
|
||||||
"${workspaceFolder}/include/**",
|
|
||||||
"${workspaceFolder}/include_std",
|
|
||||||
"${workspaceFolder}/include_std/**",
|
|
||||||
"${workspaceFolder}/arch/amd64/include"
|
|
||||||
],
|
],
|
||||||
"defines": [
|
"defines": [
|
||||||
|
"__debug_vscode__",
|
||||||
|
"KERNEL_NAME=\"Fennix\"",
|
||||||
|
"KERNEL_VERSION=\"1.0\"",
|
||||||
|
"GIT_COMMIT=\"0000000000000000000000000000000000000000\"",
|
||||||
|
"GIT_COMMIT_SHORT=\"0000000\"",
|
||||||
"DEBUG=\"1\""
|
"DEBUG=\"1\""
|
||||||
],
|
],
|
||||||
"forcedInclude": [
|
"compilerPath": "/usr/bin/gcc",
|
||||||
"${workspaceFolder}/.vscode/preinclude.h"
|
|
||||||
],
|
|
||||||
"compilerPath": "${workspaceFolder}/../tools/cross/bin/x86_64-fennix-gcc",
|
|
||||||
"cStandard": "c17",
|
"cStandard": "c17",
|
||||||
"cppStandard": "c++20",
|
"cppStandard": "c++20",
|
||||||
"intelliSenseMode": "gcc-x64",
|
"intelliSenseMode": "gcc-x64",
|
||||||
"configurationProvider": "ms-vscode.makefile-tools",
|
"configurationProvider": "ms-vscode.makefile-tools",
|
||||||
"compilerArgs": [
|
"compilerArgs": [
|
||||||
// Compiler flags
|
// "-m32",
|
||||||
"-fno-pic",
|
"-mcmodel=kernel", /* 64-bit only */
|
||||||
"-fno-pie",
|
|
||||||
"-mno-red-zone",
|
|
||||||
"-march=core2",
|
|
||||||
"-pipe",
|
|
||||||
"-mcmodel=kernel",
|
|
||||||
"-fno-builtin",
|
|
||||||
"-m64",
|
|
||||||
"-fcoroutines",
|
|
||||||
// Warnings
|
|
||||||
"-Wall",
|
|
||||||
"-Wextra",
|
|
||||||
"-Wfloat-equal",
|
|
||||||
"-Wpointer-arith",
|
|
||||||
"-Wcast-align",
|
|
||||||
"-Wredundant-decls",
|
|
||||||
"-Winit-self",
|
|
||||||
"-Wswitch-default",
|
|
||||||
"-Wstrict-overflow=5",
|
|
||||||
"-Wconversion",
|
|
||||||
// C++ flags
|
|
||||||
"-fno-rtti",
|
"-fno-rtti",
|
||||||
"-fno-exceptions",
|
"-fexceptions",
|
||||||
// Linker flags
|
|
||||||
"-T${workspaceFolder}/arch/amd64/linker.ld",
|
|
||||||
"-Wl,-static,--no-dynamic-linker,-ztext",
|
|
||||||
"-nostdlib",
|
|
||||||
"-nodefaultlibs",
|
|
||||||
"-nolibc",
|
|
||||||
"-zmax-page-size=0x1000",
|
|
||||||
"-shared",
|
|
||||||
// Debug flags
|
|
||||||
"-ggdb3",
|
|
||||||
"-O0",
|
|
||||||
"-fdiagnostics-color=always",
|
|
||||||
"-fverbose-asm",
|
|
||||||
"-fstack-usage",
|
|
||||||
"-fstack-check",
|
|
||||||
"-fsanitize=undefined",
|
|
||||||
// VSCode flags
|
|
||||||
"-ffreestanding",
|
|
||||||
"-nostdinc",
|
|
||||||
"-nostdinc++"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Fennix x32 (Linux, GCC, debug)",
|
|
||||||
"includePath": [
|
|
||||||
"${workspaceFolder}/include",
|
|
||||||
"${workspaceFolder}/include/**",
|
|
||||||
"${workspaceFolder}/include_std",
|
|
||||||
"${workspaceFolder}/include_std/**",
|
|
||||||
"${workspaceFolder}/arch/i386/include"
|
|
||||||
],
|
|
||||||
"forcedInclude": [
|
|
||||||
"${workspaceFolder}/.vscode/preinclude.h"
|
|
||||||
],
|
|
||||||
"defines": [
|
|
||||||
"DEBUG=\"1\""
|
|
||||||
],
|
|
||||||
"compilerPath": "${workspaceFolder}/../tools/cross/bin/i386-fennix-gcc",
|
|
||||||
"cStandard": "c17",
|
|
||||||
"cppStandard": "c++20",
|
|
||||||
"intelliSenseMode": "gcc-x86",
|
|
||||||
"configurationProvider": "ms-vscode.makefile-tools",
|
|
||||||
"compilerArgs": [
|
|
||||||
// Compiler flags
|
|
||||||
"-fno-pic",
|
"-fno-pic",
|
||||||
"-fno-pie",
|
"-fno-pie",
|
||||||
"-mno-80387",
|
"-mno-80387",
|
||||||
"-mno-mmx",
|
"-mno-mmx",
|
||||||
"-mno-3dnow",
|
"-mno-3dnow",
|
||||||
"-mno-red-zone",
|
"-mno-red-zone",
|
||||||
"-march=pentium",
|
"-mno-sse",
|
||||||
|
"-mno-sse2",
|
||||||
|
"-march=nehalem",
|
||||||
"-pipe",
|
"-pipe",
|
||||||
"-msoft-float",
|
"-msoft-float",
|
||||||
"-fno-builtin",
|
"-fno-builtin",
|
||||||
"-m32",
|
"-ffreestanding",
|
||||||
"-fcoroutines",
|
"-nostdinc",
|
||||||
// Warnings
|
|
||||||
"-Wall",
|
|
||||||
"-Wextra",
|
|
||||||
"-Wfloat-equal",
|
|
||||||
"-Wpointer-arith",
|
|
||||||
"-Wcast-align",
|
|
||||||
"-Wredundant-decls",
|
|
||||||
"-Winit-self",
|
|
||||||
"-Wswitch-default",
|
|
||||||
"-Wstrict-overflow=5",
|
|
||||||
"-Wconversion",
|
|
||||||
// C++ flags
|
|
||||||
"-fno-rtti",
|
|
||||||
"-fno-exceptions",
|
|
||||||
// Linker flags
|
|
||||||
"-T${workspaceFolder}/arch/i386/linker.ld",
|
|
||||||
"-Wl,-static,--no-dynamic-linker,-ztext",
|
"-Wl,-static,--no-dynamic-linker,-ztext",
|
||||||
"-nostdlib",
|
|
||||||
"-nodefaultlibs",
|
|
||||||
"-nolibc",
|
|
||||||
"-zmax-page-size=0x1000",
|
|
||||||
"-shared",
|
"-shared",
|
||||||
// Debug flags
|
"-zmax-page-size=0x1000",
|
||||||
"-ggdb3",
|
"-nostdinc++",
|
||||||
"-O0",
|
"-fsanitize=undefined"
|
||||||
"-fdiagnostics-color=always",
|
|
||||||
"-fverbose-asm",
|
|
||||||
"-fstack-usage",
|
|
||||||
"-fstack-check",
|
|
||||||
"-fsanitize=undefined",
|
|
||||||
// VSCode flags
|
|
||||||
"-ffreestanding",
|
|
||||||
"-nostdinc",
|
|
||||||
"-nostdinc++"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Fennix Aarch64 (Linux, GCC, debug)",
|
|
||||||
"includePath": [
|
|
||||||
"${workspaceFolder}/include",
|
|
||||||
"${workspaceFolder}/include/**",
|
|
||||||
"${workspaceFolder}/include_std",
|
|
||||||
"${workspaceFolder}/include_std/**",
|
|
||||||
"${workspaceFolder}/arch/aarch64/include"
|
|
||||||
],
|
|
||||||
"forcedInclude": [
|
|
||||||
"${workspaceFolder}/.vscode/preinclude.h"
|
|
||||||
],
|
|
||||||
"defines": [
|
|
||||||
"DEBUG=\"1\""
|
|
||||||
],
|
|
||||||
"compilerPath": "${workspaceFolder}/../tools/cross/bin/aarch64-fennix-gcc",
|
|
||||||
"cStandard": "c17",
|
|
||||||
"cppStandard": "c++20",
|
|
||||||
"intelliSenseMode": "linux-gcc-arm64",
|
|
||||||
"configurationProvider": "ms-vscode.makefile-tools",
|
|
||||||
"compilerArgs": [
|
|
||||||
// Compiler flags
|
|
||||||
"-pipe",
|
|
||||||
"-fno-builtin",
|
|
||||||
"-msoft-float",
|
|
||||||
"-fPIC",
|
|
||||||
"-Wstack-protector",
|
|
||||||
"-fcoroutines",
|
|
||||||
// Warnings
|
|
||||||
"-Wall",
|
|
||||||
"-Wextra",
|
|
||||||
"-Wfloat-equal",
|
|
||||||
"-Wpointer-arith",
|
|
||||||
"-Wcast-align",
|
|
||||||
"-Wredundant-decls",
|
|
||||||
"-Winit-self",
|
|
||||||
"-Wswitch-default",
|
|
||||||
"-Wstrict-overflow=5",
|
|
||||||
"-Wconversion",
|
|
||||||
// C++ flags
|
|
||||||
"-fno-rtti",
|
|
||||||
"-fno-exceptions",
|
|
||||||
// Linker flags
|
|
||||||
"-T${workspaceFolder}/arch/aarch64/linker.ld",
|
|
||||||
"-fPIC",
|
|
||||||
// Debug flags
|
|
||||||
"-ggdb3",
|
|
||||||
"-O0",
|
|
||||||
"-fdiagnostics-color=always",
|
|
||||||
"-fverbose-asm",
|
|
||||||
"-fstack-usage",
|
|
||||||
"-fstack-check",
|
|
||||||
"-fsanitize=undefined",
|
|
||||||
// VSCode flags
|
|
||||||
"-ffreestanding",
|
|
||||||
"-nostdinc",
|
|
||||||
"-nostdinc++"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
16
Kernel/.vscode/extensions.json
vendored
Normal file
16
Kernel/.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"pejmannikram.vscode-auto-scroll",
|
||||||
|
"aaron-bond.better-comments",
|
||||||
|
"ms-vscode.cpptools",
|
||||||
|
"streetsidesoftware.code-spell-checker",
|
||||||
|
"naumovs.color-highlight",
|
||||||
|
"cschlosser.doxdocgen",
|
||||||
|
"ferrierbenjamin.fold-unfold-all-icone",
|
||||||
|
"ajshort.include-autocomplete",
|
||||||
|
"zixuanwang.linkerscript",
|
||||||
|
"ibm.output-colorizer",
|
||||||
|
"christian-kohler.path-intellisense",
|
||||||
|
"Gruntfuggly.todo-tree"
|
||||||
|
]
|
||||||
|
}
|
1
Kernel/.vscode/launch.json
vendored
1
Kernel/.vscode/launch.json
vendored
@ -1 +0,0 @@
|
|||||||
../../.vscode/launch.json
|
|
40
Kernel/.vscode/launch.json
vendored
Normal file
40
Kernel/.vscode/launch.json
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Attach to a running QEMU instance",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceRoot}/kernel.fsys",
|
||||||
|
"cwd": "${workspaceRoot}",
|
||||||
|
"args": [],
|
||||||
|
"targetArchitecture": "x64",
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"miDebuggerPath": "/usr/bin/gdb",
|
||||||
|
"miDebuggerArgs": "",
|
||||||
|
"externalConsole": false,
|
||||||
|
"additionalSOLibSearchPath": "${workspaceRoot}",
|
||||||
|
"customLaunchSetupCommands": [
|
||||||
|
{
|
||||||
|
"text": "target remote localhost:1234",
|
||||||
|
"description": "Connect to QEMU remote debugger"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"setupCommands": [
|
||||||
|
{
|
||||||
|
"description": "Enable pretty-printing for gdb",
|
||||||
|
"text": "-enable-pretty-printing",
|
||||||
|
"ignoreFailures": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "set breakpoint pending on",
|
||||||
|
"description": "Make breakpoint pending on future shared library load."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "file ${workspaceRoot}/kernel.fsys",
|
||||||
|
"description": "Load binary."
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
14
Kernel/.vscode/preinclude.h
vendored
14
Kernel/.vscode/preinclude.h
vendored
@ -1,14 +0,0 @@
|
|||||||
#undef __linux__
|
|
||||||
#undef __WIN32__
|
|
||||||
#undef __WIN64__
|
|
||||||
#undef _WIN32
|
|
||||||
#undef _WIN64
|
|
||||||
#undef __APPLE__
|
|
||||||
#undef __clang__
|
|
||||||
#define __vscode__ 1
|
|
||||||
#define __kernel__ 1
|
|
||||||
#define KERNEL_NAME "Fennix"
|
|
||||||
#define KERNEL_ARCH "amd64"
|
|
||||||
#define KERNEL_VERSION "1.0"
|
|
||||||
#define GIT_COMMIT "0000000000000000000000000000000000000000"
|
|
||||||
#define GIT_COMMIT_SHORT "0000000"
|
|
11
Kernel/.vscode/settings.json
vendored
11
Kernel/.vscode/settings.json
vendored
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"C_Cpp.errorSquiggles": "enabled",
|
"C_Cpp.errorSquiggles": "Enabled",
|
||||||
"C_Cpp.autocompleteAddParentheses": true,
|
"C_Cpp.autocompleteAddParentheses": true,
|
||||||
"C_Cpp.codeAnalysis.clangTidy.enabled": true,
|
"C_Cpp.codeAnalysis.clangTidy.enabled": true,
|
||||||
"C_Cpp.clang_format_style": "Visual Studio",
|
"C_Cpp.clang_format_style": "Visual Studio",
|
||||||
@ -8,16 +8,11 @@
|
|||||||
"C_Cpp.default.cppStandard": "c++20",
|
"C_Cpp.default.cppStandard": "c++20",
|
||||||
"C_Cpp.intelliSenseMemoryLimit": 16384,
|
"C_Cpp.intelliSenseMemoryLimit": 16384,
|
||||||
"editor.smoothScrolling": true,
|
"editor.smoothScrolling": true,
|
||||||
"editor.cursorSmoothCaretAnimation": "on",
|
"editor.cursorSmoothCaretAnimation": true,
|
||||||
"C_Cpp.codeAnalysis.clangTidy.checks.disabled": [
|
"C_Cpp.codeAnalysis.clangTidy.checks.disabled": [
|
||||||
"clang-analyzer-security.insecureAPI.strcpy",
|
"clang-analyzer-security.insecureAPI.strcpy",
|
||||||
"clang-diagnostic-unknown-warning-option",
|
"clang-diagnostic-unknown-warning-option",
|
||||||
"clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling",
|
"clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling",
|
||||||
"clang-diagnostic-implicit-exception-spec-mismatch",
|
"clang-diagnostic-implicit-exception-spec-mismatch"
|
||||||
"clang-diagnostic-unknown-attributes",
|
|
||||||
"clang-diagnostic-user-defined-literals",
|
|
||||||
"clang-diagnostic-non-pod-varargs",
|
|
||||||
"clang-diagnostic-non-pod-varargs",
|
|
||||||
"clang-diagnostic-non-pod-varargs"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
1
Kernel/.vscode/tasks.json
vendored
1
Kernel/.vscode/tasks.json
vendored
@ -1 +0,0 @@
|
|||||||
../../.vscode/tasks.json
|
|
10
Kernel/Architecture/aarch64/Entry.cpp
Normal file
10
Kernel/Architecture/aarch64/Entry.cpp
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
#include <debug.h>
|
||||||
|
#include <cpu.hpp>
|
||||||
|
|
||||||
|
EXTERNC void arm64Entry(uint64_t dtb_ptr32, uint64_t x1, uint64_t x2, uint64_t x3)
|
||||||
|
{
|
||||||
|
trace("Hello, World!");
|
||||||
|
CPU::Halt(true);
|
||||||
|
}
|
14
Kernel/Architecture/aarch64/SystemCalls.cpp
Normal file
14
Kernel/Architecture/aarch64/SystemCalls.cpp
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#include <syscalls.hpp>
|
||||||
|
|
||||||
|
#include <cpu.hpp>
|
||||||
|
|
||||||
|
extern "C" __attribute__((naked, used, no_stack_protector)) void SystemCallHandlerStub()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" uint64_t SystemCallsHandler(SyscallsFrame *regs);
|
||||||
|
|
||||||
|
void InitializeSystemCalls()
|
||||||
|
{
|
||||||
|
}
|
40
Kernel/Architecture/aarch64/cpu/SymmetricMultiprocessing.cpp
Normal file
40
Kernel/Architecture/aarch64/cpu/SymmetricMultiprocessing.cpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include <smp.hpp>
|
||||||
|
|
||||||
|
#include <interrupts.hpp>
|
||||||
|
#include <memory.hpp>
|
||||||
|
#include <cpu.hpp>
|
||||||
|
|
||||||
|
#include "../../../kernel.h"
|
||||||
|
|
||||||
|
volatile bool CPUEnabled = false;
|
||||||
|
|
||||||
|
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
||||||
|
static __attribute__((aligned(PAGE_SIZE))) CPUData CPUs[MAX_CPU] = {0};
|
||||||
|
|
||||||
|
CPUData *GetCPU(uint64_t id) { return &CPUs[id]; }
|
||||||
|
|
||||||
|
CPUData *GetCurrentCPU()
|
||||||
|
{
|
||||||
|
uint64_t ret = 0;
|
||||||
|
|
||||||
|
if (!CPUs[ret].IsActive)
|
||||||
|
{
|
||||||
|
error("CPU %d is not active!", ret);
|
||||||
|
return &CPUs[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CPUs[ret].Checksum != CPU_DATA_CHECKSUM)
|
||||||
|
{
|
||||||
|
error("CPU %d data is corrupted!", ret);
|
||||||
|
return &CPUs[0];
|
||||||
|
}
|
||||||
|
return &CPUs[ret];
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace SMP
|
||||||
|
{
|
||||||
|
void Initialize(void *madt)
|
||||||
|
{
|
||||||
|
fixme("SMP::Initialize() is not implemented!");
|
||||||
|
}
|
||||||
|
}
|
42
Kernel/Architecture/aarch64/linker.ld
Normal file
42
Kernel/Architecture/aarch64/linker.ld
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = 0x80000;
|
||||||
|
_kernel_start = .;
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
KEEP(*(.text.boot))
|
||||||
|
*(.text .text.*)
|
||||||
|
}
|
||||||
|
. = ALIGN(4096);
|
||||||
|
_kernel_text_end = .;
|
||||||
|
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
*(.data .data.*)
|
||||||
|
}
|
||||||
|
. = ALIGN(4096);
|
||||||
|
_kernel_data_end = .;
|
||||||
|
|
||||||
|
.rodata :
|
||||||
|
{
|
||||||
|
*(.rodata .rodata.*)
|
||||||
|
}
|
||||||
|
. = ALIGN(4096);
|
||||||
|
_kernel_rodata_end = .;
|
||||||
|
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
*(.bss .bss.*)
|
||||||
|
}
|
||||||
|
. = ALIGN(4096);
|
||||||
|
_kernel_end = .;
|
||||||
|
_bss_size = _kernel_end - _kernel_rodata_end;
|
||||||
|
|
||||||
|
/DISCARD/ :
|
||||||
|
{
|
||||||
|
*(.comment*)
|
||||||
|
*(.note*)
|
||||||
|
}
|
||||||
|
}
|
17
Kernel/Architecture/aarch64/runtime/crt0.S
Normal file
17
Kernel/Architecture/aarch64/runtime/crt0.S
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// .section ".text.boot"
|
||||||
|
//
|
||||||
|
// .global _start
|
||||||
|
// .org 0x80000
|
||||||
|
// _start:
|
||||||
|
// ldr x5, =_start
|
||||||
|
// mov sp, x5
|
||||||
|
// ldr x5, =_kernel_rodata_end
|
||||||
|
// ldr w6, =_bss_size
|
||||||
|
// 1: cbz w6, 2f
|
||||||
|
// str xzr, [x5], #8
|
||||||
|
// sub w6, w6, #1
|
||||||
|
// cbnz w6, 1b
|
||||||
|
// 2: bl arm64Entry
|
||||||
|
// Halt:
|
||||||
|
// wfe
|
||||||
|
// b Halt
|
17
Kernel/Architecture/aarch64/runtime/crt1.S
Normal file
17
Kernel/Architecture/aarch64/runtime/crt1.S
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
.section ".text.boot"
|
||||||
|
|
||||||
|
.global _start
|
||||||
|
.org 0x80000
|
||||||
|
_start:
|
||||||
|
ldr x5, =_start
|
||||||
|
mov sp, x5
|
||||||
|
ldr x5, =_kernel_rodata_end
|
||||||
|
ldr w6, =_bss_size
|
||||||
|
1: cbz w6, 2f
|
||||||
|
str xzr, [x5], #8
|
||||||
|
sub w6, w6, #1
|
||||||
|
cbnz w6, 1b
|
||||||
|
2: bl arm64Entry
|
||||||
|
Halt:
|
||||||
|
wfe
|
||||||
|
b Halt
|
1
Kernel/Architecture/aarch64/runtime/crtbegin.c
Normal file
1
Kernel/Architecture/aarch64/runtime/crtbegin.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
// C++ constructor/destructor stuff
|
1
Kernel/Architecture/aarch64/runtime/crtend.c
Normal file
1
Kernel/Architecture/aarch64/runtime/crtend.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
// C++ constructor/destructor stuff
|
13
Kernel/Architecture/aarch64/runtime/crti.S
Normal file
13
Kernel/Architecture/aarch64/runtime/crti.S
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.section .init
|
||||||
|
.global _init
|
||||||
|
.type _init, @function
|
||||||
|
_init:
|
||||||
|
// push %rbp
|
||||||
|
// movq %rsp, %rbp
|
||||||
|
|
||||||
|
.section .fini
|
||||||
|
.global _fini
|
||||||
|
.type _fini, @function
|
||||||
|
_fini:
|
||||||
|
// push %rbp
|
||||||
|
// movq %rsp, %rbp
|
7
Kernel/Architecture/aarch64/runtime/crtn.S
Normal file
7
Kernel/Architecture/aarch64/runtime/crtn.S
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
.section .init
|
||||||
|
// popq %rbp
|
||||||
|
ret
|
||||||
|
|
||||||
|
.section .fini
|
||||||
|
// popq %rbp
|
||||||
|
ret
|
@ -0,0 +1,130 @@
|
|||||||
|
#include "acpi.hpp"
|
||||||
|
|
||||||
|
#include <debug.h>
|
||||||
|
#include <io.h>
|
||||||
|
|
||||||
|
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
||||||
|
|
||||||
|
namespace ACPI
|
||||||
|
{
|
||||||
|
void *ACPI::FindTable(ACPI::ACPIHeader *ACPIHeader, char *Signature)
|
||||||
|
{
|
||||||
|
for (uint64_t t = 0; t < ((ACPIHeader->Length - sizeof(ACPI::ACPIHeader)) / (XSDTSupported ? 8 : 4)); t++)
|
||||||
|
{
|
||||||
|
// Should I be concerned about unaligned memory access?
|
||||||
|
ACPI::ACPIHeader *SDTHdr = nullptr;
|
||||||
|
if (XSDTSupported)
|
||||||
|
SDTHdr = (ACPI::ACPIHeader *)(*(uint64_t *)((uint64_t)ACPIHeader + sizeof(ACPI::ACPIHeader) + (t * 8)));
|
||||||
|
else
|
||||||
|
SDTHdr = (ACPI::ACPIHeader *)(*(uint32_t *)((uint64_t)ACPIHeader + sizeof(ACPI::ACPIHeader) + (t * 4)));
|
||||||
|
|
||||||
|
for (uint64_t i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if (SDTHdr->Signature[i] != Signature[i])
|
||||||
|
break;
|
||||||
|
if (i == 3)
|
||||||
|
{
|
||||||
|
trace("%s found!", Signature);
|
||||||
|
return SDTHdr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// warn("%s not found!", Signature);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACPI::SearchTables(ACPIHeader *Header)
|
||||||
|
{
|
||||||
|
if (!Header)
|
||||||
|
return;
|
||||||
|
|
||||||
|
HPET = (HPETHeader *)FindTable(XSDT, (char *)"HPET");
|
||||||
|
FADT = (FADTHeader *)FindTable(XSDT, (char *)"FACP");
|
||||||
|
MCFG = (MCFGHeader *)FindTable(XSDT, (char *)"MCFG");
|
||||||
|
BGRT = (BGRTHeader *)FindTable(XSDT, (char *)"BGRT");
|
||||||
|
SRAT = (SRATHeader *)FindTable(XSDT, (char *)"SRAT");
|
||||||
|
TPM2 = (TPM2Header *)FindTable(XSDT, (char *)"TPM2");
|
||||||
|
TCPA = (TCPAHeader *)FindTable(XSDT, (char *)"TCPA");
|
||||||
|
WAET = (WAETHeader *)FindTable(XSDT, (char *)"WAET");
|
||||||
|
MADT = (MADTHeader *)FindTable(XSDT, (char *)"APIC");
|
||||||
|
HEST = (HESTHeader *)FindTable(XSDT, (char *)"HEST");
|
||||||
|
FindTable(XSDT, (char *)"BERT");
|
||||||
|
FindTable(XSDT, (char *)"CPEP");
|
||||||
|
FindTable(XSDT, (char *)"DSDT");
|
||||||
|
FindTable(XSDT, (char *)"ECDT");
|
||||||
|
FindTable(XSDT, (char *)"EINJ");
|
||||||
|
FindTable(XSDT, (char *)"ERST");
|
||||||
|
FindTable(XSDT, (char *)"FACS");
|
||||||
|
FindTable(XSDT, (char *)"MSCT");
|
||||||
|
FindTable(XSDT, (char *)"MPST");
|
||||||
|
FindTable(XSDT, (char *)"OEMx");
|
||||||
|
FindTable(XSDT, (char *)"PMTT");
|
||||||
|
FindTable(XSDT, (char *)"PSDT");
|
||||||
|
FindTable(XSDT, (char *)"RASF");
|
||||||
|
FindTable(XSDT, (char *)"RSDT");
|
||||||
|
FindTable(XSDT, (char *)"SBST");
|
||||||
|
FindTable(XSDT, (char *)"SLIT");
|
||||||
|
FindTable(XSDT, (char *)"SSDT");
|
||||||
|
FindTable(XSDT, (char *)"XSDT");
|
||||||
|
FindTable(XSDT, (char *)"DRTM");
|
||||||
|
FindTable(XSDT, (char *)"FPDT");
|
||||||
|
FindTable(XSDT, (char *)"GTDT");
|
||||||
|
FindTable(XSDT, (char *)"PCCT");
|
||||||
|
FindTable(XSDT, (char *)"S3PT");
|
||||||
|
FindTable(XSDT, (char *)"MATR");
|
||||||
|
FindTable(XSDT, (char *)"MSDM");
|
||||||
|
FindTable(XSDT, (char *)"WPBT");
|
||||||
|
FindTable(XSDT, (char *)"OSDT");
|
||||||
|
FindTable(XSDT, (char *)"RSDP");
|
||||||
|
FindTable(XSDT, (char *)"NFIT");
|
||||||
|
FindTable(XSDT, (char *)"ASF!");
|
||||||
|
FindTable(XSDT, (char *)"BOOT");
|
||||||
|
FindTable(XSDT, (char *)"CSRT");
|
||||||
|
FindTable(XSDT, (char *)"DBG2");
|
||||||
|
FindTable(XSDT, (char *)"DBGP");
|
||||||
|
FindTable(XSDT, (char *)"DMAR");
|
||||||
|
FindTable(XSDT, (char *)"IBFT");
|
||||||
|
FindTable(XSDT, (char *)"IORT");
|
||||||
|
FindTable(XSDT, (char *)"IVRS");
|
||||||
|
FindTable(XSDT, (char *)"LPIT");
|
||||||
|
FindTable(XSDT, (char *)"MCHI");
|
||||||
|
FindTable(XSDT, (char *)"MTMR");
|
||||||
|
FindTable(XSDT, (char *)"SLIC");
|
||||||
|
FindTable(XSDT, (char *)"SPCR");
|
||||||
|
FindTable(XSDT, (char *)"SPMI");
|
||||||
|
FindTable(XSDT, (char *)"UEFI");
|
||||||
|
FindTable(XSDT, (char *)"VRTC");
|
||||||
|
FindTable(XSDT, (char *)"WDAT");
|
||||||
|
FindTable(XSDT, (char *)"WDDT");
|
||||||
|
FindTable(XSDT, (char *)"WDRT");
|
||||||
|
}
|
||||||
|
|
||||||
|
ACPI::ACPI(BootInfo *Info)
|
||||||
|
{
|
||||||
|
trace("Initializing ACPI");
|
||||||
|
if (Info->RSDP->Revision >= 2 && Info->RSDP->XSDTAddress)
|
||||||
|
{
|
||||||
|
debug("XSDT supported");
|
||||||
|
XSDTSupported = true;
|
||||||
|
XSDT = (ACPIHeader *)(Info->RSDP->XSDTAddress);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("RSDT supported");
|
||||||
|
XSDT = (ACPIHeader *)(uintptr_t)Info->RSDP->RSDTAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->SearchTables(XSDT);
|
||||||
|
|
||||||
|
if (FADT)
|
||||||
|
{
|
||||||
|
outb(FADT->SMI_CommandPort, FADT->AcpiEnable);
|
||||||
|
while (!(inw(FADT->PM1aControlBlock) & 1))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ACPI::~ACPI()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,213 @@
|
|||||||
|
#include "acpi.hpp"
|
||||||
|
|
||||||
|
#include <time.hpp>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <smp.hpp>
|
||||||
|
#include <io.h>
|
||||||
|
|
||||||
|
#include "cpu/apic.hpp"
|
||||||
|
|
||||||
|
#define ACPI_TIMER 0x0001
|
||||||
|
#define ACPI_BUSMASTER 0x0010
|
||||||
|
#define ACPI_GLOBAL 0x0020
|
||||||
|
#define ACPI_POWER_BUTTON 0x0100
|
||||||
|
#define ACPI_SLEEP_BUTTON 0x0200
|
||||||
|
#define ACPI_RTC_ALARM 0x0400
|
||||||
|
#define ACPI_PCIE_WAKE 0x4000
|
||||||
|
#define ACPI_WAKE 0x8000
|
||||||
|
|
||||||
|
namespace ACPI
|
||||||
|
{
|
||||||
|
__attribute__((always_inline)) inline bool IsCanonical(uint64_t Address)
|
||||||
|
{
|
||||||
|
return ((Address <= 0x00007FFFFFFFFFFF) || ((Address >= 0xFFFF800000000000) && (Address <= 0xFFFFFFFFFFFFFFFF)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ACPI_ENABLED 0x0001
|
||||||
|
#define ACPI_SLEEP 0x2000
|
||||||
|
|
||||||
|
#define ACPI_GAS_MMIO 0
|
||||||
|
#define ACPI_GAS_IO 1
|
||||||
|
#define ACPI_GAS_PCI 2
|
||||||
|
|
||||||
|
void DSDT::OnInterruptReceived(CPU::x64::TrapFrame *Frame)
|
||||||
|
{
|
||||||
|
debug("SCI Handle Triggered");
|
||||||
|
uint16_t Event = 0;
|
||||||
|
{
|
||||||
|
uint16_t a = 0, b = 0;
|
||||||
|
if (acpi->FADT->PM1aEventBlock)
|
||||||
|
{
|
||||||
|
a = inw(acpi->FADT->PM1aEventBlock);
|
||||||
|
outw(acpi->FADT->PM1aEventBlock, a);
|
||||||
|
}
|
||||||
|
if (acpi->FADT->PM1bEventBlock)
|
||||||
|
{
|
||||||
|
b = inw(acpi->FADT->PM1bEventBlock);
|
||||||
|
outw(acpi->FADT->PM1bEventBlock, b);
|
||||||
|
}
|
||||||
|
Event = a | b;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("SCI Event: %#lx", Event);
|
||||||
|
if (Event & ACPI_BUSMASTER)
|
||||||
|
{
|
||||||
|
fixme("ACPI Busmaster");
|
||||||
|
}
|
||||||
|
else if (Event & ACPI_GLOBAL)
|
||||||
|
{
|
||||||
|
fixme("ACPI Global");
|
||||||
|
}
|
||||||
|
else if (Event & ACPI_POWER_BUTTON)
|
||||||
|
{
|
||||||
|
this->Shutdown();
|
||||||
|
Time::Clock tm = Time::ReadClock();
|
||||||
|
while (tm.Second == Time::ReadClock().Second)
|
||||||
|
;
|
||||||
|
outw(0xB004, 0x2000);
|
||||||
|
outw(0x604, 0x2000);
|
||||||
|
outw(0x4004, 0x3400);
|
||||||
|
CPU::Stop();
|
||||||
|
}
|
||||||
|
else if (Event & ACPI_SLEEP_BUTTON)
|
||||||
|
{
|
||||||
|
fixme("ACPI Sleep Button");
|
||||||
|
}
|
||||||
|
else if (Event & ACPI_RTC_ALARM)
|
||||||
|
{
|
||||||
|
fixme("ACPI RTC Alarm");
|
||||||
|
}
|
||||||
|
else if (Event & ACPI_PCIE_WAKE)
|
||||||
|
{
|
||||||
|
fixme("ACPI PCIe Wake");
|
||||||
|
}
|
||||||
|
else if (Event & ACPI_WAKE)
|
||||||
|
{
|
||||||
|
fixme("ACPI Wake");
|
||||||
|
}
|
||||||
|
else if (Event & ACPI_TIMER)
|
||||||
|
{
|
||||||
|
fixme("ACPI Timer");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error("ACPI unknown event %#lx on CPU %d", Event, GetCurrentCPU()->ID);
|
||||||
|
CPU::Stop();
|
||||||
|
}
|
||||||
|
UNUSED(Frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DSDT::Shutdown()
|
||||||
|
{
|
||||||
|
trace("Shutting down...");
|
||||||
|
if (SCI_EN == 1)
|
||||||
|
{
|
||||||
|
outw(acpi->FADT->PM1aControlBlock, (inw(acpi->FADT->PM1aControlBlock) & 0xE3FF) | ((SLP_TYPa << 10) | ACPI_SLEEP));
|
||||||
|
if (acpi->FADT->PM1bControlBlock)
|
||||||
|
outw(acpi->FADT->PM1bControlBlock, (inw(acpi->FADT->PM1bControlBlock) & 0xE3FF) | ((SLP_TYPb << 10) | ACPI_SLEEP));
|
||||||
|
outw(PM1a_CNT, SLP_TYPa | SLP_EN);
|
||||||
|
if (PM1b_CNT)
|
||||||
|
outw(PM1b_CNT, SLP_TYPb | SLP_EN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DSDT::Reboot()
|
||||||
|
{
|
||||||
|
trace("Rebooting...");
|
||||||
|
switch (acpi->FADT->ResetReg.AddressSpace)
|
||||||
|
{
|
||||||
|
case ACPI_GAS_MMIO:
|
||||||
|
*(uint8_t *)(acpi->FADT->ResetReg.Address) = acpi->FADT->ResetValue;
|
||||||
|
break;
|
||||||
|
case ACPI_GAS_IO:
|
||||||
|
outb(acpi->FADT->ResetReg.Address, acpi->FADT->ResetValue);
|
||||||
|
break;
|
||||||
|
case ACPI_GAS_PCI:
|
||||||
|
fixme("ACPI_GAS_PCI not supported.");
|
||||||
|
/*
|
||||||
|
seg - 0
|
||||||
|
bus - 0
|
||||||
|
dev - (FADT->ResetReg.Address >> 32) & 0xFFFF
|
||||||
|
function - (FADT->ResetReg.Address >> 16) & 0xFFFF
|
||||||
|
offset - FADT->ResetReg.Address & 0xFFFF
|
||||||
|
value - FADT->ResetValue
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DSDT::DSDT(ACPI *acpi) : Interrupts::Handler(acpi->FADT->SCI_Interrupt + CPU::x64::IRQ0)
|
||||||
|
{
|
||||||
|
this->acpi = acpi;
|
||||||
|
uint64_t Address = ((IsCanonical(acpi->FADT->X_Dsdt) && acpi->XSDTSupported) ? acpi->FADT->X_Dsdt : acpi->FADT->Dsdt);
|
||||||
|
uint8_t *S5Address = (uint8_t *)(Address) + 36;
|
||||||
|
ACPI::ACPI::ACPIHeader *Header = (ACPI::ACPI::ACPIHeader *)Address;
|
||||||
|
uint64_t Length = Header->Length;
|
||||||
|
while (Length-- > 0)
|
||||||
|
{
|
||||||
|
if (!memcmp(S5Address, "_S5_", 4))
|
||||||
|
break;
|
||||||
|
S5Address++;
|
||||||
|
}
|
||||||
|
if (Length <= 0)
|
||||||
|
{
|
||||||
|
warn("_S5 not present in ACPI");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((*(S5Address - 1) == 0x08 || (*(S5Address - 2) == 0x08 && *(S5Address - 1) == '\\')) && *(S5Address + 4) == 0x12)
|
||||||
|
{
|
||||||
|
S5Address += 5;
|
||||||
|
S5Address += ((*S5Address & 0xC0) >> 6) + 2;
|
||||||
|
if (*S5Address == 0x0A)
|
||||||
|
S5Address++;
|
||||||
|
SLP_TYPa = *(S5Address) << 10;
|
||||||
|
S5Address++;
|
||||||
|
if (*S5Address == 0x0A)
|
||||||
|
S5Address++;
|
||||||
|
SLP_TYPb = *(S5Address) << 10;
|
||||||
|
SMI_CMD = acpi->FADT->SMI_CommandPort;
|
||||||
|
ACPI_ENABLE = acpi->FADT->AcpiEnable;
|
||||||
|
ACPI_DISABLE = acpi->FADT->AcpiDisable;
|
||||||
|
PM1a_CNT = acpi->FADT->PM1aControlBlock;
|
||||||
|
PM1b_CNT = acpi->FADT->PM1bControlBlock;
|
||||||
|
PM1_CNT_LEN = acpi->FADT->PM1ControlLength;
|
||||||
|
SLP_EN = 1 << 13;
|
||||||
|
SCI_EN = 1;
|
||||||
|
trace("ACPI Shutdown is supported");
|
||||||
|
ACPIShutdownSupported = true;
|
||||||
|
|
||||||
|
uint16_t value = ACPI_POWER_BUTTON | ACPI_SLEEP_BUTTON | ACPI_WAKE;
|
||||||
|
{
|
||||||
|
uint16_t a = acpi->FADT->PM1aEventBlock + (acpi->FADT->PM1EventLength / 2);
|
||||||
|
uint16_t b = acpi->FADT->PM1bEventBlock + (acpi->FADT->PM1EventLength / 2);
|
||||||
|
debug("SCI Event: %#llx [a:%#x b:%#x]", value, a, b);
|
||||||
|
if (acpi->FADT->PM1aEventBlock)
|
||||||
|
outw(a, value);
|
||||||
|
if (acpi->FADT->PM1bEventBlock)
|
||||||
|
outw(b, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
uint16_t a = 0, b = 0;
|
||||||
|
if (acpi->FADT->PM1aEventBlock)
|
||||||
|
{
|
||||||
|
a = inw(acpi->FADT->PM1aEventBlock);
|
||||||
|
outw(acpi->FADT->PM1aEventBlock, a);
|
||||||
|
}
|
||||||
|
if (acpi->FADT->PM1bEventBlock)
|
||||||
|
{
|
||||||
|
b = inw(acpi->FADT->PM1bEventBlock);
|
||||||
|
outw(acpi->FADT->PM1bEventBlock, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
((APIC::APIC *)Interrupts::apic[0])->RedirectIRQ(0, acpi->FADT->SCI_Interrupt, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
warn("Failed to parse _S5 in ACPI");
|
||||||
|
SCI_EN = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DSDT::~DSDT()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
257
Kernel/Architecture/amd64/Limine.c
Normal file
257
Kernel/Architecture/amd64/Limine.c
Normal file
@ -0,0 +1,257 @@
|
|||||||
|
#include <boot/binfo.h>
|
||||||
|
#include <types.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <convert.h>
|
||||||
|
|
||||||
|
#include "../../../tools/limine/limine.h"
|
||||||
|
#include "../../kernel.h"
|
||||||
|
|
||||||
|
void init_limine();
|
||||||
|
|
||||||
|
static volatile struct limine_entry_point_request EntryPointRequest = {
|
||||||
|
.id = LIMINE_ENTRY_POINT_REQUEST,
|
||||||
|
.revision = 0,
|
||||||
|
.response = NULL,
|
||||||
|
.entry = init_limine};
|
||||||
|
static volatile struct limine_bootloader_info_request BootloaderInfoRequest = {
|
||||||
|
.id = LIMINE_BOOTLOADER_INFO_REQUEST,
|
||||||
|
.revision = 0};
|
||||||
|
static volatile struct limine_terminal_request TerminalRequest = {
|
||||||
|
.id = LIMINE_TERMINAL_REQUEST,
|
||||||
|
.revision = 0};
|
||||||
|
static volatile struct limine_framebuffer_request FramebufferRequest = {
|
||||||
|
.id = LIMINE_FRAMEBUFFER_REQUEST,
|
||||||
|
.revision = 0};
|
||||||
|
static volatile struct limine_memmap_request MemmapRequest = {
|
||||||
|
.id = LIMINE_MEMMAP_REQUEST,
|
||||||
|
.revision = 0};
|
||||||
|
static volatile struct limine_kernel_address_request KernelAddressRequest = {
|
||||||
|
.id = LIMINE_KERNEL_ADDRESS_REQUEST,
|
||||||
|
.revision = 0};
|
||||||
|
static volatile struct limine_rsdp_request RsdpRequest = {
|
||||||
|
.id = LIMINE_RSDP_REQUEST,
|
||||||
|
.revision = 0};
|
||||||
|
static volatile struct limine_kernel_file_request KernelFileRequest = {
|
||||||
|
.id = LIMINE_KERNEL_FILE_REQUEST,
|
||||||
|
.revision = 0};
|
||||||
|
static volatile struct limine_module_request ModuleRequest = {
|
||||||
|
.id = LIMINE_MODULE_REQUEST,
|
||||||
|
.revision = 0};
|
||||||
|
|
||||||
|
static volatile struct limine_smbios_request SmbiosRequest = {
|
||||||
|
.id = LIMINE_SMBIOS_REQUEST,
|
||||||
|
.revision = 0};
|
||||||
|
|
||||||
|
SafeFunction __no_instrument_function void init_limine()
|
||||||
|
{
|
||||||
|
struct BootInfo binfo;
|
||||||
|
struct limine_bootloader_info_response *BootloaderInfoResponse = BootloaderInfoRequest.response;
|
||||||
|
info("Bootloader: %s %s", BootloaderInfoResponse->name, BootloaderInfoResponse->version);
|
||||||
|
|
||||||
|
struct limine_terminal_response *TerminalResponse = TerminalRequest.response;
|
||||||
|
|
||||||
|
if (TerminalResponse == NULL || TerminalResponse->terminal_count < 1)
|
||||||
|
{
|
||||||
|
warn("No terminal available.");
|
||||||
|
while (1)
|
||||||
|
asmv("hlt");
|
||||||
|
}
|
||||||
|
TerminalResponse->write(TerminalResponse->terminals[0], "\033[37mPlease wait... ", 20);
|
||||||
|
|
||||||
|
struct limine_framebuffer_response *FrameBufferResponse = FramebufferRequest.response;
|
||||||
|
struct limine_memmap_response *MemmapResponse = MemmapRequest.response;
|
||||||
|
struct limine_kernel_address_response *KernelAddressResponse = KernelAddressRequest.response;
|
||||||
|
struct limine_rsdp_response *RsdpResponse = RsdpRequest.response;
|
||||||
|
struct limine_kernel_file_response *KernelFileResponse = KernelFileRequest.response;
|
||||||
|
struct limine_module_response *ModuleResponse = ModuleRequest.response;
|
||||||
|
struct limine_smbios_response *SmbiosResponse = SmbiosRequest.response;
|
||||||
|
|
||||||
|
if (FrameBufferResponse == NULL || FrameBufferResponse->framebuffer_count < 1)
|
||||||
|
{
|
||||||
|
error("No framebuffer available [%p;%ld]", FrameBufferResponse,
|
||||||
|
(FrameBufferResponse == NULL) ? 0 : FrameBufferResponse->framebuffer_count);
|
||||||
|
TerminalResponse->write(TerminalResponse->terminals[0], "No framebuffer available", 24);
|
||||||
|
while (1)
|
||||||
|
asmv("hlt");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MemmapResponse == NULL || MemmapResponse->entry_count < 1)
|
||||||
|
{
|
||||||
|
error("No memory map available [%p;%ld]", MemmapResponse,
|
||||||
|
(MemmapResponse == NULL) ? 0 : MemmapResponse->entry_count);
|
||||||
|
TerminalResponse->write(TerminalResponse->terminals[0], "No memory map available", 23);
|
||||||
|
while (1)
|
||||||
|
asmv("hlt");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (KernelAddressResponse == NULL)
|
||||||
|
{
|
||||||
|
error("No kernel address available [%p]", KernelAddressResponse);
|
||||||
|
TerminalResponse->write(TerminalResponse->terminals[0], "No kernel address available", 27);
|
||||||
|
while (1)
|
||||||
|
asmv("hlt");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RsdpResponse == NULL || RsdpResponse->address == 0)
|
||||||
|
{
|
||||||
|
error("No RSDP address available [%p;%p]", RsdpResponse,
|
||||||
|
(RsdpResponse == NULL) ? 0 : RsdpResponse->address);
|
||||||
|
TerminalResponse->write(TerminalResponse->terminals[0], "No RSDP address available", 25);
|
||||||
|
while (1)
|
||||||
|
asmv("hlt");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (KernelFileResponse == NULL || KernelFileResponse->kernel_file == NULL)
|
||||||
|
{
|
||||||
|
error("No kernel file available [%p;%p]", KernelFileResponse,
|
||||||
|
(KernelFileResponse == NULL) ? 0 : KernelFileResponse->kernel_file);
|
||||||
|
TerminalResponse->write(TerminalResponse->terminals[0], "No kernel file available", 24);
|
||||||
|
while (1)
|
||||||
|
asmv("hlt");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ModuleResponse == NULL || ModuleResponse->module_count < 1)
|
||||||
|
{
|
||||||
|
error("No module information available [%p;%ld]", ModuleResponse,
|
||||||
|
(ModuleResponse == NULL) ? 0 : ModuleResponse->module_count);
|
||||||
|
TerminalResponse->write(TerminalResponse->terminals[0], "No module information available", 31);
|
||||||
|
while (1)
|
||||||
|
asmv("hlt");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint64_t i = 0; i < FrameBufferResponse->framebuffer_count; i++)
|
||||||
|
{
|
||||||
|
struct limine_framebuffer *framebuffer = FrameBufferResponse->framebuffers[i];
|
||||||
|
binfo.Framebuffer[i].BaseAddress = (void *)((uint64_t)framebuffer->address - 0xffff800000000000);
|
||||||
|
binfo.Framebuffer[i].Width = framebuffer->width;
|
||||||
|
binfo.Framebuffer[i].Height = framebuffer->height;
|
||||||
|
binfo.Framebuffer[i].Pitch = framebuffer->pitch;
|
||||||
|
binfo.Framebuffer[i].BitsPerPixel = framebuffer->bpp;
|
||||||
|
binfo.Framebuffer[i].MemoryModel = framebuffer->memory_model;
|
||||||
|
binfo.Framebuffer[i].RedMaskSize = framebuffer->red_mask_size;
|
||||||
|
binfo.Framebuffer[i].RedMaskShift = framebuffer->red_mask_shift;
|
||||||
|
binfo.Framebuffer[i].GreenMaskSize = framebuffer->green_mask_size;
|
||||||
|
binfo.Framebuffer[i].GreenMaskShift = framebuffer->green_mask_shift;
|
||||||
|
binfo.Framebuffer[i].BlueMaskSize = framebuffer->blue_mask_size;
|
||||||
|
binfo.Framebuffer[i].BlueMaskShift = framebuffer->blue_mask_shift;
|
||||||
|
binfo.Framebuffer[i].ExtendedDisplayIdentificationData = framebuffer->edid;
|
||||||
|
binfo.Framebuffer[i].EDIDSize = framebuffer->edid_size;
|
||||||
|
debug("Framebuffer %d: %dx%d %d bpp", i, framebuffer->width, framebuffer->height, framebuffer->bpp);
|
||||||
|
debug("More info:\nAddress: %p\nPitch: %ld\nMemoryModel: %d\nRedMaskSize: %d\nRedMaskShift: %d\nGreenMaskSize: %d\nGreenMaskShift: %d\nBlueMaskSize: %d\nBlueMaskShift: %d\nEDID: %p\nEDIDSize: %d",
|
||||||
|
(uint64_t)framebuffer->address - 0xffff800000000000, framebuffer->pitch, framebuffer->memory_model, framebuffer->red_mask_size, framebuffer->red_mask_shift, framebuffer->green_mask_size, framebuffer->green_mask_shift, framebuffer->blue_mask_size, framebuffer->blue_mask_shift, framebuffer->edid, framebuffer->edid_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
binfo.Memory.Entries = MemmapResponse->entry_count;
|
||||||
|
for (uint64_t i = 0; i < MemmapResponse->entry_count; i++)
|
||||||
|
{
|
||||||
|
if (MemmapResponse->entry_count > MAX_MEMORY_ENTRIES)
|
||||||
|
{
|
||||||
|
warn("Too many memory entries, skipping the rest...");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct limine_memmap_entry *entry = MemmapResponse->entries[i];
|
||||||
|
binfo.Memory.Size += entry->length;
|
||||||
|
switch (entry->type)
|
||||||
|
{
|
||||||
|
case LIMINE_MEMMAP_USABLE:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry->base;
|
||||||
|
binfo.Memory.Entry[i].Length = entry->length;
|
||||||
|
binfo.Memory.Entry[i].Type = Usable;
|
||||||
|
break;
|
||||||
|
case LIMINE_MEMMAP_RESERVED:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry->base;
|
||||||
|
binfo.Memory.Entry[i].Length = entry->length;
|
||||||
|
binfo.Memory.Entry[i].Type = Reserved;
|
||||||
|
break;
|
||||||
|
case LIMINE_MEMMAP_ACPI_RECLAIMABLE:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry->base;
|
||||||
|
binfo.Memory.Entry[i].Length = entry->length;
|
||||||
|
binfo.Memory.Entry[i].Type = ACPIReclaimable;
|
||||||
|
break;
|
||||||
|
case LIMINE_MEMMAP_ACPI_NVS:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry->base;
|
||||||
|
binfo.Memory.Entry[i].Length = entry->length;
|
||||||
|
binfo.Memory.Entry[i].Type = ACPINVS;
|
||||||
|
break;
|
||||||
|
case LIMINE_MEMMAP_BAD_MEMORY:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry->base;
|
||||||
|
binfo.Memory.Entry[i].Length = entry->length;
|
||||||
|
binfo.Memory.Entry[i].Type = BadMemory;
|
||||||
|
break;
|
||||||
|
case LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry->base;
|
||||||
|
binfo.Memory.Entry[i].Length = entry->length;
|
||||||
|
binfo.Memory.Entry[i].Type = BootloaderReclaimable;
|
||||||
|
break;
|
||||||
|
case LIMINE_MEMMAP_KERNEL_AND_MODULES:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry->base;
|
||||||
|
binfo.Memory.Entry[i].Length = entry->length;
|
||||||
|
binfo.Memory.Entry[i].Type = KernelAndModules;
|
||||||
|
break;
|
||||||
|
case LIMINE_MEMMAP_FRAMEBUFFER:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry->base;
|
||||||
|
binfo.Memory.Entry[i].Length = entry->length;
|
||||||
|
binfo.Memory.Entry[i].Type = Framebuffer;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry->base;
|
||||||
|
binfo.Memory.Entry[i].Length = entry->length;
|
||||||
|
binfo.Memory.Entry[i].Type = Unknown;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint64_t i = 0; i < ModuleResponse->module_count; i++)
|
||||||
|
{
|
||||||
|
if (i > MAX_MODULES)
|
||||||
|
{
|
||||||
|
warn("Too many modules, skipping the rest...");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
binfo.Modules[i].Address = (void *)((uint64_t)ModuleResponse->modules[i]->address - 0xffff800000000000);
|
||||||
|
strncpy(binfo.Modules[i].Path,
|
||||||
|
ModuleResponse->modules[i]->path,
|
||||||
|
strlen(ModuleResponse->modules[i]->path) + 1);
|
||||||
|
strncpy(binfo.Modules[i].CommandLine,
|
||||||
|
ModuleResponse->modules[i]->cmdline,
|
||||||
|
strlen(ModuleResponse->modules[i]->cmdline) + 1);
|
||||||
|
binfo.Modules[i].Size = ModuleResponse->modules[i]->size;
|
||||||
|
debug("Module %d:\nAddress: %p\nPath: %s\nCommand Line: %s\nSize: %ld", i,
|
||||||
|
(uint64_t)ModuleResponse->modules[i]->address - 0xffff800000000000, ModuleResponse->modules[i]->path,
|
||||||
|
ModuleResponse->modules[i]->cmdline, ModuleResponse->modules[i]->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
binfo.RSDP = (struct RSDPInfo *)((uint64_t)RsdpResponse->address - 0xffff800000000000);
|
||||||
|
trace("RSDP: %p(%p) [Signature: %.8s] [OEM: %.6s]",
|
||||||
|
RsdpResponse->address, binfo.RSDP, binfo.RSDP->Signature, binfo.RSDP->OEMID);
|
||||||
|
|
||||||
|
debug("SMBIOS: %p %p", SmbiosResponse->entry_32, SmbiosResponse->entry_64);
|
||||||
|
if (SmbiosResponse->entry_32 != NULL)
|
||||||
|
binfo.SMBIOSPtr = (void *)((uint64_t)SmbiosResponse->entry_32 - 0xffff800000000000);
|
||||||
|
else if (SmbiosResponse->entry_64 != NULL)
|
||||||
|
binfo.SMBIOSPtr = (void *)((uint64_t)SmbiosResponse->entry_64 - 0xffff800000000000);
|
||||||
|
else
|
||||||
|
binfo.SMBIOSPtr = NULL;
|
||||||
|
|
||||||
|
binfo.Kernel.PhysicalBase = (void *)KernelAddressResponse->physical_base;
|
||||||
|
binfo.Kernel.VirtualBase = (void *)KernelAddressResponse->virtual_base;
|
||||||
|
binfo.Kernel.FileBase = KernelFileResponse->kernel_file->address;
|
||||||
|
strncpy(binfo.Kernel.CommandLine,
|
||||||
|
KernelFileResponse->kernel_file->cmdline,
|
||||||
|
strlen(KernelFileResponse->kernel_file->cmdline) + 1);
|
||||||
|
binfo.Kernel.Size = KernelFileResponse->kernel_file->size;
|
||||||
|
trace("Kernel physical address: %p", KernelAddressResponse->physical_base);
|
||||||
|
trace("Kernel virtual address: %p", KernelAddressResponse->virtual_base);
|
||||||
|
|
||||||
|
strncpy(binfo.Bootloader.Name,
|
||||||
|
BootloaderInfoResponse->name,
|
||||||
|
strlen(BootloaderInfoResponse->name) + 1);
|
||||||
|
strncpy(binfo.Bootloader.Version,
|
||||||
|
BootloaderInfoResponse->version,
|
||||||
|
strlen(BootloaderInfoResponse->version) + 1);
|
||||||
|
|
||||||
|
// Call kernel entry point
|
||||||
|
Entry(&binfo);
|
||||||
|
}
|
69
Kernel/Architecture/amd64/MultipleAPICDescriptionTable.cpp
Normal file
69
Kernel/Architecture/amd64/MultipleAPICDescriptionTable.cpp
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#include "acpi.hpp"
|
||||||
|
|
||||||
|
#include <memory.hpp>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include "../../kernel.h"
|
||||||
|
|
||||||
|
namespace ACPI
|
||||||
|
{
|
||||||
|
MADT::MADT(ACPI::MADTHeader *madt)
|
||||||
|
{
|
||||||
|
trace("Initializing MADT");
|
||||||
|
CPUCores = 0;
|
||||||
|
LAPICAddress = (LAPIC *)(uintptr_t)madt->LocalControllerAddress;
|
||||||
|
for (uint8_t *ptr = (uint8_t *)(madt->Entries);
|
||||||
|
(uintptr_t)(ptr) < (uintptr_t)(madt) + madt->Header.Length;
|
||||||
|
ptr += *(ptr + 1))
|
||||||
|
{
|
||||||
|
switch (*(ptr))
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
if (ptr[4] & 1)
|
||||||
|
{
|
||||||
|
lapic.push_back((LocalAPIC *)ptr);
|
||||||
|
KPrint("Local APIC \e8888FF%d\eCCCCCC (APIC \e8888FF%d\eCCCCCC) found.", lapic.back()->ACPIProcessorId, lapic.back()->APICId);
|
||||||
|
CPUCores++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
ioapic.push_back((MADTIOApic *)ptr);
|
||||||
|
KPrint("I/O APIC \e8888FF%d\eCCCCCC (Address \e8888FF%#lx\eCCCCCC) found.", ioapic.back()->APICID, ioapic.back()->Address);
|
||||||
|
Memory::Virtual().Map((void *)(uintptr_t)ioapic.back()->Address, (void *)(uintptr_t)ioapic.back()->Address, Memory::PTFlag::RW | Memory::PTFlag::PCD); // Make sure that the address is mapped.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
iso.push_back((MADTIso *)ptr);
|
||||||
|
KPrint("ISO (IRQ:\e8888FF%#lx\eCCCCCC, BUS:\e8888FF%#lx\eCCCCCC, GSI:\e8888FF%#lx\eCCCCCC, %s\eCCCCCC/%s\eCCCCCC) found.",
|
||||||
|
iso.back()->IRQSource, iso.back()->BuSSource, iso.back()->GSI,
|
||||||
|
iso.back()->Flags & 0x00000004 ? "\e1770FFActive High" : "\e475EFFActive Low",
|
||||||
|
iso.back()->Flags & 0x00000100 ? "\e00962DEdge Triggered" : "\e008F58Level Triggered");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
nmi.push_back((MADTNmi *)ptr);
|
||||||
|
KPrint("NMI \e8888FF%#lx\eCCCCCC (lint:\e8888FF%#lx\eCCCCCC) found.", nmi.back()->processor, nmi.back()->lint);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
LAPICAddress = (LAPIC *)ptr;
|
||||||
|
KPrint("APIC found at \e8888FF%#lx\eCCCCCC", LAPICAddress);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Memory::Virtual().Map((void *)LAPICAddress, (void *)LAPICAddress, Memory::PTFlag::RW | Memory::PTFlag::PCD); // I should map more than one page?
|
||||||
|
}
|
||||||
|
CPUCores--; // We start at 0 (BSP) and end at 11 (APs), so we have 12 cores.
|
||||||
|
KPrint("Total CPU cores: %d", CPUCores + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
MADT::~MADT()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
85
Kernel/Architecture/amd64/SystemCalls.cpp
Normal file
85
Kernel/Architecture/amd64/SystemCalls.cpp
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#include <syscalls.hpp>
|
||||||
|
|
||||||
|
#include <cpu.hpp>
|
||||||
|
|
||||||
|
#include "cpu/gdt.hpp"
|
||||||
|
|
||||||
|
// https://supercip971.github.io/02-wingos-syscalls.html
|
||||||
|
using namespace CPU::x64;
|
||||||
|
|
||||||
|
// "Core/SystemCalls.cpp"
|
||||||
|
extern "C" uint64_t SystemCallsHandler(SyscallsFrame *regs);
|
||||||
|
|
||||||
|
extern "C" void SystemCallHandlerStub();
|
||||||
|
|
||||||
|
extern "C" __attribute__((naked, used, no_stack_protector)) void SystemCallHandlerStub_broken()
|
||||||
|
{
|
||||||
|
// asmv(
|
||||||
|
// // "cmp $0x08, 0x8(%rsp)\n"
|
||||||
|
// // "je 1f\n"
|
||||||
|
// "swapgs\n"
|
||||||
|
// // "1:\n"
|
||||||
|
|
||||||
|
// "mov %rsp, 0x8(%gs)\n" // CPUData->TempStack
|
||||||
|
// "mov 0x0(%gs), %rsp\n" // CPUData->SystemCallStack
|
||||||
|
// "push $0x1b\n" // user data segment
|
||||||
|
// "push 0x8(%gs)\n" // saved stack
|
||||||
|
// "push %r11\n" // saved rflags
|
||||||
|
// "push $0x23\n" // user code segment
|
||||||
|
// "push %rcx\n" // Current RIP
|
||||||
|
|
||||||
|
// "push %rax\n"
|
||||||
|
// "push %rbx\n"
|
||||||
|
// "push %rcx\n"
|
||||||
|
// "push %rdx\n"
|
||||||
|
// "push %rsi\n"
|
||||||
|
// "push %rdi\n"
|
||||||
|
// "push %rbp\n"
|
||||||
|
// "push %r8\n"
|
||||||
|
// "push %r9\n"
|
||||||
|
// "push %r10\n"
|
||||||
|
// "push %r11\n"
|
||||||
|
// "push %r12\n"
|
||||||
|
// "push %r13\n"
|
||||||
|
// "push %r14\n"
|
||||||
|
// "push %r15\n"
|
||||||
|
|
||||||
|
// "mov %rsp, %rdi\n"
|
||||||
|
// "mov $0, %rbp\n"
|
||||||
|
// "call SystemCallsHandler\n"
|
||||||
|
|
||||||
|
// "pop %r15\n"
|
||||||
|
// "pop %r14\n"
|
||||||
|
// "pop %r13\n"
|
||||||
|
// "pop %r12\n"
|
||||||
|
// "pop %r11\n"
|
||||||
|
// "pop %r10\n"
|
||||||
|
// "pop %r9\n"
|
||||||
|
// "pop %r8\n"
|
||||||
|
// "pop %rbp\n"
|
||||||
|
// "pop %rdi\n"
|
||||||
|
// "pop %rsi\n"
|
||||||
|
// "pop %rdx\n"
|
||||||
|
// "pop %rcx\n"
|
||||||
|
// "pop %rbx\n"
|
||||||
|
// /* "pop %rax\n" */
|
||||||
|
|
||||||
|
// "mov 0x8(%gs), %rsp\n" // CPUData->TempStack
|
||||||
|
|
||||||
|
// // "cmp $0x08, 0x8(%rsp)\n"
|
||||||
|
// // "je 1f\n"
|
||||||
|
// "swapgs\n"
|
||||||
|
// // "1:\n"
|
||||||
|
|
||||||
|
// "sti\n"
|
||||||
|
|
||||||
|
// "sysretq\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitializeSystemCalls()
|
||||||
|
{
|
||||||
|
wrmsr(MSR_EFER, rdmsr(MSR_EFER) | 1);
|
||||||
|
wrmsr(MSR_STAR, ((uint64_t)(GDT_KERNEL_CODE) << 32) | ((uint64_t)(GDT_KERNEL_DATA | 3) << 48));
|
||||||
|
wrmsr(MSR_LSTAR, (uint64_t)SystemCallHandlerStub);
|
||||||
|
wrmsr(MSR_SYSCALL_MASK, (uint64_t)(1 << 9));
|
||||||
|
}
|
59
Kernel/Architecture/amd64/SystemCallsAssemblyStub.asm
Normal file
59
Kernel/Architecture/amd64/SystemCallsAssemblyStub.asm
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
[BITS 64]
|
||||||
|
|
||||||
|
%macro PushAllSC 0
|
||||||
|
push rax
|
||||||
|
push rbx
|
||||||
|
push rcx
|
||||||
|
push rdx
|
||||||
|
push rsi
|
||||||
|
push rdi
|
||||||
|
push rbp
|
||||||
|
push r8
|
||||||
|
push r9
|
||||||
|
push r10
|
||||||
|
push r11
|
||||||
|
push r12
|
||||||
|
push r13
|
||||||
|
push r14
|
||||||
|
push r15
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
%macro PopAllSC 0
|
||||||
|
pop r15
|
||||||
|
pop r14
|
||||||
|
pop r13
|
||||||
|
pop r12
|
||||||
|
pop r11
|
||||||
|
pop r10
|
||||||
|
pop r9
|
||||||
|
pop r8
|
||||||
|
pop rbp
|
||||||
|
pop rdi
|
||||||
|
pop rsi
|
||||||
|
pop rdx
|
||||||
|
pop rcx
|
||||||
|
pop rbx
|
||||||
|
%endmacro
|
||||||
|
|
||||||
|
ALIGN 4096
|
||||||
|
extern SystemCallsHandler
|
||||||
|
global SystemCallHandlerStub
|
||||||
|
SystemCallHandlerStub:
|
||||||
|
swapgs ; Swap gs and kernelgs
|
||||||
|
mov [gs:0x8], rsp ; CPUData->TempStack
|
||||||
|
mov rsp, [gs:0x0] ; CPUData->SystemCallStack
|
||||||
|
push qword 0x1b ; User data segment
|
||||||
|
push qword [gs:0x8] ; Saved stack
|
||||||
|
push r11 ; Saved rflags
|
||||||
|
push qword 0x23 ; User code segment
|
||||||
|
push rcx ; Current instruction pointer
|
||||||
|
cld ; Clear direction flag
|
||||||
|
PushAllSC ; Push all registers
|
||||||
|
mov rdi, rsp ; Pass pointer to registers
|
||||||
|
mov rbp, 0 ; Pass 0 as return address
|
||||||
|
call SystemCallsHandler ; Call system call handler
|
||||||
|
PopAllSC ; Pop all registers except rax
|
||||||
|
mov rsp, [gs:0x8] ; Restore stack
|
||||||
|
swapgs ; Swap back gs and kernelgs
|
||||||
|
sti ; Enable interrupts
|
||||||
|
o64 sysret ; Return to user mode
|
277
Kernel/Architecture/amd64/acpi.hpp
Normal file
277
Kernel/Architecture/amd64/acpi.hpp
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
#ifndef __FENNIX_KERNEL_ACPI_H__
|
||||||
|
#define __FENNIX_KERNEL_ACPI_H__
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
#include <boot/binfo.h>
|
||||||
|
#include <interrupts.hpp>
|
||||||
|
#include <vector.hpp>
|
||||||
|
#include <cpu.hpp>
|
||||||
|
|
||||||
|
namespace ACPI
|
||||||
|
{
|
||||||
|
class ACPI
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct ACPIHeader
|
||||||
|
{
|
||||||
|
unsigned char Signature[4];
|
||||||
|
uint32_t Length;
|
||||||
|
uint8_t Revision;
|
||||||
|
uint8_t Checksum;
|
||||||
|
uint8_t OEMID[6];
|
||||||
|
uint8_t OEMTableID[8];
|
||||||
|
uint32_t OEMRevision;
|
||||||
|
uint32_t CreatorID;
|
||||||
|
uint32_t CreatorRevision;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct GenericAddressStructure
|
||||||
|
{
|
||||||
|
uint8_t AddressSpace;
|
||||||
|
uint8_t BitWidth;
|
||||||
|
uint8_t BitOffset;
|
||||||
|
uint8_t AccessSize;
|
||||||
|
uint64_t Address;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct MCFGHeader
|
||||||
|
{
|
||||||
|
struct ACPIHeader Header;
|
||||||
|
uint64_t Reserved;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct HPETHeader
|
||||||
|
{
|
||||||
|
ACPIHeader Header;
|
||||||
|
uint8_t HardwareRevID;
|
||||||
|
uint8_t ComparatorCount : 5;
|
||||||
|
uint8_t CounterSize : 1;
|
||||||
|
uint8_t Reserved : 1;
|
||||||
|
uint8_t LegacyReplacement : 1;
|
||||||
|
uint16_t PCIVendorID;
|
||||||
|
struct GenericAddressStructure Address;
|
||||||
|
uint8_t HPETNumber;
|
||||||
|
uint16_t MinimumTick;
|
||||||
|
uint8_t PageProtection;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct FADTHeader
|
||||||
|
{
|
||||||
|
ACPIHeader Header;
|
||||||
|
uint32_t FirmwareCtrl;
|
||||||
|
uint32_t Dsdt;
|
||||||
|
uint8_t Reserved;
|
||||||
|
uint8_t PreferredPowerManagementProfile;
|
||||||
|
uint16_t SCI_Interrupt;
|
||||||
|
uint32_t SMI_CommandPort;
|
||||||
|
uint8_t AcpiEnable;
|
||||||
|
uint8_t AcpiDisable;
|
||||||
|
uint8_t S4BIOS_REQ;
|
||||||
|
uint8_t PSTATE_Control;
|
||||||
|
uint32_t PM1aEventBlock;
|
||||||
|
uint32_t PM1bEventBlock;
|
||||||
|
uint32_t PM1aControlBlock;
|
||||||
|
uint32_t PM1bControlBlock;
|
||||||
|
uint32_t PM2ControlBlock;
|
||||||
|
uint32_t PMTimerBlock;
|
||||||
|
uint32_t GPE0Block;
|
||||||
|
uint32_t GPE1Block;
|
||||||
|
uint8_t PM1EventLength;
|
||||||
|
uint8_t PM1ControlLength;
|
||||||
|
uint8_t PM2ControlLength;
|
||||||
|
uint8_t PMTimerLength;
|
||||||
|
uint8_t GPE0Length;
|
||||||
|
uint8_t GPE1Length;
|
||||||
|
uint8_t GPE1Base;
|
||||||
|
uint8_t CStateControl;
|
||||||
|
uint16_t WorstC2Latency;
|
||||||
|
uint16_t WorstC3Latency;
|
||||||
|
uint16_t FlushSize;
|
||||||
|
uint16_t FlushStride;
|
||||||
|
uint8_t DutyOffset;
|
||||||
|
uint8_t DutyWidth;
|
||||||
|
uint8_t DayAlarm;
|
||||||
|
uint8_t MonthAlarm;
|
||||||
|
uint8_t Century;
|
||||||
|
uint16_t BootArchitectureFlags;
|
||||||
|
uint8_t Reserved2;
|
||||||
|
uint32_t Flags;
|
||||||
|
struct GenericAddressStructure ResetReg;
|
||||||
|
uint8_t ResetValue;
|
||||||
|
uint8_t Reserved3[3];
|
||||||
|
uint64_t X_FirmwareControl;
|
||||||
|
uint64_t X_Dsdt;
|
||||||
|
struct GenericAddressStructure X_PM1aEventBlock;
|
||||||
|
struct GenericAddressStructure X_PM1bEventBlock;
|
||||||
|
struct GenericAddressStructure X_PM1aControlBlock;
|
||||||
|
struct GenericAddressStructure X_PM1bControlBlock;
|
||||||
|
struct GenericAddressStructure X_PM2ControlBlock;
|
||||||
|
struct GenericAddressStructure X_PMTimerBlock;
|
||||||
|
struct GenericAddressStructure X_GPE0Block;
|
||||||
|
struct GenericAddressStructure X_GPE1Block;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct BGRTHeader
|
||||||
|
{
|
||||||
|
ACPIHeader Header;
|
||||||
|
uint16_t Version;
|
||||||
|
uint8_t Status;
|
||||||
|
uint8_t ImageType;
|
||||||
|
uint64_t ImageAddress;
|
||||||
|
uint32_t ImageOffsetX;
|
||||||
|
uint32_t ImageOffsetY;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SRATHeader
|
||||||
|
{
|
||||||
|
ACPIHeader Header;
|
||||||
|
uint32_t TableRevision; // Must be value 1
|
||||||
|
uint64_t Reserved; // Reserved, must be zero
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TPM2Header
|
||||||
|
{
|
||||||
|
ACPIHeader Header;
|
||||||
|
uint32_t Flags;
|
||||||
|
uint64_t ControlAddress;
|
||||||
|
uint32_t StartMethod;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TCPAHeader
|
||||||
|
{
|
||||||
|
ACPIHeader Header;
|
||||||
|
uint16_t Reserved;
|
||||||
|
uint32_t MaxLogLength;
|
||||||
|
uint64_t LogAddress;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WAETHeader
|
||||||
|
{
|
||||||
|
ACPIHeader Header;
|
||||||
|
uint32_t Flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct HESTHeader
|
||||||
|
{
|
||||||
|
ACPIHeader Header;
|
||||||
|
uint32_t ErrorSourceCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MADTHeader
|
||||||
|
{
|
||||||
|
ACPIHeader Header;
|
||||||
|
uint32_t LocalControllerAddress;
|
||||||
|
uint32_t Flags;
|
||||||
|
char Entries[];
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
ACPIHeader *XSDT = nullptr;
|
||||||
|
MCFGHeader *MCFG = nullptr;
|
||||||
|
HPETHeader *HPET = nullptr;
|
||||||
|
FADTHeader *FADT = nullptr;
|
||||||
|
BGRTHeader *BGRT = nullptr;
|
||||||
|
SRATHeader *SRAT = nullptr;
|
||||||
|
TPM2Header *TPM2 = nullptr;
|
||||||
|
TCPAHeader *TCPA = nullptr;
|
||||||
|
WAETHeader *WAET = nullptr;
|
||||||
|
MADTHeader *MADT = nullptr;
|
||||||
|
HESTHeader *HEST = nullptr;
|
||||||
|
bool XSDTSupported = false;
|
||||||
|
|
||||||
|
void *FindTable(ACPIHeader *ACPIHeader, char *Signature);
|
||||||
|
void SearchTables(ACPIHeader *Header);
|
||||||
|
ACPI(BootInfo *Info);
|
||||||
|
~ACPI();
|
||||||
|
};
|
||||||
|
|
||||||
|
class MADT
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct APICHeader
|
||||||
|
{
|
||||||
|
uint8_t Type;
|
||||||
|
uint8_t Length;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct MADTIOApic
|
||||||
|
{
|
||||||
|
struct APICHeader Header;
|
||||||
|
uint8_t APICID;
|
||||||
|
uint8_t reserved;
|
||||||
|
uint32_t Address;
|
||||||
|
uint32_t GSIBase;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct MADTIso
|
||||||
|
{
|
||||||
|
struct APICHeader Header;
|
||||||
|
uint8_t BuSSource;
|
||||||
|
uint8_t IRQSource;
|
||||||
|
uint32_t GSI;
|
||||||
|
uint16_t Flags;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct MADTNmi
|
||||||
|
{
|
||||||
|
struct APICHeader Header;
|
||||||
|
uint8_t processor;
|
||||||
|
uint16_t flags;
|
||||||
|
uint8_t lint;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct LocalAPIC
|
||||||
|
{
|
||||||
|
struct APICHeader Header;
|
||||||
|
uint8_t ACPIProcessorId;
|
||||||
|
uint8_t APICId;
|
||||||
|
uint32_t Flags;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct LAPIC
|
||||||
|
{
|
||||||
|
uint8_t id;
|
||||||
|
uintptr_t PhysicalAddress;
|
||||||
|
void *VirtualAddress;
|
||||||
|
};
|
||||||
|
|
||||||
|
Vector<MADTIOApic *> ioapic;
|
||||||
|
Vector<MADTIso *> iso;
|
||||||
|
Vector<MADTNmi *> nmi;
|
||||||
|
Vector<LocalAPIC *> lapic;
|
||||||
|
struct LAPIC *LAPICAddress;
|
||||||
|
uint16_t CPUCores;
|
||||||
|
|
||||||
|
MADT(ACPI::MADTHeader *madt);
|
||||||
|
~MADT();
|
||||||
|
};
|
||||||
|
|
||||||
|
class DSDT : public Interrupts::Handler
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint32_t SMI_CMD = 0;
|
||||||
|
uint8_t ACPI_ENABLE = 0;
|
||||||
|
uint8_t ACPI_DISABLE = 0;
|
||||||
|
uint32_t PM1a_CNT = 0;
|
||||||
|
uint32_t PM1b_CNT = 0;
|
||||||
|
uint16_t SLP_TYPa = 0;
|
||||||
|
uint16_t SLP_TYPb = 0;
|
||||||
|
uint16_t SLP_EN = 0;
|
||||||
|
uint16_t SCI_EN = 0;
|
||||||
|
uint8_t PM1_CNT_LEN = 0;
|
||||||
|
|
||||||
|
ACPI *acpi;
|
||||||
|
void OnInterruptReceived(CPU::x64::TrapFrame *Frame);
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool ACPIShutdownSupported = false;
|
||||||
|
|
||||||
|
void Reboot();
|
||||||
|
void Shutdown();
|
||||||
|
|
||||||
|
DSDT(ACPI *acpi);
|
||||||
|
~DSDT();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !__FENNIX_KERNEL_ACPI_H__
|
@ -0,0 +1,354 @@
|
|||||||
|
#include "apic.hpp"
|
||||||
|
|
||||||
|
#include <memory.hpp>
|
||||||
|
#include <uart.hpp>
|
||||||
|
#include <lock.hpp>
|
||||||
|
#include <cpu.hpp>
|
||||||
|
#include <smp.hpp>
|
||||||
|
#include <io.h>
|
||||||
|
|
||||||
|
#include "../../../kernel.h"
|
||||||
|
#include "../acpi.hpp"
|
||||||
|
|
||||||
|
NewLock(APICLock);
|
||||||
|
|
||||||
|
using namespace CPU::x64;
|
||||||
|
|
||||||
|
/*
|
||||||
|
In constructor ‘APIC::APIC::APIC(int)’:
|
||||||
|
warning: left shift count >= width of type
|
||||||
|
| APICBaseAddress = BaseStruct.ApicBaseLo << 12u | BaseStruct.ApicBaseHi << 32u;
|
||||||
|
| ~~~~~~~~~~~~~~~~~~~~~~^~~~~~
|
||||||
|
*/
|
||||||
|
#pragma GCC diagnostic ignored "-Wshift-count-overflow"
|
||||||
|
|
||||||
|
namespace APIC
|
||||||
|
{
|
||||||
|
// headache
|
||||||
|
// https://www.amd.com/system/files/TechDocs/24593.pdf
|
||||||
|
// https://www.naic.edu/~phil/software/intel/318148.pdf
|
||||||
|
|
||||||
|
uint32_t APIC::Read(uint32_t Register)
|
||||||
|
{
|
||||||
|
if (Register != APIC_ICRLO &&
|
||||||
|
Register != APIC_ICRHI &&
|
||||||
|
Register != APIC_ID)
|
||||||
|
debug("APIC::Read(%#lx) [x2=%d]", Register, x2APICSupported ? 1 : 0);
|
||||||
|
if (x2APICSupported)
|
||||||
|
{
|
||||||
|
if (Register != APIC_ICRHI)
|
||||||
|
return rdmsr((Register >> 4) + 0x800);
|
||||||
|
else
|
||||||
|
return rdmsr(0x30 + 0x800);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
uint32_t ret = *((volatile uint32_t *)((uintptr_t)APICBaseAddress + Register));
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIC::Write(uint32_t Register, uint32_t Value)
|
||||||
|
{
|
||||||
|
if (Register != APIC_EOI &&
|
||||||
|
Register != APIC_TDCR &&
|
||||||
|
Register != APIC_TIMER &&
|
||||||
|
Register != APIC_TICR &&
|
||||||
|
Register != APIC_ICRLO &&
|
||||||
|
Register != APIC_ICRHI)
|
||||||
|
debug("APIC::Write(%#lx, %#lx) [x2=%d]", Register, Value, x2APICSupported ? 1 : 0);
|
||||||
|
if (x2APICSupported)
|
||||||
|
{
|
||||||
|
if (Register != APIC_ICRHI)
|
||||||
|
wrmsr((Register >> 4) + 0x800, Value);
|
||||||
|
else
|
||||||
|
wrmsr(MSR_X2APIC_ICR, Value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
*((volatile uint32_t *)(((uintptr_t)APICBaseAddress) + Register)) = Value;
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIC::IOWrite(uint64_t Base, uint32_t Register, uint32_t Value)
|
||||||
|
{
|
||||||
|
debug("APIC::IOWrite(%#lx, %#lx, %#lx)", Base, Register, Value);
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
*((volatile uint32_t *)(((uintptr_t)Base))) = Register;
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
*((volatile uint32_t *)(((uintptr_t)Base + 16))) = Value;
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t APIC::IORead(uint64_t Base, uint32_t Register)
|
||||||
|
{
|
||||||
|
debug("APIC::IORead(%#lx, %#lx)", Base, Register);
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
*((volatile uint32_t *)(((uintptr_t)Base))) = Register;
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
uint32_t ret = *((volatile uint32_t *)(((uintptr_t)Base + 16)));
|
||||||
|
CPU::MemBar::Barrier();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIC::EOI() { this->Write(APIC_EOI, 0); }
|
||||||
|
|
||||||
|
void APIC::WaitForIPI()
|
||||||
|
{
|
||||||
|
InterruptCommandRegisterLow icr = {.raw = 0};
|
||||||
|
do
|
||||||
|
{
|
||||||
|
icr.raw = this->Read(APIC_ICRLO);
|
||||||
|
} while (icr.DeliveryStatus != Idle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIC::IPI(uint8_t CPU, InterruptCommandRegisterLow icr)
|
||||||
|
{
|
||||||
|
SmartCriticalSection(APICLock);
|
||||||
|
if (x2APICSupported)
|
||||||
|
{
|
||||||
|
fixme("Not implemented for x2APIC");
|
||||||
|
// wrmsr(MSR_X2APIC_ICR, ((uint64_t)CPU) << 32);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->Write(APIC_ICRHI, (CPU << 24));
|
||||||
|
this->Write(APIC_ICRLO, icr.raw);
|
||||||
|
this->WaitForIPI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIC::SendInitIPI(uint8_t CPU)
|
||||||
|
{
|
||||||
|
SmartCriticalSection(APICLock);
|
||||||
|
if (x2APICSupported)
|
||||||
|
{
|
||||||
|
fixme("Not implemented for x2APIC");
|
||||||
|
// wrmsr(MSR_X2APIC_ICR, ((uint64_t)CPU) << 32);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
InterruptCommandRegisterLow icr = {.raw = 0};
|
||||||
|
icr.DeliveryMode = INIT;
|
||||||
|
icr.Level = Assert;
|
||||||
|
this->Write(APIC_ICRHI, (CPU << 24));
|
||||||
|
this->Write(APIC_ICRLO, icr.raw);
|
||||||
|
this->WaitForIPI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIC::SendStartupIPI(uint8_t CPU, uint64_t StartupAddress)
|
||||||
|
{
|
||||||
|
SmartCriticalSection(APICLock);
|
||||||
|
if (x2APICSupported)
|
||||||
|
{
|
||||||
|
warn("Not tested for x2APIC");
|
||||||
|
wrmsr(MSR_X2APIC_ICR, ((uint64_t)CPU) << 32 | StartupAddress);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
InterruptCommandRegisterLow icr = {.raw = 0};
|
||||||
|
icr.Vector = StartupAddress >> 12;
|
||||||
|
icr.DeliveryMode = Startup;
|
||||||
|
icr.Level = Assert;
|
||||||
|
this->Write(APIC_ICRHI, (CPU << 24));
|
||||||
|
this->Write(APIC_ICRLO, icr.raw);
|
||||||
|
this->WaitForIPI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t APIC::IOGetMaxRedirect(uint32_t APICID)
|
||||||
|
{
|
||||||
|
uint32_t TableAddress = (this->IORead((((ACPI::MADT *)PowerManager->GetMADT())->ioapic[APICID]->Address), GetIOAPICVersion));
|
||||||
|
return ((IOAPICVersion *)&TableAddress)->MaximumRedirectionEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIC::RawRedirectIRQ(uint8_t Vector, uint32_t GSI, uint16_t Flags, int CPU, int Status)
|
||||||
|
{
|
||||||
|
uint64_t Value = Vector;
|
||||||
|
|
||||||
|
int64_t IOAPICTarget = -1;
|
||||||
|
for (uint64_t i = 0; ((ACPI::MADT *)PowerManager->GetMADT())->ioapic[i] != 0; i++)
|
||||||
|
if (((ACPI::MADT *)PowerManager->GetMADT())->ioapic[i]->GSIBase <= GSI)
|
||||||
|
if (((ACPI::MADT *)PowerManager->GetMADT())->ioapic[i]->GSIBase + IOGetMaxRedirect(i) > GSI)
|
||||||
|
{
|
||||||
|
IOAPICTarget = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IOAPICTarget == -1)
|
||||||
|
{
|
||||||
|
error("No ISO table found for I/O APIC");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: IOAPICRedirectEntry Entry = {.raw = 0};
|
||||||
|
|
||||||
|
if (Flags & ActiveHighLow)
|
||||||
|
Value |= (1 << 13);
|
||||||
|
|
||||||
|
if (Flags & EdgeLevel)
|
||||||
|
Value |= (1 << 15);
|
||||||
|
|
||||||
|
if (!Status)
|
||||||
|
Value |= (1 << 16);
|
||||||
|
|
||||||
|
Value |= (((uintptr_t)CPU) << 56);
|
||||||
|
uint32_t IORegister = (GSI - ((ACPI::MADT *)PowerManager->GetMADT())->ioapic[IOAPICTarget]->GSIBase) * 2 + 16;
|
||||||
|
|
||||||
|
this->IOWrite(((ACPI::MADT *)PowerManager->GetMADT())->ioapic[IOAPICTarget]->Address, IORegister, (uint32_t)Value);
|
||||||
|
this->IOWrite(((ACPI::MADT *)PowerManager->GetMADT())->ioapic[IOAPICTarget]->Address, IORegister + 1, (uint32_t)(Value >> 32));
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIC::RedirectIRQ(int CPU, uint8_t IRQ, int Status)
|
||||||
|
{
|
||||||
|
for (uint64_t i = 0; i < ((ACPI::MADT *)PowerManager->GetMADT())->iso.size(); i++)
|
||||||
|
if (((ACPI::MADT *)PowerManager->GetMADT())->iso[i]->IRQSource == IRQ)
|
||||||
|
{
|
||||||
|
debug("[ISO %d] Mapping to source IRQ%#d GSI:%#lx on CPU %d",
|
||||||
|
i, ((ACPI::MADT *)PowerManager->GetMADT())->iso[i]->IRQSource, ((ACPI::MADT *)PowerManager->GetMADT())->iso[i]->GSI, CPU);
|
||||||
|
|
||||||
|
this->RawRedirectIRQ(((ACPI::MADT *)PowerManager->GetMADT())->iso[i]->IRQSource + 0x20, ((ACPI::MADT *)PowerManager->GetMADT())->iso[i]->GSI, ((ACPI::MADT *)PowerManager->GetMADT())->iso[i]->Flags, CPU, Status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
debug("Mapping IRQ%d on CPU %d", IRQ, CPU);
|
||||||
|
this->RawRedirectIRQ(IRQ + 0x20, IRQ, 0, CPU, Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
void APIC::RedirectIRQs(int CPU)
|
||||||
|
{
|
||||||
|
SmartCriticalSection(APICLock);
|
||||||
|
debug("Redirecting IRQs...");
|
||||||
|
for (int i = 0; i < 16; i++)
|
||||||
|
this->RedirectIRQ(CPU, i, 1);
|
||||||
|
debug("Redirecting IRQs completed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
APIC::APIC(int Core)
|
||||||
|
{
|
||||||
|
SmartCriticalSection(APICLock);
|
||||||
|
APIC_BASE BaseStruct = {.raw = rdmsr(MSR_APIC_BASE)};
|
||||||
|
uint64_t BaseLow = BaseStruct.ApicBaseLo;
|
||||||
|
uint64_t BaseHigh = BaseStruct.ApicBaseHi;
|
||||||
|
this->APICBaseAddress = BaseLow << 12u | BaseHigh << 32u;
|
||||||
|
trace("APIC Address: %#lx", this->APICBaseAddress);
|
||||||
|
|
||||||
|
uint32_t rcx;
|
||||||
|
cpuid(1, 0, 0, &rcx, 0);
|
||||||
|
if (rcx & CPUID_FEAT_RCX_x2APIC)
|
||||||
|
{
|
||||||
|
// this->x2APICSupported = true;
|
||||||
|
warn("x2APIC not supported yet.");
|
||||||
|
// wrmsr(MSR_APIC_BASE, (rdmsr(MSR_APIC_BASE) | (1 << 11)) & ~(1 << 10));
|
||||||
|
BaseStruct.EN = 1;
|
||||||
|
wrmsr(MSR_APIC_BASE, BaseStruct.raw);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BaseStruct.EN = 1;
|
||||||
|
wrmsr(MSR_APIC_BASE, BaseStruct.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->Write(APIC_TPR, 0x0);
|
||||||
|
// this->Write(APIC_SVR, this->Read(APIC_SVR) | 0x100); // 0x1FF or 0x100 ? on https://wiki.osdev.org/APIC is 0x100
|
||||||
|
|
||||||
|
if (!this->x2APICSupported)
|
||||||
|
{
|
||||||
|
this->Write(APIC_DFR, 0xF0000000);
|
||||||
|
this->Write(APIC_LDR, this->Read(APIC_ID));
|
||||||
|
}
|
||||||
|
|
||||||
|
ACPI::MADT *madt = (ACPI::MADT *)PowerManager->GetMADT();
|
||||||
|
|
||||||
|
for (size_t i = 0; i < madt->nmi.size(); i++)
|
||||||
|
{
|
||||||
|
if (madt->nmi[i]->processor != 0xFF && Core != madt->nmi[i]->processor)
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint32_t nmi = 0x402;
|
||||||
|
if (madt->nmi[i]->flags & 2)
|
||||||
|
nmi |= 1 << 13;
|
||||||
|
if (madt->nmi[i]->flags & 8)
|
||||||
|
nmi |= 1 << 15;
|
||||||
|
if (madt->nmi[i]->lint == 0)
|
||||||
|
this->Write(APIC_LINT0, nmi);
|
||||||
|
else if (madt->nmi[i]->lint == 1)
|
||||||
|
this->Write(APIC_LINT1, nmi);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup the spurrious interrupt vector
|
||||||
|
Spurious Spurious = {.raw = this->Read(APIC_SVR)};
|
||||||
|
Spurious.Vector = IRQ223; // TODO: Should I map the IRQ to something?
|
||||||
|
Spurious.Software = 1;
|
||||||
|
this->Write(APIC_SVR, Spurious.raw);
|
||||||
|
|
||||||
|
static int once = 0;
|
||||||
|
if (!once++)
|
||||||
|
{
|
||||||
|
// Disable PIT
|
||||||
|
outb(0x43, 0x28);
|
||||||
|
outb(0x40, 0x0);
|
||||||
|
|
||||||
|
// Disable PIC
|
||||||
|
outb(0x21, 0xFF);
|
||||||
|
outb(0xA1, 0xFF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
APIC::~APIC() {}
|
||||||
|
|
||||||
|
void Timer::OnInterruptReceived(TrapFrame *Frame) {}
|
||||||
|
|
||||||
|
void Timer::OneShot(uint32_t Vector, uint64_t Miliseconds)
|
||||||
|
{
|
||||||
|
SmartCriticalSection(APICLock);
|
||||||
|
LVTTimer timer = {.raw = 0};
|
||||||
|
timer.Vector = Vector;
|
||||||
|
timer.TimerMode = 0;
|
||||||
|
if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_TCG) != 0)
|
||||||
|
this->lapic->Write(APIC_TDCR, DivideBy128);
|
||||||
|
else
|
||||||
|
this->lapic->Write(APIC_TDCR, DivideBy16);
|
||||||
|
this->lapic->Write(APIC_TICR, Ticks * Miliseconds);
|
||||||
|
this->lapic->Write(APIC_TIMER, timer.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer::Timer(APIC *apic) : Interrupts::Handler(IRQ0)
|
||||||
|
{
|
||||||
|
SmartCriticalSection(APICLock);
|
||||||
|
this->lapic = apic;
|
||||||
|
LVTTimerDivide Divider = DivideBy16;
|
||||||
|
|
||||||
|
trace("Initializing APIC timer on CPU %d", GetCurrentCPU()->ID);
|
||||||
|
|
||||||
|
this->lapic->Write(APIC_TDCR, Divider);
|
||||||
|
this->lapic->Write(APIC_TICR, 0xFFFFFFFF);
|
||||||
|
|
||||||
|
TimeManager->Sleep(10);
|
||||||
|
|
||||||
|
// Mask the timer
|
||||||
|
this->lapic->Write(APIC_TIMER, 0x10000 /* LVTTimer.Mask flag */);
|
||||||
|
Ticks = 0xFFFFFFFF - this->lapic->Read(APIC_TCCR);
|
||||||
|
|
||||||
|
// Config for IRQ0 timer
|
||||||
|
LVTTimer timer = {.raw = 0};
|
||||||
|
timer.Vector = IRQ0;
|
||||||
|
timer.Mask = Unmasked;
|
||||||
|
timer.TimerMode = LVTTimerMode::OneShot;
|
||||||
|
|
||||||
|
// Initialize APIC timer
|
||||||
|
this->lapic->Write(APIC_TDCR, Divider);
|
||||||
|
this->lapic->Write(APIC_TICR, Ticks);
|
||||||
|
this->lapic->Write(APIC_TIMER, timer.raw);
|
||||||
|
trace("%d APIC Timer %d ticks in.", GetCurrentCPU()->ID, Ticks);
|
||||||
|
KPrint("APIC Timer: \e8888FF%ld\eCCCCCC ticks.", Ticks);
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer::~Timer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
153
Kernel/Architecture/amd64/cpu/GlobalDescriptorTable.cpp
Normal file
153
Kernel/Architecture/amd64/cpu/GlobalDescriptorTable.cpp
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
#include "gdt.hpp"
|
||||||
|
|
||||||
|
#include <memory.hpp>
|
||||||
|
#include <smp.hpp>
|
||||||
|
#include <cpu.hpp>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
namespace GlobalDescriptorTable
|
||||||
|
{
|
||||||
|
static GlobalDescriptorTableEntries GDTEntriesTemplate = {
|
||||||
|
// null
|
||||||
|
{.Length = 0x0,
|
||||||
|
.BaseLow = 0x0,
|
||||||
|
.BaseMiddle = 0x0,
|
||||||
|
.Access = {.Raw = 0x0},
|
||||||
|
.Flags = {.Raw = 0x0},
|
||||||
|
.BaseHigh = 0x0},
|
||||||
|
|
||||||
|
// kernel code
|
||||||
|
{.Length = 0x0,
|
||||||
|
.BaseLow = 0x0,
|
||||||
|
.BaseMiddle = 0x0,
|
||||||
|
.Access = {.A = 0,
|
||||||
|
.RW = 1,
|
||||||
|
.DC = 0,
|
||||||
|
.E = 1,
|
||||||
|
.S = 1,
|
||||||
|
.DPL = 0,
|
||||||
|
.P = 1},
|
||||||
|
.Flags = {.Unknown = 0x0, .L = 1},
|
||||||
|
.BaseHigh = 0x0},
|
||||||
|
|
||||||
|
// kernel data
|
||||||
|
{.Length = 0x0,
|
||||||
|
.BaseLow = 0x0,
|
||||||
|
.BaseMiddle = 0x0,
|
||||||
|
.Access = {.A = 0,
|
||||||
|
.RW = 1,
|
||||||
|
.DC = 0,
|
||||||
|
.E = 0,
|
||||||
|
.S = 1,
|
||||||
|
.DPL = 0,
|
||||||
|
.P = 1},
|
||||||
|
.Flags = {.Raw = 0x0},
|
||||||
|
.BaseHigh = 0x0},
|
||||||
|
|
||||||
|
// user data
|
||||||
|
{.Length = 0x0,
|
||||||
|
.BaseLow = 0x0,
|
||||||
|
.BaseMiddle = 0x0,
|
||||||
|
.Access = {.A = 0,
|
||||||
|
.RW = 1,
|
||||||
|
.DC = 0,
|
||||||
|
.E = 0,
|
||||||
|
.S = 1,
|
||||||
|
.DPL = 3,
|
||||||
|
.P = 1},
|
||||||
|
.Flags = {.Raw = 0x0},
|
||||||
|
.BaseHigh = 0x0},
|
||||||
|
|
||||||
|
// user code
|
||||||
|
{.Length = 0x0,
|
||||||
|
.BaseLow = 0x0,
|
||||||
|
.BaseMiddle = 0x0,
|
||||||
|
.Access = {.A = 0,
|
||||||
|
.RW = 1,
|
||||||
|
.DC = 0,
|
||||||
|
.E = 1,
|
||||||
|
.S = 1,
|
||||||
|
.DPL = 3,
|
||||||
|
.P = 1},
|
||||||
|
.Flags = {.Unknown = 0x0, .L = 1},
|
||||||
|
.BaseHigh = 0x0},
|
||||||
|
|
||||||
|
// tss
|
||||||
|
{}};
|
||||||
|
|
||||||
|
static GlobalDescriptorTableEntries GDTEntries[MAX_CPU];
|
||||||
|
GlobalDescriptorTableDescriptor gdt[MAX_CPU];
|
||||||
|
|
||||||
|
TaskStateSegment tss[MAX_CPU] = {
|
||||||
|
0,
|
||||||
|
{0, 0, 0},
|
||||||
|
0,
|
||||||
|
{0, 0, 0, 0, 0, 0, 0},
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
|
||||||
|
void *CPUStackPointer[MAX_CPU];
|
||||||
|
|
||||||
|
SafeFunction void Init(int Core)
|
||||||
|
{
|
||||||
|
memcpy(&GDTEntries[Core], &GDTEntriesTemplate, sizeof(GlobalDescriptorTableEntries));
|
||||||
|
gdt[Core] = {.Length = sizeof(GlobalDescriptorTableEntries) - 1, .Entries = &GDTEntries[Core]};
|
||||||
|
|
||||||
|
debug("Kernel: Code Access: %ld; Data Access: %ld", GDTEntries[Core].Code.Access.Raw, GDTEntries[Core].Data.Access.Raw);
|
||||||
|
debug("Kernel: Code Flags: %ld; Data Flags: %ld", GDTEntries[Core].Code.Flags.Raw, GDTEntries[Core].Data.Flags.Raw);
|
||||||
|
debug("User: Code Access: %ld; Data Access: %ld", GDTEntries[Core].UserCode.Access.Raw, GDTEntries[Core].UserData.Access.Raw);
|
||||||
|
debug("User: Code Flags: %ld; Data Flags: %ld", GDTEntries[Core].UserCode.Flags.Raw, GDTEntries[Core].UserData.Flags.Raw);
|
||||||
|
CPU::x64::lgdt(&gdt[Core]);
|
||||||
|
|
||||||
|
asmv("movq %%rsp, %%rax\n"
|
||||||
|
"pushq $16\n"
|
||||||
|
"pushq %%rax\n"
|
||||||
|
"pushfq\n"
|
||||||
|
"pushq $8\n"
|
||||||
|
"pushq $1f\n"
|
||||||
|
"iretq\n"
|
||||||
|
"1:\n"
|
||||||
|
"movw $16, %%ax\n"
|
||||||
|
"movw %%ax, %%ds\n"
|
||||||
|
"movw %%ax, %%es\n" ::
|
||||||
|
: "memory", "rax");
|
||||||
|
|
||||||
|
CPUStackPointer[Core] = KernelAllocator.RequestPages(TO_PAGES(STACK_SIZE));
|
||||||
|
|
||||||
|
uint64_t Base = (uint64_t)&tss[Core];
|
||||||
|
uint64_t Limit = Base + sizeof(TaskStateSegment);
|
||||||
|
gdt[Core].Entries->TaskStateSegment.Length = Limit & 0xFFFF;
|
||||||
|
gdt[Core].Entries->TaskStateSegment.BaseLow = Base & 0xFFFF;
|
||||||
|
gdt[Core].Entries->TaskStateSegment.BaseMiddle = (Base >> 16) & 0xFF;
|
||||||
|
gdt[Core].Entries->TaskStateSegment.BaseHigh = (Base >> 24) & 0xFF;
|
||||||
|
gdt[Core].Entries->TaskStateSegment.BaseUpper = (Base >> 32) & 0xFFFFFFFF;
|
||||||
|
gdt[Core].Entries->TaskStateSegment.Flags = {.A = 1, .RW = 0, .DC = 0, .E = 1, .S = 0, .DPL = 0, .P = 1};
|
||||||
|
gdt[Core].Entries->TaskStateSegment.Granularity = (0 << 4) | ((Limit >> 16) & 0xF);
|
||||||
|
|
||||||
|
tss[Core].IOMapBaseAddressOffset = sizeof(TaskStateSegment);
|
||||||
|
tss[Core].StackPointer[0] = (uint64_t)CPUStackPointer[Core] + STACK_SIZE;
|
||||||
|
tss[Core].InterruptStackTable[0] = (uint64_t)KernelAllocator.RequestPages(TO_PAGES(STACK_SIZE)) + STACK_SIZE;
|
||||||
|
tss[Core].InterruptStackTable[1] = (uint64_t)KernelAllocator.RequestPages(TO_PAGES(STACK_SIZE)) + STACK_SIZE;
|
||||||
|
tss[Core].InterruptStackTable[2] = (uint64_t)KernelAllocator.RequestPages(TO_PAGES(STACK_SIZE)) + STACK_SIZE;
|
||||||
|
|
||||||
|
CPU::x64::ltr(GDT_TSS);
|
||||||
|
asmv("mov %%rsp, %0"
|
||||||
|
: "=r"(tss[Core].StackPointer[0]));
|
||||||
|
|
||||||
|
trace("GDT_KERNEL_CODE: %#lx", GDT_KERNEL_CODE);
|
||||||
|
trace("GDT_KERNEL_DATA: %#lx", GDT_KERNEL_DATA);
|
||||||
|
trace("GDT_USER_CODE: %#lx", GDT_USER_CODE);
|
||||||
|
trace("GDT_USER_DATA: %#lx", GDT_USER_DATA);
|
||||||
|
trace("GDT_TSS: %#lx", GDT_TSS);
|
||||||
|
trace("Global Descriptor Table initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
SafeFunction void SetKernelStack(void *Stack)
|
||||||
|
{
|
||||||
|
if (Stack)
|
||||||
|
tss[GetCurrentCPU()->ID].StackPointer[0] = (uint64_t)Stack;
|
||||||
|
else
|
||||||
|
tss[GetCurrentCPU()->ID].StackPointer[0] = (uint64_t)CPUStackPointer[GetCurrentCPU()->ID] + STACK_SIZE;
|
||||||
|
}
|
||||||
|
}
|
755
Kernel/Architecture/amd64/cpu/InterruptDescriptorTable.cpp
Normal file
755
Kernel/Architecture/amd64/cpu/InterruptDescriptorTable.cpp
Normal file
@ -0,0 +1,755 @@
|
|||||||
|
#include "idt.hpp"
|
||||||
|
|
||||||
|
#include <cpu.hpp>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <io.h>
|
||||||
|
|
||||||
|
#include "gdt.hpp"
|
||||||
|
|
||||||
|
extern "C" void MainInterruptHandler(void *Data);
|
||||||
|
extern "C" void ExceptionHandler(void *Data);
|
||||||
|
|
||||||
|
namespace InterruptDescriptorTable
|
||||||
|
{
|
||||||
|
static InterruptDescriptorTableEntry Entries[0x100];
|
||||||
|
|
||||||
|
InterruptDescriptorTableDescriptor idtd = {.Length = sizeof(Entries) - 1,
|
||||||
|
.Entries = Entries};
|
||||||
|
|
||||||
|
void SetEntry(uint8_t Index,
|
||||||
|
void (*Base)(),
|
||||||
|
InterruptDescriptorTableFlags Attribute,
|
||||||
|
uint8_t InterruptStackTable,
|
||||||
|
InterruptDescriptorTableFlags Ring,
|
||||||
|
uint16_t SegmentSelector)
|
||||||
|
{
|
||||||
|
Entries[Index].BaseLow = (uint16_t)((uint64_t)Base & 0xFFFF);
|
||||||
|
Entries[Index].BaseHigh = (uint64_t)((uint64_t)Base >> 16 /* & 0xFFFF */);
|
||||||
|
Entries[Index].SegmentSelector = SegmentSelector;
|
||||||
|
Entries[Index].Flags = Attribute;
|
||||||
|
Entries[Index].Reserved1 = 0;
|
||||||
|
Entries[Index].Reserved2 = 0;
|
||||||
|
Entries[Index].Reserved3 = 0;
|
||||||
|
Entries[Index].InterruptStackTable = InterruptStackTable;
|
||||||
|
Entries[Index].Ring = Ring;
|
||||||
|
Entries[Index].Present = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" __attribute__((naked, used, no_stack_protector)) void ExceptionHandlerStub()
|
||||||
|
{
|
||||||
|
asm(
|
||||||
|
// "cmp $0x1000, %rsp\n" // Just in case the stack is corrupted
|
||||||
|
// "jng .skip_swap_check_1\n" /* if is not greater than */
|
||||||
|
// "cmpw $0x8, 0x8(%rsp)\n"
|
||||||
|
// "je .skip_swap_check_1\n"
|
||||||
|
// "swapgs\n"
|
||||||
|
// ".skip_swap_check_1:\n"
|
||||||
|
|
||||||
|
"cld\n" // clear direction flag
|
||||||
|
|
||||||
|
// push all registers
|
||||||
|
"pushq %rax\n"
|
||||||
|
"pushq %rbx\n"
|
||||||
|
"pushq %rcx\n"
|
||||||
|
"pushq %rdx\n"
|
||||||
|
"pushq %rsi\n"
|
||||||
|
"pushq %rdi\n"
|
||||||
|
"pushq %rbp\n"
|
||||||
|
"pushq %r8\n"
|
||||||
|
"pushq %r9\n"
|
||||||
|
"pushq %r10\n"
|
||||||
|
"pushq %r11\n"
|
||||||
|
"pushq %r12\n"
|
||||||
|
"pushq %r13\n"
|
||||||
|
"pushq %r14\n"
|
||||||
|
"pushq %r15\n"
|
||||||
|
|
||||||
|
"movq %rsp, %rdi\n"
|
||||||
|
"call ExceptionHandler\n"
|
||||||
|
|
||||||
|
// pop all registers
|
||||||
|
"popq %r15\n"
|
||||||
|
"popq %r14\n"
|
||||||
|
"popq %r13\n"
|
||||||
|
"popq %r12\n"
|
||||||
|
"popq %r11\n"
|
||||||
|
"popq %r10\n"
|
||||||
|
"popq %r9\n"
|
||||||
|
"popq %r8\n"
|
||||||
|
"popq %rbp\n"
|
||||||
|
"popq %rdi\n"
|
||||||
|
"popq %rsi\n"
|
||||||
|
"popq %rdx\n"
|
||||||
|
"popq %rcx\n"
|
||||||
|
"popq %rbx\n"
|
||||||
|
"popq %rax\n"
|
||||||
|
|
||||||
|
"addq $16, %rsp\n"
|
||||||
|
|
||||||
|
// "cmp $0x1000, %rsp\n"
|
||||||
|
// "jng .skip_swap_check_2\n"
|
||||||
|
// "cmpw $0x8, 0x8(%rsp)\n"
|
||||||
|
// "je .skip_swap_check_2\n"
|
||||||
|
// "swapgs\n"
|
||||||
|
// ".skip_swap_check_2:\n"
|
||||||
|
|
||||||
|
"iretq"); // pop CS RIP RFLAGS SS ESP
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void WarnSwapgs() { warn("swapgs"); }
|
||||||
|
|
||||||
|
extern "C" __attribute__((naked, used, no_stack_protector)) void InterruptHandlerStub()
|
||||||
|
{
|
||||||
|
asm(
|
||||||
|
// "cmp $0x1000, %rsp\n"
|
||||||
|
// "jng .skip_swap_check__1\n"
|
||||||
|
// "cmpw $0x8, 0x8(%rsp)\n"
|
||||||
|
// "je .skip_swap_check__1\n"
|
||||||
|
// "swapgs\n"
|
||||||
|
// "call WarnSwapgs\n"
|
||||||
|
// ".skip_swap_check__1:\n"
|
||||||
|
|
||||||
|
"cld\n"
|
||||||
|
"pushq %rax\n"
|
||||||
|
"pushq %rbx\n"
|
||||||
|
"pushq %rcx\n"
|
||||||
|
"pushq %rdx\n"
|
||||||
|
"pushq %rsi\n"
|
||||||
|
"pushq %rdi\n"
|
||||||
|
"pushq %rbp\n"
|
||||||
|
"pushq %r8\n"
|
||||||
|
"pushq %r9\n"
|
||||||
|
"pushq %r10\n"
|
||||||
|
"pushq %r11\n"
|
||||||
|
"pushq %r12\n"
|
||||||
|
"pushq %r13\n"
|
||||||
|
"pushq %r14\n"
|
||||||
|
"pushq %r15\n"
|
||||||
|
|
||||||
|
"movq %rsp, %rdi\n"
|
||||||
|
"call MainInterruptHandler\n"
|
||||||
|
|
||||||
|
"popq %r15\n"
|
||||||
|
"popq %r14\n"
|
||||||
|
"popq %r13\n"
|
||||||
|
"popq %r12\n"
|
||||||
|
"popq %r11\n"
|
||||||
|
"popq %r10\n"
|
||||||
|
"popq %r9\n"
|
||||||
|
"popq %r8\n"
|
||||||
|
"popq %rbp\n"
|
||||||
|
"popq %rdi\n"
|
||||||
|
"popq %rsi\n"
|
||||||
|
"popq %rdx\n"
|
||||||
|
"popq %rcx\n"
|
||||||
|
"popq %rbx\n"
|
||||||
|
"popq %rax\n"
|
||||||
|
|
||||||
|
"addq $16, %rsp\n"
|
||||||
|
|
||||||
|
// "cmp $0x1000, %rsp\n"
|
||||||
|
// "jng .skip_swap_check__2\n"
|
||||||
|
// "cmpw $0x8, 0x8(%rsp)\n"
|
||||||
|
// "je .skip_swap_check__2\n"
|
||||||
|
// "call WarnSwapgs\n"
|
||||||
|
// "swapgs\n"
|
||||||
|
// ".skip_swap_check__2:\n"
|
||||||
|
|
||||||
|
"iretq");
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma region Exceptions
|
||||||
|
|
||||||
|
#define EXCEPTION_HANDLER(num) \
|
||||||
|
__attribute__((naked, no_stack_protector)) static void InterruptHandler_##num() \
|
||||||
|
{ \
|
||||||
|
asm("pushq $0\npushq $" #num "\n" \
|
||||||
|
"jmp ExceptionHandlerStub"); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define EXCEPTION_ERROR_HANDLER(num) \
|
||||||
|
__attribute__((naked, no_stack_protector)) static void InterruptHandler_##num() \
|
||||||
|
{ \
|
||||||
|
asm("pushq $" #num "\n" \
|
||||||
|
"jmp ExceptionHandlerStub"); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define INTERRUPT_HANDLER(num) \
|
||||||
|
__attribute__((naked, used, no_stack_protector)) void InterruptHandler_##num() \
|
||||||
|
{ \
|
||||||
|
asm("pushq $0\npushq $" #num "\n" \
|
||||||
|
"jmp InterruptHandlerStub\n"); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ISR */
|
||||||
|
|
||||||
|
EXCEPTION_HANDLER(0x0);
|
||||||
|
EXCEPTION_HANDLER(0x1);
|
||||||
|
EXCEPTION_HANDLER(0x2);
|
||||||
|
EXCEPTION_HANDLER(0x3);
|
||||||
|
EXCEPTION_HANDLER(0x4);
|
||||||
|
EXCEPTION_HANDLER(0x5);
|
||||||
|
EXCEPTION_HANDLER(0x6);
|
||||||
|
EXCEPTION_HANDLER(0x7);
|
||||||
|
EXCEPTION_ERROR_HANDLER(0x8);
|
||||||
|
EXCEPTION_HANDLER(0x9);
|
||||||
|
EXCEPTION_ERROR_HANDLER(0xa);
|
||||||
|
EXCEPTION_ERROR_HANDLER(0xb);
|
||||||
|
EXCEPTION_ERROR_HANDLER(0xc);
|
||||||
|
EXCEPTION_ERROR_HANDLER(0xd);
|
||||||
|
EXCEPTION_ERROR_HANDLER(0xe);
|
||||||
|
EXCEPTION_HANDLER(0xf);
|
||||||
|
EXCEPTION_ERROR_HANDLER(0x10);
|
||||||
|
EXCEPTION_HANDLER(0x11);
|
||||||
|
EXCEPTION_HANDLER(0x12);
|
||||||
|
EXCEPTION_HANDLER(0x13);
|
||||||
|
EXCEPTION_HANDLER(0x14);
|
||||||
|
EXCEPTION_HANDLER(0x15);
|
||||||
|
EXCEPTION_HANDLER(0x16);
|
||||||
|
EXCEPTION_HANDLER(0x17);
|
||||||
|
EXCEPTION_HANDLER(0x18);
|
||||||
|
EXCEPTION_HANDLER(0x19);
|
||||||
|
EXCEPTION_HANDLER(0x1a);
|
||||||
|
EXCEPTION_HANDLER(0x1b);
|
||||||
|
EXCEPTION_HANDLER(0x1c);
|
||||||
|
EXCEPTION_HANDLER(0x1d);
|
||||||
|
EXCEPTION_HANDLER(0x1e);
|
||||||
|
EXCEPTION_HANDLER(0x1f);
|
||||||
|
|
||||||
|
/* IRQ */
|
||||||
|
|
||||||
|
INTERRUPT_HANDLER(0x20)
|
||||||
|
INTERRUPT_HANDLER(0x21)
|
||||||
|
INTERRUPT_HANDLER(0x22)
|
||||||
|
INTERRUPT_HANDLER(0x23)
|
||||||
|
INTERRUPT_HANDLER(0x24)
|
||||||
|
INTERRUPT_HANDLER(0x25)
|
||||||
|
INTERRUPT_HANDLER(0x26)
|
||||||
|
INTERRUPT_HANDLER(0x27)
|
||||||
|
INTERRUPT_HANDLER(0x28)
|
||||||
|
INTERRUPT_HANDLER(0x29)
|
||||||
|
INTERRUPT_HANDLER(0x2a)
|
||||||
|
INTERRUPT_HANDLER(0x2b)
|
||||||
|
INTERRUPT_HANDLER(0x2c)
|
||||||
|
INTERRUPT_HANDLER(0x2d)
|
||||||
|
INTERRUPT_HANDLER(0x2e)
|
||||||
|
INTERRUPT_HANDLER(0x2f)
|
||||||
|
|
||||||
|
/* Reserved by OS */
|
||||||
|
|
||||||
|
INTERRUPT_HANDLER(0x30)
|
||||||
|
INTERRUPT_HANDLER(0x31)
|
||||||
|
INTERRUPT_HANDLER(0x32)
|
||||||
|
INTERRUPT_HANDLER(0x33)
|
||||||
|
INTERRUPT_HANDLER(0x34)
|
||||||
|
INTERRUPT_HANDLER(0x35)
|
||||||
|
INTERRUPT_HANDLER(0x36)
|
||||||
|
INTERRUPT_HANDLER(0x37)
|
||||||
|
INTERRUPT_HANDLER(0x38)
|
||||||
|
INTERRUPT_HANDLER(0x39)
|
||||||
|
INTERRUPT_HANDLER(0x3a)
|
||||||
|
INTERRUPT_HANDLER(0x3b)
|
||||||
|
INTERRUPT_HANDLER(0x3c)
|
||||||
|
INTERRUPT_HANDLER(0x3d)
|
||||||
|
|
||||||
|
/* Free */
|
||||||
|
|
||||||
|
INTERRUPT_HANDLER(0x3e)
|
||||||
|
INTERRUPT_HANDLER(0x3f)
|
||||||
|
INTERRUPT_HANDLER(0x40)
|
||||||
|
INTERRUPT_HANDLER(0x41)
|
||||||
|
INTERRUPT_HANDLER(0x42)
|
||||||
|
INTERRUPT_HANDLER(0x43)
|
||||||
|
INTERRUPT_HANDLER(0x44)
|
||||||
|
INTERRUPT_HANDLER(0x45)
|
||||||
|
INTERRUPT_HANDLER(0x46)
|
||||||
|
INTERRUPT_HANDLER(0x47)
|
||||||
|
INTERRUPT_HANDLER(0x48)
|
||||||
|
INTERRUPT_HANDLER(0x49)
|
||||||
|
INTERRUPT_HANDLER(0x4a)
|
||||||
|
INTERRUPT_HANDLER(0x4b)
|
||||||
|
INTERRUPT_HANDLER(0x4c)
|
||||||
|
INTERRUPT_HANDLER(0x4d)
|
||||||
|
INTERRUPT_HANDLER(0x4e)
|
||||||
|
INTERRUPT_HANDLER(0x4f)
|
||||||
|
INTERRUPT_HANDLER(0x50)
|
||||||
|
INTERRUPT_HANDLER(0x51)
|
||||||
|
INTERRUPT_HANDLER(0x52)
|
||||||
|
INTERRUPT_HANDLER(0x53)
|
||||||
|
INTERRUPT_HANDLER(0x54)
|
||||||
|
INTERRUPT_HANDLER(0x55)
|
||||||
|
INTERRUPT_HANDLER(0x56)
|
||||||
|
INTERRUPT_HANDLER(0x57)
|
||||||
|
INTERRUPT_HANDLER(0x58)
|
||||||
|
INTERRUPT_HANDLER(0x59)
|
||||||
|
INTERRUPT_HANDLER(0x5a)
|
||||||
|
INTERRUPT_HANDLER(0x5b)
|
||||||
|
INTERRUPT_HANDLER(0x5c)
|
||||||
|
INTERRUPT_HANDLER(0x5d)
|
||||||
|
INTERRUPT_HANDLER(0x5e)
|
||||||
|
INTERRUPT_HANDLER(0x5f)
|
||||||
|
INTERRUPT_HANDLER(0x60)
|
||||||
|
INTERRUPT_HANDLER(0x61)
|
||||||
|
INTERRUPT_HANDLER(0x62)
|
||||||
|
INTERRUPT_HANDLER(0x63)
|
||||||
|
INTERRUPT_HANDLER(0x64)
|
||||||
|
INTERRUPT_HANDLER(0x65)
|
||||||
|
INTERRUPT_HANDLER(0x66)
|
||||||
|
INTERRUPT_HANDLER(0x67)
|
||||||
|
INTERRUPT_HANDLER(0x68)
|
||||||
|
INTERRUPT_HANDLER(0x69)
|
||||||
|
INTERRUPT_HANDLER(0x6a)
|
||||||
|
INTERRUPT_HANDLER(0x6b)
|
||||||
|
INTERRUPT_HANDLER(0x6c)
|
||||||
|
INTERRUPT_HANDLER(0x6d)
|
||||||
|
INTERRUPT_HANDLER(0x6e)
|
||||||
|
INTERRUPT_HANDLER(0x6f)
|
||||||
|
INTERRUPT_HANDLER(0x70)
|
||||||
|
INTERRUPT_HANDLER(0x71)
|
||||||
|
INTERRUPT_HANDLER(0x72)
|
||||||
|
INTERRUPT_HANDLER(0x73)
|
||||||
|
INTERRUPT_HANDLER(0x74)
|
||||||
|
INTERRUPT_HANDLER(0x75)
|
||||||
|
INTERRUPT_HANDLER(0x76)
|
||||||
|
INTERRUPT_HANDLER(0x77)
|
||||||
|
INTERRUPT_HANDLER(0x78)
|
||||||
|
INTERRUPT_HANDLER(0x79)
|
||||||
|
INTERRUPT_HANDLER(0x7a)
|
||||||
|
INTERRUPT_HANDLER(0x7b)
|
||||||
|
INTERRUPT_HANDLER(0x7c)
|
||||||
|
INTERRUPT_HANDLER(0x7d)
|
||||||
|
INTERRUPT_HANDLER(0x7e)
|
||||||
|
INTERRUPT_HANDLER(0x7f)
|
||||||
|
INTERRUPT_HANDLER(0x80)
|
||||||
|
INTERRUPT_HANDLER(0x81)
|
||||||
|
INTERRUPT_HANDLER(0x82)
|
||||||
|
INTERRUPT_HANDLER(0x83)
|
||||||
|
INTERRUPT_HANDLER(0x84)
|
||||||
|
INTERRUPT_HANDLER(0x85)
|
||||||
|
INTERRUPT_HANDLER(0x86)
|
||||||
|
INTERRUPT_HANDLER(0x87)
|
||||||
|
INTERRUPT_HANDLER(0x88)
|
||||||
|
INTERRUPT_HANDLER(0x89)
|
||||||
|
INTERRUPT_HANDLER(0x8a)
|
||||||
|
INTERRUPT_HANDLER(0x8b)
|
||||||
|
INTERRUPT_HANDLER(0x8c)
|
||||||
|
INTERRUPT_HANDLER(0x8d)
|
||||||
|
INTERRUPT_HANDLER(0x8e)
|
||||||
|
INTERRUPT_HANDLER(0x8f)
|
||||||
|
INTERRUPT_HANDLER(0x90)
|
||||||
|
INTERRUPT_HANDLER(0x91)
|
||||||
|
INTERRUPT_HANDLER(0x92)
|
||||||
|
INTERRUPT_HANDLER(0x93)
|
||||||
|
INTERRUPT_HANDLER(0x94)
|
||||||
|
INTERRUPT_HANDLER(0x95)
|
||||||
|
INTERRUPT_HANDLER(0x96)
|
||||||
|
INTERRUPT_HANDLER(0x97)
|
||||||
|
INTERRUPT_HANDLER(0x98)
|
||||||
|
INTERRUPT_HANDLER(0x99)
|
||||||
|
INTERRUPT_HANDLER(0x9a)
|
||||||
|
INTERRUPT_HANDLER(0x9b)
|
||||||
|
INTERRUPT_HANDLER(0x9c)
|
||||||
|
INTERRUPT_HANDLER(0x9d)
|
||||||
|
INTERRUPT_HANDLER(0x9e)
|
||||||
|
INTERRUPT_HANDLER(0x9f)
|
||||||
|
INTERRUPT_HANDLER(0xa0)
|
||||||
|
INTERRUPT_HANDLER(0xa1)
|
||||||
|
INTERRUPT_HANDLER(0xa2)
|
||||||
|
INTERRUPT_HANDLER(0xa3)
|
||||||
|
INTERRUPT_HANDLER(0xa4)
|
||||||
|
INTERRUPT_HANDLER(0xa5)
|
||||||
|
INTERRUPT_HANDLER(0xa6)
|
||||||
|
INTERRUPT_HANDLER(0xa7)
|
||||||
|
INTERRUPT_HANDLER(0xa8)
|
||||||
|
INTERRUPT_HANDLER(0xa9)
|
||||||
|
INTERRUPT_HANDLER(0xaa)
|
||||||
|
INTERRUPT_HANDLER(0xab)
|
||||||
|
INTERRUPT_HANDLER(0xac)
|
||||||
|
INTERRUPT_HANDLER(0xad)
|
||||||
|
INTERRUPT_HANDLER(0xae)
|
||||||
|
INTERRUPT_HANDLER(0xaf)
|
||||||
|
INTERRUPT_HANDLER(0xb0)
|
||||||
|
INTERRUPT_HANDLER(0xb1)
|
||||||
|
INTERRUPT_HANDLER(0xb2)
|
||||||
|
INTERRUPT_HANDLER(0xb3)
|
||||||
|
INTERRUPT_HANDLER(0xb4)
|
||||||
|
INTERRUPT_HANDLER(0xb5)
|
||||||
|
INTERRUPT_HANDLER(0xb6)
|
||||||
|
INTERRUPT_HANDLER(0xb7)
|
||||||
|
INTERRUPT_HANDLER(0xb8)
|
||||||
|
INTERRUPT_HANDLER(0xb9)
|
||||||
|
INTERRUPT_HANDLER(0xba)
|
||||||
|
INTERRUPT_HANDLER(0xbb)
|
||||||
|
INTERRUPT_HANDLER(0xbc)
|
||||||
|
INTERRUPT_HANDLER(0xbd)
|
||||||
|
INTERRUPT_HANDLER(0xbe)
|
||||||
|
INTERRUPT_HANDLER(0xbf)
|
||||||
|
INTERRUPT_HANDLER(0xc0)
|
||||||
|
INTERRUPT_HANDLER(0xc1)
|
||||||
|
INTERRUPT_HANDLER(0xc2)
|
||||||
|
INTERRUPT_HANDLER(0xc3)
|
||||||
|
INTERRUPT_HANDLER(0xc4)
|
||||||
|
INTERRUPT_HANDLER(0xc5)
|
||||||
|
INTERRUPT_HANDLER(0xc6)
|
||||||
|
INTERRUPT_HANDLER(0xc7)
|
||||||
|
INTERRUPT_HANDLER(0xc8)
|
||||||
|
INTERRUPT_HANDLER(0xc9)
|
||||||
|
INTERRUPT_HANDLER(0xca)
|
||||||
|
INTERRUPT_HANDLER(0xcb)
|
||||||
|
INTERRUPT_HANDLER(0xcc)
|
||||||
|
INTERRUPT_HANDLER(0xcd)
|
||||||
|
INTERRUPT_HANDLER(0xce)
|
||||||
|
INTERRUPT_HANDLER(0xcf)
|
||||||
|
INTERRUPT_HANDLER(0xd0)
|
||||||
|
INTERRUPT_HANDLER(0xd1)
|
||||||
|
INTERRUPT_HANDLER(0xd2)
|
||||||
|
INTERRUPT_HANDLER(0xd3)
|
||||||
|
INTERRUPT_HANDLER(0xd4)
|
||||||
|
INTERRUPT_HANDLER(0xd5)
|
||||||
|
INTERRUPT_HANDLER(0xd6)
|
||||||
|
INTERRUPT_HANDLER(0xd7)
|
||||||
|
INTERRUPT_HANDLER(0xd8)
|
||||||
|
INTERRUPT_HANDLER(0xd9)
|
||||||
|
INTERRUPT_HANDLER(0xda)
|
||||||
|
INTERRUPT_HANDLER(0xdb)
|
||||||
|
INTERRUPT_HANDLER(0xdc)
|
||||||
|
INTERRUPT_HANDLER(0xdd)
|
||||||
|
INTERRUPT_HANDLER(0xde)
|
||||||
|
INTERRUPT_HANDLER(0xdf)
|
||||||
|
INTERRUPT_HANDLER(0xe0)
|
||||||
|
INTERRUPT_HANDLER(0xe1)
|
||||||
|
INTERRUPT_HANDLER(0xe2)
|
||||||
|
INTERRUPT_HANDLER(0xe3)
|
||||||
|
INTERRUPT_HANDLER(0xe4)
|
||||||
|
INTERRUPT_HANDLER(0xe5)
|
||||||
|
INTERRUPT_HANDLER(0xe6)
|
||||||
|
INTERRUPT_HANDLER(0xe7)
|
||||||
|
INTERRUPT_HANDLER(0xe8)
|
||||||
|
INTERRUPT_HANDLER(0xe9)
|
||||||
|
INTERRUPT_HANDLER(0xea)
|
||||||
|
INTERRUPT_HANDLER(0xeb)
|
||||||
|
INTERRUPT_HANDLER(0xec)
|
||||||
|
INTERRUPT_HANDLER(0xed)
|
||||||
|
INTERRUPT_HANDLER(0xee)
|
||||||
|
INTERRUPT_HANDLER(0xef)
|
||||||
|
INTERRUPT_HANDLER(0xf0)
|
||||||
|
INTERRUPT_HANDLER(0xf1)
|
||||||
|
INTERRUPT_HANDLER(0xf2)
|
||||||
|
INTERRUPT_HANDLER(0xf3)
|
||||||
|
INTERRUPT_HANDLER(0xf4)
|
||||||
|
INTERRUPT_HANDLER(0xf5)
|
||||||
|
INTERRUPT_HANDLER(0xf6)
|
||||||
|
INTERRUPT_HANDLER(0xf7)
|
||||||
|
INTERRUPT_HANDLER(0xf8)
|
||||||
|
INTERRUPT_HANDLER(0xf9)
|
||||||
|
INTERRUPT_HANDLER(0xfa)
|
||||||
|
INTERRUPT_HANDLER(0xfb)
|
||||||
|
INTERRUPT_HANDLER(0xfc)
|
||||||
|
INTERRUPT_HANDLER(0xfd)
|
||||||
|
INTERRUPT_HANDLER(0xfe)
|
||||||
|
INTERRUPT_HANDLER(0xff)
|
||||||
|
|
||||||
|
#pragma endregion Exceptions
|
||||||
|
|
||||||
|
void Init(int Core)
|
||||||
|
{
|
||||||
|
static int once = 0;
|
||||||
|
if (!once++)
|
||||||
|
{
|
||||||
|
// PIC
|
||||||
|
outb(0x20, 0x10 | 0x1);
|
||||||
|
outb(0x80, 0);
|
||||||
|
outb(0xA0, 0x10 | 0x10);
|
||||||
|
outb(0x80, 0);
|
||||||
|
|
||||||
|
outb(0x21, 0x20);
|
||||||
|
outb(0x80, 0);
|
||||||
|
outb(0xA1, 0x28);
|
||||||
|
outb(0x80, 0);
|
||||||
|
|
||||||
|
outb(0x21, 0x04);
|
||||||
|
outb(0x80, 0);
|
||||||
|
outb(0xA1, 0x02);
|
||||||
|
outb(0x80, 0);
|
||||||
|
|
||||||
|
outb(0x21, 1);
|
||||||
|
outb(0x80, 0);
|
||||||
|
outb(0xA1, 1);
|
||||||
|
outb(0x80, 0);
|
||||||
|
|
||||||
|
// Masking and disabling PIC
|
||||||
|
outb(0x21, 0xff);
|
||||||
|
outb(0x80, 0);
|
||||||
|
outb(0xA1, 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ISR */
|
||||||
|
|
||||||
|
SetEntry(0x0, InterruptHandler_0x0, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x1, InterruptHandler_0x1, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x2, InterruptHandler_0x2, FlagGate_32BIT_TRAP, 2, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x3, InterruptHandler_0x3, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x4, InterruptHandler_0x4, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x5, InterruptHandler_0x5, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x6, InterruptHandler_0x6, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x7, InterruptHandler_0x7, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x8, InterruptHandler_0x8, FlagGate_32BIT_TRAP, 3, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x9, InterruptHandler_0x9, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xa, InterruptHandler_0xa, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xb, InterruptHandler_0xb, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xc, InterruptHandler_0xc, FlagGate_32BIT_TRAP, 3, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xd, InterruptHandler_0xd, FlagGate_32BIT_TRAP, 3, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xe, InterruptHandler_0xe, FlagGate_32BIT_TRAP, 3, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xf, InterruptHandler_0xf, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x10, InterruptHandler_0x10, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x11, InterruptHandler_0x11, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x12, InterruptHandler_0x12, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x13, InterruptHandler_0x13, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x14, InterruptHandler_0x14, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x15, InterruptHandler_0x15, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x16, InterruptHandler_0x16, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x17, InterruptHandler_0x17, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x18, InterruptHandler_0x18, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x19, InterruptHandler_0x19, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x1a, InterruptHandler_0x1a, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x1b, InterruptHandler_0x1b, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x1c, InterruptHandler_0x1c, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x1d, InterruptHandler_0x1d, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x1e, InterruptHandler_0x1e, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x1f, InterruptHandler_0x1f, FlagGate_32BIT_TRAP, 1, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
|
||||||
|
/* IRQ */
|
||||||
|
|
||||||
|
SetEntry(0x20, InterruptHandler_0x20, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x21, InterruptHandler_0x21, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x22, InterruptHandler_0x22, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x23, InterruptHandler_0x23, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x24, InterruptHandler_0x24, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x25, InterruptHandler_0x25, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x26, InterruptHandler_0x26, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x27, InterruptHandler_0x27, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x28, InterruptHandler_0x28, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x29, InterruptHandler_0x29, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x2a, InterruptHandler_0x2a, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x2b, InterruptHandler_0x2b, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x2c, InterruptHandler_0x2c, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x2d, InterruptHandler_0x2d, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x2e, InterruptHandler_0x2e, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x2f, InterruptHandler_0x2f, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
|
||||||
|
/* Reserved by OS */
|
||||||
|
|
||||||
|
SetEntry(0x30, InterruptHandler_0x30, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x31, InterruptHandler_0x31, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x32, InterruptHandler_0x32, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x33, InterruptHandler_0x33, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x34, InterruptHandler_0x34, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x35, InterruptHandler_0x35, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x36, InterruptHandler_0x36, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x37, InterruptHandler_0x37, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x38, InterruptHandler_0x38, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x39, InterruptHandler_0x39, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x3a, InterruptHandler_0x3a, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x3b, InterruptHandler_0x3b, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x3c, InterruptHandler_0x3c, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x3d, InterruptHandler_0x3d, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
|
||||||
|
/* Free */
|
||||||
|
|
||||||
|
SetEntry(0x3e, InterruptHandler_0x3e, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x3f, InterruptHandler_0x3f, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x40, InterruptHandler_0x40, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x41, InterruptHandler_0x41, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x42, InterruptHandler_0x42, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x43, InterruptHandler_0x43, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x44, InterruptHandler_0x44, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x45, InterruptHandler_0x45, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x46, InterruptHandler_0x46, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x47, InterruptHandler_0x47, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x48, InterruptHandler_0x48, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x49, InterruptHandler_0x49, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x4a, InterruptHandler_0x4a, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x4b, InterruptHandler_0x4b, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x4c, InterruptHandler_0x4c, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x4d, InterruptHandler_0x4d, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x4e, InterruptHandler_0x4e, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x4f, InterruptHandler_0x4f, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x50, InterruptHandler_0x50, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x51, InterruptHandler_0x51, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x52, InterruptHandler_0x52, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x53, InterruptHandler_0x53, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x54, InterruptHandler_0x54, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x55, InterruptHandler_0x55, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x56, InterruptHandler_0x56, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x57, InterruptHandler_0x57, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x58, InterruptHandler_0x58, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x59, InterruptHandler_0x59, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x5a, InterruptHandler_0x5a, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x5b, InterruptHandler_0x5b, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x5c, InterruptHandler_0x5c, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x5d, InterruptHandler_0x5d, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x5e, InterruptHandler_0x5e, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x5f, InterruptHandler_0x5f, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x60, InterruptHandler_0x60, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x61, InterruptHandler_0x61, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x62, InterruptHandler_0x62, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x63, InterruptHandler_0x63, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x64, InterruptHandler_0x64, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x65, InterruptHandler_0x65, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x66, InterruptHandler_0x66, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x67, InterruptHandler_0x67, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x68, InterruptHandler_0x68, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x69, InterruptHandler_0x69, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x6a, InterruptHandler_0x6a, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x6b, InterruptHandler_0x6b, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x6c, InterruptHandler_0x6c, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x6d, InterruptHandler_0x6d, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x6e, InterruptHandler_0x6e, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x6f, InterruptHandler_0x6f, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x70, InterruptHandler_0x70, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x71, InterruptHandler_0x71, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x72, InterruptHandler_0x72, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x73, InterruptHandler_0x73, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x74, InterruptHandler_0x74, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x75, InterruptHandler_0x75, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x76, InterruptHandler_0x76, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x77, InterruptHandler_0x77, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x78, InterruptHandler_0x78, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x79, InterruptHandler_0x79, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x7a, InterruptHandler_0x7a, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x7b, InterruptHandler_0x7b, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x7c, InterruptHandler_0x7c, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x7d, InterruptHandler_0x7d, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x7e, InterruptHandler_0x7e, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x7f, InterruptHandler_0x7f, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x80, InterruptHandler_0x80, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x81, InterruptHandler_0x81, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x82, InterruptHandler_0x82, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x83, InterruptHandler_0x83, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x84, InterruptHandler_0x84, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x85, InterruptHandler_0x85, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x86, InterruptHandler_0x86, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x87, InterruptHandler_0x87, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x88, InterruptHandler_0x88, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x89, InterruptHandler_0x89, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x8a, InterruptHandler_0x8a, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x8b, InterruptHandler_0x8b, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x8c, InterruptHandler_0x8c, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x8d, InterruptHandler_0x8d, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x8e, InterruptHandler_0x8e, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x8f, InterruptHandler_0x8f, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x90, InterruptHandler_0x90, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x91, InterruptHandler_0x91, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x92, InterruptHandler_0x92, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x93, InterruptHandler_0x93, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x94, InterruptHandler_0x94, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x95, InterruptHandler_0x95, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x96, InterruptHandler_0x96, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x97, InterruptHandler_0x97, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x98, InterruptHandler_0x98, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x99, InterruptHandler_0x99, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x9a, InterruptHandler_0x9a, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x9b, InterruptHandler_0x9b, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x9c, InterruptHandler_0x9c, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x9d, InterruptHandler_0x9d, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x9e, InterruptHandler_0x9e, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0x9f, InterruptHandler_0x9f, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xa0, InterruptHandler_0xa0, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xa1, InterruptHandler_0xa1, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xa2, InterruptHandler_0xa2, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xa3, InterruptHandler_0xa3, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xa4, InterruptHandler_0xa4, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xa5, InterruptHandler_0xa5, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xa6, InterruptHandler_0xa6, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xa7, InterruptHandler_0xa7, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xa8, InterruptHandler_0xa8, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xa9, InterruptHandler_0xa9, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xaa, InterruptHandler_0xaa, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xab, InterruptHandler_0xab, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xac, InterruptHandler_0xac, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xad, InterruptHandler_0xad, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xae, InterruptHandler_0xae, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xaf, InterruptHandler_0xaf, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xb0, InterruptHandler_0xb0, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xb1, InterruptHandler_0xb1, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xb2, InterruptHandler_0xb2, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xb3, InterruptHandler_0xb3, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xb4, InterruptHandler_0xb4, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xb5, InterruptHandler_0xb5, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xb6, InterruptHandler_0xb6, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xb7, InterruptHandler_0xb7, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xb8, InterruptHandler_0xb8, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xb9, InterruptHandler_0xb9, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xba, InterruptHandler_0xba, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xbb, InterruptHandler_0xbb, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xbc, InterruptHandler_0xbc, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xbd, InterruptHandler_0xbd, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xbe, InterruptHandler_0xbe, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xbf, InterruptHandler_0xbf, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xc0, InterruptHandler_0xc0, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xc1, InterruptHandler_0xc1, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xc2, InterruptHandler_0xc2, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xc3, InterruptHandler_0xc3, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xc4, InterruptHandler_0xc4, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xc5, InterruptHandler_0xc5, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xc6, InterruptHandler_0xc6, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xc7, InterruptHandler_0xc7, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xc8, InterruptHandler_0xc8, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xc9, InterruptHandler_0xc9, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xca, InterruptHandler_0xca, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xcb, InterruptHandler_0xcb, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xcc, InterruptHandler_0xcc, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xcd, InterruptHandler_0xcd, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xce, InterruptHandler_0xce, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xcf, InterruptHandler_0xcf, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xd0, InterruptHandler_0xd0, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xd1, InterruptHandler_0xd1, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xd2, InterruptHandler_0xd2, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xd3, InterruptHandler_0xd3, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xd4, InterruptHandler_0xd4, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xd5, InterruptHandler_0xd5, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xd6, InterruptHandler_0xd6, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xd7, InterruptHandler_0xd7, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xd8, InterruptHandler_0xd8, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xd9, InterruptHandler_0xd9, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xda, InterruptHandler_0xda, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xdb, InterruptHandler_0xdb, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xdc, InterruptHandler_0xdc, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xdd, InterruptHandler_0xdd, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xde, InterruptHandler_0xde, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xdf, InterruptHandler_0xdf, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xe0, InterruptHandler_0xe0, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xe1, InterruptHandler_0xe1, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xe2, InterruptHandler_0xe2, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xe3, InterruptHandler_0xe3, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xe4, InterruptHandler_0xe4, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xe5, InterruptHandler_0xe5, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xe6, InterruptHandler_0xe6, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xe7, InterruptHandler_0xe7, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xe8, InterruptHandler_0xe8, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xe9, InterruptHandler_0xe9, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xea, InterruptHandler_0xea, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xeb, InterruptHandler_0xeb, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xec, InterruptHandler_0xec, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xed, InterruptHandler_0xed, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xee, InterruptHandler_0xee, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xef, InterruptHandler_0xef, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xf0, InterruptHandler_0xf0, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xf1, InterruptHandler_0xf1, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xf2, InterruptHandler_0xf2, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xf3, InterruptHandler_0xf3, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xf4, InterruptHandler_0xf4, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xf5, InterruptHandler_0xf5, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xf6, InterruptHandler_0xf6, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xf7, InterruptHandler_0xf7, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xf8, InterruptHandler_0xf8, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xf9, InterruptHandler_0xf9, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xfa, InterruptHandler_0xfa, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xfb, InterruptHandler_0xfb, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xfc, InterruptHandler_0xfc, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xfd, InterruptHandler_0xfd, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xfe, InterruptHandler_0xfe, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
SetEntry(0xff, InterruptHandler_0xff, FlagGate_32BIT_TRAP, 0, FlagGate_RING0, GDT_KERNEL_CODE);
|
||||||
|
CPU::x64::lidt(&idtd);
|
||||||
|
}
|
||||||
|
}
|
113
Kernel/Architecture/amd64/cpu/SMPTrampoline.asm
Normal file
113
Kernel/Architecture/amd64/cpu/SMPTrampoline.asm
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
[bits 16]
|
||||||
|
TRAMPOLINE_BASE equ 0x2000
|
||||||
|
|
||||||
|
extern StartCPU
|
||||||
|
global _trampoline_start
|
||||||
|
_trampoline_start:
|
||||||
|
cli
|
||||||
|
mov ax, 0x0
|
||||||
|
mov ds, ax
|
||||||
|
mov es, ax
|
||||||
|
mov fs, ax
|
||||||
|
mov gs, ax
|
||||||
|
mov ss, ax
|
||||||
|
o32 lgdt [ProtectedMode_gdtr - _trampoline_start + TRAMPOLINE_BASE]
|
||||||
|
mov eax, cr0
|
||||||
|
or al, 0x1
|
||||||
|
mov cr0, eax
|
||||||
|
jmp 0x8:(Trampoline32 - _trampoline_start + TRAMPOLINE_BASE)
|
||||||
|
|
||||||
|
[bits 32]
|
||||||
|
section .text
|
||||||
|
Trampoline32:
|
||||||
|
mov bx, 0x10
|
||||||
|
mov ds, bx
|
||||||
|
mov es, bx
|
||||||
|
mov ss, bx
|
||||||
|
mov eax, dword [0x500]
|
||||||
|
mov cr3, eax
|
||||||
|
mov eax, cr4
|
||||||
|
or eax, 1 << 5 ; Set the PAE-bit, which is the 6th bit (bit 5).
|
||||||
|
or eax, 1 << 7
|
||||||
|
mov cr4, eax
|
||||||
|
mov ecx, 0xc0000080
|
||||||
|
rdmsr
|
||||||
|
or eax,1 << 8 ; LME
|
||||||
|
wrmsr
|
||||||
|
mov eax, cr0
|
||||||
|
or eax, 1 << 31
|
||||||
|
mov cr0, eax
|
||||||
|
lgdt [LongMode_gdtr - _trampoline_start + TRAMPOLINE_BASE]
|
||||||
|
jmp 0x8:(Trampoline64 - _trampoline_start + TRAMPOLINE_BASE)
|
||||||
|
|
||||||
|
[bits 64]
|
||||||
|
Trampoline64:
|
||||||
|
mov ax, 0x10
|
||||||
|
mov ds, ax
|
||||||
|
mov es, ax
|
||||||
|
mov ss, ax
|
||||||
|
mov ax, 0x0
|
||||||
|
mov fs, ax
|
||||||
|
mov gs, ax
|
||||||
|
lgdt [0x580]
|
||||||
|
lidt [0x590]
|
||||||
|
mov rsp, [0x570]
|
||||||
|
mov rbp, 0x0 ; Terminate stack traces here.
|
||||||
|
; Reset RFLAGS.
|
||||||
|
push 0x0
|
||||||
|
popf
|
||||||
|
mov rax, qword vcode64
|
||||||
|
call vcode64
|
||||||
|
|
||||||
|
vcode64:
|
||||||
|
push rbp
|
||||||
|
; Set up SSE
|
||||||
|
mov rax, cr0
|
||||||
|
; btr eax, 2
|
||||||
|
; bts eax, 1
|
||||||
|
; mov cr0, rax
|
||||||
|
mov rax, cr4
|
||||||
|
bts eax, 9
|
||||||
|
bts eax, 10
|
||||||
|
mov cr4, rax
|
||||||
|
mov rax, qword TrampolineExit
|
||||||
|
call rax
|
||||||
|
|
||||||
|
align 16
|
||||||
|
LongMode_gdtr:
|
||||||
|
dw LongModeGDTEnd - LongModeGDTStart - 1
|
||||||
|
dq LongModeGDTStart - _trampoline_start + TRAMPOLINE_BASE
|
||||||
|
|
||||||
|
align 16
|
||||||
|
LongModeGDTStart:
|
||||||
|
dq 0 ; NULL segment
|
||||||
|
dq 0x00AF98000000FFFF ; Code segment
|
||||||
|
dq 0x00CF92000000FFFF ; Data segment
|
||||||
|
LongModeGDTEnd:
|
||||||
|
|
||||||
|
align 16
|
||||||
|
ProtectedMode_gdtr:
|
||||||
|
dw ProtectedModeGDTEnd - ProtectedModeGDTStart - 1
|
||||||
|
dd ProtectedModeGDTStart - _trampoline_start + TRAMPOLINE_BASE
|
||||||
|
|
||||||
|
align 16
|
||||||
|
ProtectedModeGDTStart:
|
||||||
|
dq 0 ; NULL segment
|
||||||
|
dq 0x00CF9A000000FFFF ; Code segment
|
||||||
|
dq 0x00CF92000000FFFF ; Data segment
|
||||||
|
ProtectedModeGDTEnd:
|
||||||
|
|
||||||
|
align 16
|
||||||
|
ProtectedMode_idtr:
|
||||||
|
dw 0
|
||||||
|
dd 0
|
||||||
|
dd 0
|
||||||
|
align 16
|
||||||
|
|
||||||
|
global _trampoline_end
|
||||||
|
_trampoline_end:
|
||||||
|
|
||||||
|
TrampolineExit:
|
||||||
|
call StartCPU
|
||||||
|
|
||||||
|
times 512 - ($-$$) db 0
|
129
Kernel/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp
Normal file
129
Kernel/Architecture/amd64/cpu/SymmetricMultiprocessing.cpp
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
#include <smp.hpp>
|
||||||
|
|
||||||
|
#include <interrupts.hpp>
|
||||||
|
#include <memory.hpp>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <cpu.hpp>
|
||||||
|
|
||||||
|
#include "../../../kernel.h"
|
||||||
|
#include "../acpi.hpp"
|
||||||
|
#include "apic.hpp"
|
||||||
|
|
||||||
|
extern "C" uint64_t _trampoline_start, _trampoline_end;
|
||||||
|
|
||||||
|
enum SMPTrampolineAddress
|
||||||
|
{
|
||||||
|
PAGE_TABLE = 0x500,
|
||||||
|
START_ADDR = 0x520,
|
||||||
|
STACK = 0x570,
|
||||||
|
GDT = 0x580,
|
||||||
|
IDT = 0x590,
|
||||||
|
CORE = 0x600,
|
||||||
|
TRAMPOLINE_START = 0x2000
|
||||||
|
};
|
||||||
|
|
||||||
|
volatile bool CPUEnabled = false;
|
||||||
|
|
||||||
|
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
||||||
|
static __attribute__((aligned(PAGE_SIZE))) CPUData CPUs[MAX_CPU] = {0};
|
||||||
|
|
||||||
|
CPUData *GetCPU(long id) { return &CPUs[id]; }
|
||||||
|
CPUData *GetCurrentCPU()
|
||||||
|
{
|
||||||
|
CPUData *data = (CPUData *)CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE);
|
||||||
|
|
||||||
|
if (data == nullptr && Interrupts::apic[0])
|
||||||
|
data = &CPUs[((APIC::APIC *)Interrupts::apic[0])->Read(APIC::APIC_ID) >> 24];
|
||||||
|
|
||||||
|
if (data == nullptr)
|
||||||
|
return nullptr; // The caller should handle this.
|
||||||
|
|
||||||
|
if (!data->IsActive)
|
||||||
|
{
|
||||||
|
error("CPU %d is not active!", data->ID);
|
||||||
|
if ((&CPUs[0])->IsActive)
|
||||||
|
return &CPUs[0];
|
||||||
|
else
|
||||||
|
return nullptr; // We are in trouble.
|
||||||
|
}
|
||||||
|
assert(data->Checksum == CPU_DATA_CHECKSUM); // This should never happen.
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void StartCPU()
|
||||||
|
{
|
||||||
|
CPU::Interrupts(CPU::Disable);
|
||||||
|
CPU::InitializeFeatures();
|
||||||
|
uint64_t CoreID = (int)*reinterpret_cast<int *>(CORE);
|
||||||
|
// Initialize GDT and IDT
|
||||||
|
Interrupts::Initialize(CoreID);
|
||||||
|
Interrupts::Enable(CoreID);
|
||||||
|
Interrupts::InitializeTimer(CoreID);
|
||||||
|
|
||||||
|
CPU::Interrupts(CPU::Enable);
|
||||||
|
KPrint("\e058C19CPU \e8888FF%d \e058C19is online", CoreID);
|
||||||
|
CPUEnabled = true;
|
||||||
|
CPU::Halt(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace SMP
|
||||||
|
{
|
||||||
|
int CPUCores = 0;
|
||||||
|
|
||||||
|
void Initialize(void *madt)
|
||||||
|
{
|
||||||
|
if (strcmp(CPU::Hypervisor(), x86_CPUID_VENDOR_VIRTUALBOX) == 0)
|
||||||
|
{
|
||||||
|
KPrint("VirtualBox detected, disabling SMP");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Cores = ((ACPI::MADT *)madt)->CPUCores + 1;
|
||||||
|
|
||||||
|
if (Config.Cores > ((ACPI::MADT *)madt)->CPUCores + 1)
|
||||||
|
KPrint("More cores requested than available. Using %d cores", ((ACPI::MADT *)madt)->CPUCores + 1);
|
||||||
|
else if (Config.Cores != 0)
|
||||||
|
Cores = Config.Cores;
|
||||||
|
|
||||||
|
CPUCores = Cores;
|
||||||
|
|
||||||
|
for (int i = 0; i < Cores; i++)
|
||||||
|
{
|
||||||
|
debug("Initializing CPU %d", i);
|
||||||
|
if ((((APIC::APIC *)Interrupts::apic[0])->Read(APIC::APIC_ID) >> 24) != ((ACPI::MADT *)madt)->lapic[i]->ACPIProcessorId)
|
||||||
|
{
|
||||||
|
((APIC::APIC *)Interrupts::apic[0])->Write(APIC::APIC_ICRHI, (((ACPI::MADT *)madt)->lapic[i]->APICId << 24));
|
||||||
|
((APIC::APIC *)Interrupts::apic[0])->Write(APIC::APIC_ICRLO, 0x500);
|
||||||
|
|
||||||
|
Memory::Virtual().Map(0x0, 0x0, Memory::PTFlag::RW | Memory::PTFlag::US);
|
||||||
|
|
||||||
|
uint64_t TrampolineLength = (uintptr_t)&_trampoline_end - (uintptr_t)&_trampoline_start;
|
||||||
|
for (uint64_t i = 0; i < (TrampolineLength / PAGE_SIZE) + 2; i++)
|
||||||
|
Memory::Virtual().Map((void *)(TRAMPOLINE_START + (i * PAGE_SIZE)), (void *)(TRAMPOLINE_START + (i * PAGE_SIZE)), Memory::PTFlag::RW | Memory::PTFlag::US);
|
||||||
|
|
||||||
|
memcpy((void *)TRAMPOLINE_START, &_trampoline_start, TrampolineLength);
|
||||||
|
|
||||||
|
POKE(volatile uint64_t, PAGE_TABLE) = CPU::x64::readcr3().raw;
|
||||||
|
POKE(volatile uint64_t, STACK) = (uint64_t)KernelAllocator.RequestPages(TO_PAGES(STACK_SIZE)) + STACK_SIZE;
|
||||||
|
POKE(volatile uint64_t, CORE) = i;
|
||||||
|
|
||||||
|
asmv("sgdt [0x580]\n"
|
||||||
|
"sidt [0x590]\n");
|
||||||
|
|
||||||
|
POKE(volatile uint64_t, START_ADDR) = (uintptr_t)&StartCPU;
|
||||||
|
|
||||||
|
((APIC::APIC *)Interrupts::apic[0])->SendInitIPI(((ACPI::MADT *)madt)->lapic[i]->APICId);
|
||||||
|
((APIC::APIC *)Interrupts::apic[0])->SendStartupIPI(((ACPI::MADT *)madt)->lapic[i]->APICId, TRAMPOLINE_START);
|
||||||
|
|
||||||
|
while (!CPUEnabled)
|
||||||
|
CPU::Pause();
|
||||||
|
|
||||||
|
trace("CPU %d loaded.", ((ACPI::MADT *)madt)->lapic[i]->APICId);
|
||||||
|
KernelAllocator.FreePages((void *)*reinterpret_cast<long *>(STACK), TO_PAGES(STACK_SIZE));
|
||||||
|
CPUEnabled = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
KPrint("\e058C19CPU \e8888FF%d \e058C19is the BSP", ((ACPI::MADT *)madt)->lapic[i]->APICId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
337
Kernel/Architecture/amd64/cpu/apic.hpp
Normal file
337
Kernel/Architecture/amd64/cpu/apic.hpp
Normal file
@ -0,0 +1,337 @@
|
|||||||
|
#ifndef __FENNIX_KERNEL_APIC_H__
|
||||||
|
#define __FENNIX_KERNEL_APIC_H__
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
#include <interrupts.hpp>
|
||||||
|
#include <cpu.hpp>
|
||||||
|
|
||||||
|
namespace APIC
|
||||||
|
{
|
||||||
|
enum APICRegisters
|
||||||
|
{
|
||||||
|
// source from: https://github.com/pdoane/osdev/blob/master/intr/local_apic.c
|
||||||
|
APIC_ID = 0x20, // Local APIC ID
|
||||||
|
APIC_VER = 0x30, // Local APIC Version
|
||||||
|
APIC_TPR = 0x80, // Task Priority
|
||||||
|
APIC_APR = 0x90, // Arbitration Priority
|
||||||
|
APIC_PPR = 0xA0, // Processor Priority
|
||||||
|
APIC_EOI = 0xB0, // EOI
|
||||||
|
APIC_RRD = 0xC0, // Remote Read
|
||||||
|
APIC_LDR = 0xD0, // Logical Destination
|
||||||
|
APIC_DFR = 0xE0, // Destination Format
|
||||||
|
APIC_SVR = 0xF0, // Spurious Interrupt Vector
|
||||||
|
APIC_ISR = 0x100, // In-Service (8 registers)
|
||||||
|
APIC_TMR = 0x180, // Trigger Mode (8 registers)
|
||||||
|
APIC_IRR = 0x200, // Interrupt Request (8 registers)
|
||||||
|
APIC_ESR = 0x280, // Error Status
|
||||||
|
APIC_ICRLO = 0x300, // Interrupt Command
|
||||||
|
APIC_ICRHI = 0x310, // Interrupt Command [63:32]
|
||||||
|
APIC_TIMER = 0x320, // LVT Timer
|
||||||
|
APIC_THERMAL = 0x330, // LVT Thermal Sensor
|
||||||
|
APIC_PERF = 0x340, // LVT Performance Counter
|
||||||
|
APIC_LINT0 = 0x350, // LVT LINT0
|
||||||
|
APIC_LINT1 = 0x360, // LVT LINT1
|
||||||
|
APIC_ERROR = 0x370, // LVT Error
|
||||||
|
APIC_TICR = 0x380, // Initial Count (for Timer)
|
||||||
|
APIC_TCCR = 0x390, // Current Count (for Timer)
|
||||||
|
APIC_TDCR = 0x3E0, // Divide Configuration (for Timer)
|
||||||
|
};
|
||||||
|
|
||||||
|
enum IOAPICRegisters
|
||||||
|
{
|
||||||
|
GetIOAPICVersion = 0x1
|
||||||
|
};
|
||||||
|
|
||||||
|
enum IOAPICFlags
|
||||||
|
{
|
||||||
|
ActiveHighLow = 2,
|
||||||
|
EdgeLevel = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
enum APICDeliveryMode
|
||||||
|
{
|
||||||
|
Fixed = 0b000,
|
||||||
|
LowestPriority = 0b001, /* Reserved */
|
||||||
|
SMI = 0b010,
|
||||||
|
APIC_DELIVERY_MODE_RESERVED0 = 0b011, /* Reserved */
|
||||||
|
NMI = 0b100,
|
||||||
|
INIT = 0b101,
|
||||||
|
Startup = 0b110,
|
||||||
|
ExtINT = 0b111 /* Reserved */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum APICDestinationMode
|
||||||
|
{
|
||||||
|
Physical = 0b0,
|
||||||
|
Logical = 0b1
|
||||||
|
};
|
||||||
|
|
||||||
|
enum APICDeliveryStatus
|
||||||
|
{
|
||||||
|
Idle = 0b0,
|
||||||
|
SendPending = 0b1
|
||||||
|
};
|
||||||
|
|
||||||
|
enum APICLevel
|
||||||
|
{
|
||||||
|
DeAssert = 0b0,
|
||||||
|
Assert = 0b1
|
||||||
|
};
|
||||||
|
|
||||||
|
enum APICTriggerMode
|
||||||
|
{
|
||||||
|
Edge = 0b0,
|
||||||
|
Level = 0b1
|
||||||
|
};
|
||||||
|
|
||||||
|
enum APICDestinationShorthand
|
||||||
|
{
|
||||||
|
NoShorthand = 0b00,
|
||||||
|
Self = 0b01,
|
||||||
|
AllIncludingSelf = 0b10,
|
||||||
|
AllExcludingSelf = 0b11
|
||||||
|
};
|
||||||
|
|
||||||
|
enum LVTTimerDivide
|
||||||
|
{
|
||||||
|
DivideBy2 = 0b000,
|
||||||
|
DivideBy4 = 0b001,
|
||||||
|
DivideBy8 = 0b010,
|
||||||
|
DivideBy16 = 0b011,
|
||||||
|
DivideBy32 = 0b100,
|
||||||
|
DivideBy64 = 0b101,
|
||||||
|
DivideBy128 = 0b110,
|
||||||
|
DivideBy1 = 0b111
|
||||||
|
};
|
||||||
|
|
||||||
|
enum LVTTimerMask
|
||||||
|
{
|
||||||
|
Unmasked = 0b0,
|
||||||
|
Masked = 0b1
|
||||||
|
};
|
||||||
|
|
||||||
|
enum LVTTimerMode
|
||||||
|
{
|
||||||
|
OneShot = 0b00,
|
||||||
|
Periodic = 0b01,
|
||||||
|
TSCDeadline = 0b10
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/** @brief Interrupt Vector */
|
||||||
|
uint64_t Vector : 8;
|
||||||
|
/** @brief Reserved */
|
||||||
|
uint64_t Reserved0 : 4;
|
||||||
|
/**
|
||||||
|
* @brief Delivery Status
|
||||||
|
*
|
||||||
|
* 0: Idle
|
||||||
|
* 1: Send Pending
|
||||||
|
*/
|
||||||
|
uint64_t DeliveryStatus : 1;
|
||||||
|
/** @brief Reserved */
|
||||||
|
uint64_t Reserved1 : 3;
|
||||||
|
/**
|
||||||
|
* @brief Mask
|
||||||
|
*
|
||||||
|
* 0: Not masked
|
||||||
|
* 1: Masked
|
||||||
|
*/
|
||||||
|
uint64_t Mask : 1;
|
||||||
|
/** @brief Timer Mode
|
||||||
|
*
|
||||||
|
* 0: One-shot
|
||||||
|
* 1: Periodic
|
||||||
|
* 2: TSC-Deadline
|
||||||
|
*/
|
||||||
|
uint64_t TimerMode : 1;
|
||||||
|
/** @brief Reserved */
|
||||||
|
uint64_t Reserved2 : 14;
|
||||||
|
};
|
||||||
|
uint64_t raw;
|
||||||
|
} __attribute__((packed)) LVTTimer;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/** @brief Spurious Vector */
|
||||||
|
uint64_t Vector : 8;
|
||||||
|
/** @brief Enable or disable APIC software */
|
||||||
|
uint64_t Software : 1;
|
||||||
|
/** @brief Focus Processor Checking */
|
||||||
|
uint64_t FocusProcessorChecking : 1;
|
||||||
|
/** @brief Reserved */
|
||||||
|
uint64_t Reserved : 2;
|
||||||
|
/** @brief Disable EOI Broadcast */
|
||||||
|
uint64_t DisableEOIBroadcast : 1;
|
||||||
|
/** @brief Reserved */
|
||||||
|
uint64_t Reserved1 : 19;
|
||||||
|
};
|
||||||
|
uint64_t raw;
|
||||||
|
} __attribute__((packed)) Spurious;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/** @brief Interrupt Vector */
|
||||||
|
uint64_t Vector : 8;
|
||||||
|
/** @brief Delivery Mode */
|
||||||
|
uint64_t DeliveryMode : 3;
|
||||||
|
/** @brief Destination Mode
|
||||||
|
*
|
||||||
|
* 0: Physical
|
||||||
|
* 1: Logical
|
||||||
|
*/
|
||||||
|
uint64_t DestinationMode : 1;
|
||||||
|
/** @brief Delivery Status
|
||||||
|
*
|
||||||
|
* @note Reserved when in x2APIC mode
|
||||||
|
*/
|
||||||
|
uint64_t DeliveryStatus : 1;
|
||||||
|
/** @brief Reserved */
|
||||||
|
uint64_t Reserved0 : 1;
|
||||||
|
/** @brief Level
|
||||||
|
*
|
||||||
|
* 0: Deassert
|
||||||
|
* 1: Assert
|
||||||
|
*/
|
||||||
|
uint64_t Level : 1;
|
||||||
|
/** @brief Trigger Mode
|
||||||
|
*
|
||||||
|
* 0: Edge
|
||||||
|
* 1: Level
|
||||||
|
*/
|
||||||
|
uint64_t TriggerMode : 1;
|
||||||
|
/** @brief Reserved */
|
||||||
|
uint64_t Reserved1 : 2;
|
||||||
|
/** @brief Destination Shorthand
|
||||||
|
*
|
||||||
|
* 0: No shorthand
|
||||||
|
* 1: Self
|
||||||
|
* 2: All including self
|
||||||
|
* 3: All excluding self
|
||||||
|
*/
|
||||||
|
uint64_t DestinationShorthand : 2;
|
||||||
|
/** @brief Reserved */
|
||||||
|
uint64_t Reserved2 : 12;
|
||||||
|
};
|
||||||
|
uint64_t raw;
|
||||||
|
} __attribute__((packed)) InterruptCommandRegisterLow;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/** @brief Reserved */
|
||||||
|
uint64_t Reserved0 : 24;
|
||||||
|
/** @brief Destination */
|
||||||
|
uint64_t Destination : 8;
|
||||||
|
};
|
||||||
|
uint64_t raw;
|
||||||
|
} __attribute__((packed)) InterruptCommandRegisterHigh;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/** @brief Interrupt Vector */
|
||||||
|
uint64_t Vector : 8;
|
||||||
|
/** @brief Delivery Mode */
|
||||||
|
uint64_t DeliveryMode : 3;
|
||||||
|
/** @brief Destination Mode
|
||||||
|
*
|
||||||
|
* 0: Physical
|
||||||
|
* 1: Logical
|
||||||
|
*/
|
||||||
|
uint64_t DestinationMode : 1;
|
||||||
|
/** @brief Delivery Status */
|
||||||
|
uint64_t DeliveryStatus : 1;
|
||||||
|
/** @brief Interrupt Input Pin Polarity
|
||||||
|
*
|
||||||
|
* 0: Active High
|
||||||
|
* 1: Active Low
|
||||||
|
*/
|
||||||
|
uint64_t Polarity : 1;
|
||||||
|
/** @brief Remote IRR */
|
||||||
|
uint64_t RemoteIRR : 1;
|
||||||
|
/** @brief Trigger Mode
|
||||||
|
*
|
||||||
|
* 0: Edge
|
||||||
|
* 1: Level
|
||||||
|
*/
|
||||||
|
uint64_t TriggerMode : 1;
|
||||||
|
/** @brief Mask */
|
||||||
|
uint64_t Mask : 1;
|
||||||
|
/** @brief Reserved */
|
||||||
|
uint64_t Reserved0 : 15;
|
||||||
|
/** @brief Reserved */
|
||||||
|
uint64_t Reserved1 : 24;
|
||||||
|
/** @brief Destination */
|
||||||
|
uint64_t DestinationID : 8;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint64_t Low;
|
||||||
|
uint64_t High;
|
||||||
|
} split;
|
||||||
|
uint64_t raw;
|
||||||
|
} __attribute__((packed)) IOAPICRedirectEntry;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint64_t Version : 8;
|
||||||
|
uint64_t Reserved : 8;
|
||||||
|
uint64_t MaximumRedirectionEntry : 8;
|
||||||
|
uint64_t Reserved2 : 8;
|
||||||
|
};
|
||||||
|
uint64_t raw;
|
||||||
|
} __attribute__((packed)) IOAPICVersion;
|
||||||
|
|
||||||
|
class APIC
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
bool x2APICSupported = false;
|
||||||
|
uint64_t APICBaseAddress = 0;
|
||||||
|
|
||||||
|
public:
|
||||||
|
uint32_t Read(uint32_t Register);
|
||||||
|
void Write(uint32_t Register, uint32_t Value);
|
||||||
|
void IOWrite(uint64_t Base, uint32_t Register, uint32_t Value);
|
||||||
|
uint32_t IORead(uint64_t Base, uint32_t Register);
|
||||||
|
void EOI();
|
||||||
|
void RedirectIRQs(int CPU = 0);
|
||||||
|
void WaitForIPI();
|
||||||
|
void IPI(uint8_t CPU, InterruptCommandRegisterLow icr);
|
||||||
|
void SendInitIPI(uint8_t CPU);
|
||||||
|
void SendStartupIPI(uint8_t CPU, uint64_t StartupAddress);
|
||||||
|
uint32_t IOGetMaxRedirect(uint32_t APICID);
|
||||||
|
void RawRedirectIRQ(uint8_t Vector, uint32_t GSI, uint16_t Flags, int CPU, int Status);
|
||||||
|
void RedirectIRQ(int CPU, uint8_t IRQ, int Status);
|
||||||
|
APIC(int Core);
|
||||||
|
~APIC();
|
||||||
|
};
|
||||||
|
|
||||||
|
class Timer : public Interrupts::Handler
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
APIC *lapic;
|
||||||
|
uint64_t Ticks = 0;
|
||||||
|
void OnInterruptReceived(CPU::x64::TrapFrame *Frame);
|
||||||
|
|
||||||
|
public:
|
||||||
|
uint64_t GetTicks() { return Ticks; }
|
||||||
|
void OneShot(uint32_t Vector, uint64_t Miliseconds);
|
||||||
|
Timer(APIC *apic);
|
||||||
|
~Timer();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !__FENNIX_KERNEL_APIC_H__
|
11
Kernel/Architecture/amd64/cpu/fxsr.asm
Normal file
11
Kernel/Architecture/amd64/cpu/fxsr.asm
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[bits 64]
|
||||||
|
|
||||||
|
[global _amd64_fxsave]
|
||||||
|
_amd64_fxsave:
|
||||||
|
fxsave [rdi]
|
||||||
|
ret
|
||||||
|
|
||||||
|
[global _amd64_fxrstor]
|
||||||
|
_amd64_fxrstor:
|
||||||
|
fxrstor [rdi]
|
||||||
|
ret
|
144
Kernel/Architecture/amd64/cpu/gdt.hpp
Normal file
144
Kernel/Architecture/amd64/cpu/gdt.hpp
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
#ifndef __FENNIX_KERNEL_GDT_H__
|
||||||
|
#define __FENNIX_KERNEL_GDT_H__
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
namespace GlobalDescriptorTable
|
||||||
|
{
|
||||||
|
/** @brief The GDT Access Table
|
||||||
|
* @details For more information, see https://wiki.osdev.org/Global_Descriptor_Table
|
||||||
|
*/
|
||||||
|
union GlobalDescriptorTableAccess
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/** @brief Access bit.
|
||||||
|
* @note The CPU sets this bit to 1 when the segment is accessed.
|
||||||
|
*/
|
||||||
|
uint8_t A : 1;
|
||||||
|
|
||||||
|
/** @brief Readable bit for code segments, writable bit for data segments.
|
||||||
|
* @details For code segments, this bit must be 1 for the segment to be readable.
|
||||||
|
* @details For data segments, this bit must be 1 for the segment to be writable.
|
||||||
|
*/
|
||||||
|
uint8_t RW : 1;
|
||||||
|
|
||||||
|
/** @brief Direction bit for data segments, conforming bit for code segments.
|
||||||
|
* @details For data segments, this bit must be 1 for the segment to grow up (higher addresses).
|
||||||
|
* @details For code segments, this bit must be 1 for code in the segment to be able to be executed from an equal or lower privilege level.
|
||||||
|
*/
|
||||||
|
uint8_t DC : 1;
|
||||||
|
|
||||||
|
/** @brief Executable bit.
|
||||||
|
* @details This bit must be 1 for code-segment descriptors.
|
||||||
|
* @details This bit must be 0 for data-segment and system descriptors.
|
||||||
|
*/
|
||||||
|
uint8_t E : 1;
|
||||||
|
|
||||||
|
/** @brief Descriptor type.
|
||||||
|
* @details This bit must be 0 for system descriptors.
|
||||||
|
* @details This bit must be 1 for code or data segment descriptor.
|
||||||
|
*/
|
||||||
|
uint8_t S : 1;
|
||||||
|
|
||||||
|
/** @brief Descriptor privilege level.
|
||||||
|
* @details This field determines the privilege level of the segment.
|
||||||
|
* @details 0 = kernel mode, 3 = user mode.
|
||||||
|
*/
|
||||||
|
uint8_t DPL : 2;
|
||||||
|
|
||||||
|
/** @brief Present bit.
|
||||||
|
* @details This bit must be 1 for all valid descriptors.
|
||||||
|
*/
|
||||||
|
uint8_t P : 1;
|
||||||
|
} __attribute__((packed));
|
||||||
|
uint8_t Raw;
|
||||||
|
};
|
||||||
|
|
||||||
|
union GlobalDescriptorTableFlags
|
||||||
|
{
|
||||||
|
// TODO: Add more flags.
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/** @brief Unknown. */
|
||||||
|
uint8_t Unknown : 5;
|
||||||
|
|
||||||
|
/** @brief Long mode.
|
||||||
|
* @details If the long mode bit is clear, the segment is in 32-bit protected mode.
|
||||||
|
* @details If the long mode bit is set, the segment is in 64-bit long mode.
|
||||||
|
*/
|
||||||
|
uint8_t L : 1;
|
||||||
|
} __attribute__((packed));
|
||||||
|
uint8_t Raw;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct _TaskStateSegmentEntry
|
||||||
|
{
|
||||||
|
/* LOW */
|
||||||
|
uint16_t Length;
|
||||||
|
uint16_t BaseLow;
|
||||||
|
uint8_t BaseMiddle;
|
||||||
|
GlobalDescriptorTableAccess Flags;
|
||||||
|
uint8_t Granularity;
|
||||||
|
uint8_t BaseHigh;
|
||||||
|
/* HIGH */
|
||||||
|
uint32_t BaseUpper;
|
||||||
|
uint32_t Reserved;
|
||||||
|
} __attribute__((packed)) TaskStateSegmentEntry;
|
||||||
|
|
||||||
|
typedef struct _TaskStateSegment
|
||||||
|
{
|
||||||
|
uint32_t Reserved0 __attribute__((aligned(16)));
|
||||||
|
uint64_t StackPointer[3];
|
||||||
|
uint64_t Reserved1;
|
||||||
|
uint64_t InterruptStackTable[7];
|
||||||
|
uint16_t Reserved2;
|
||||||
|
uint16_t IOMapBaseAddressOffset;
|
||||||
|
} __attribute__((packed)) TaskStateSegment;
|
||||||
|
|
||||||
|
typedef struct _GlobalDescriptorTableEntry
|
||||||
|
{
|
||||||
|
/** @brief Length */
|
||||||
|
uint16_t Length;
|
||||||
|
/** @brief Low Base */
|
||||||
|
uint16_t BaseLow;
|
||||||
|
/** @brief Middle Base */
|
||||||
|
uint8_t BaseMiddle;
|
||||||
|
/** @brief Access */
|
||||||
|
GlobalDescriptorTableAccess Access;
|
||||||
|
/** @brief Flags */
|
||||||
|
GlobalDescriptorTableFlags Flags;
|
||||||
|
/** @brief High Base */
|
||||||
|
uint8_t BaseHigh;
|
||||||
|
} __attribute__((packed)) GlobalDescriptorTableEntry;
|
||||||
|
|
||||||
|
typedef struct _GlobalDescriptorTableEntries
|
||||||
|
{
|
||||||
|
GlobalDescriptorTableEntry Null;
|
||||||
|
GlobalDescriptorTableEntry Code;
|
||||||
|
GlobalDescriptorTableEntry Data;
|
||||||
|
GlobalDescriptorTableEntry UserData;
|
||||||
|
GlobalDescriptorTableEntry UserCode;
|
||||||
|
TaskStateSegmentEntry TaskStateSegment;
|
||||||
|
} __attribute__((packed)) GlobalDescriptorTableEntries;
|
||||||
|
|
||||||
|
typedef struct _GlobalDescriptorTableDescriptor
|
||||||
|
{
|
||||||
|
/** @brief GDT entries length */
|
||||||
|
uint16_t Length;
|
||||||
|
/** @brief GDT entries address */
|
||||||
|
GlobalDescriptorTableEntries *Entries;
|
||||||
|
} __attribute__((packed)) GlobalDescriptorTableDescriptor;
|
||||||
|
|
||||||
|
extern void *CPUStackPointer[];
|
||||||
|
void Init(int Core);
|
||||||
|
void SetKernelStack(void *Stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GDT_KERNEL_CODE offsetof(GlobalDescriptorTable::GlobalDescriptorTableEntries, Code)
|
||||||
|
#define GDT_KERNEL_DATA offsetof(GlobalDescriptorTable::GlobalDescriptorTableEntries, Data)
|
||||||
|
#define GDT_USER_CODE (offsetof(GlobalDescriptorTable::GlobalDescriptorTableEntries, UserCode) | 3)
|
||||||
|
#define GDT_USER_DATA (offsetof(GlobalDescriptorTable::GlobalDescriptorTableEntries, UserData) | 3)
|
||||||
|
#define GDT_TSS (offsetof(GlobalDescriptorTable::GlobalDescriptorTableEntries, TaskStateSegment) | 3)
|
||||||
|
|
||||||
|
#endif // !__FENNIX_KERNEL_GDT_H__
|
46
Kernel/Architecture/amd64/cpu/idt.hpp
Normal file
46
Kernel/Architecture/amd64/cpu/idt.hpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#ifndef __FENNIX_KERNEL_IDT_H__
|
||||||
|
#define __FENNIX_KERNEL_IDT_H__
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
namespace InterruptDescriptorTable
|
||||||
|
{
|
||||||
|
typedef enum _InterruptDescriptorTableFlags
|
||||||
|
{
|
||||||
|
FlagGate_TASK = 0b101,
|
||||||
|
FlagGate_16BIT_INT = 0b110,
|
||||||
|
FlagGate_16BIT_TRAP = 0b111,
|
||||||
|
FlagGate_32BIT_INT = 0b1110,
|
||||||
|
FlagGate_32BIT_TRAP = 0b1111,
|
||||||
|
FlagGate_RING0 = 0b0,
|
||||||
|
FlagGate_RING1 = 0b1,
|
||||||
|
FlagGate_RING2 = 0b10,
|
||||||
|
FlagGate_RING3 = 0b11,
|
||||||
|
FlagGate_PRESENT = 0b1, // Not sure if this is correct.
|
||||||
|
} InterruptDescriptorTableFlags;
|
||||||
|
|
||||||
|
typedef struct _InterruptDescriptorTableEntry
|
||||||
|
{
|
||||||
|
uint64_t BaseLow : 16;
|
||||||
|
uint64_t SegmentSelector : 16;
|
||||||
|
uint64_t InterruptStackTable : 3;
|
||||||
|
uint64_t Reserved1 : 5;
|
||||||
|
InterruptDescriptorTableFlags Flags : 4;
|
||||||
|
uint64_t Reserved2 : 1;
|
||||||
|
uint64_t Ring : 2;
|
||||||
|
uint64_t Present : 1;
|
||||||
|
uint64_t BaseHigh : 48;
|
||||||
|
uint64_t Reserved3 : 32;
|
||||||
|
} __attribute__((packed)) InterruptDescriptorTableEntry;
|
||||||
|
|
||||||
|
typedef struct _InterruptDescriptorTableDescriptor
|
||||||
|
{
|
||||||
|
uint16_t Length;
|
||||||
|
InterruptDescriptorTableEntry *Entries;
|
||||||
|
} __attribute__((packed)) InterruptDescriptorTableDescriptor;
|
||||||
|
|
||||||
|
void SetEntry(uint8_t Index, void (*Base)(), InterruptDescriptorTableFlags Attribute, uint8_t InterruptStackTable, InterruptDescriptorTableFlags Ring, uint16_t SegmentSelector);
|
||||||
|
void Init(int Core);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !__FENNIX_KERNEL_IDT_H__
|
63
Kernel/Architecture/amd64/linker.ld
Normal file
63
Kernel/Architecture/amd64/linker.ld
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
OUTPUT_FORMAT(elf64-x86-64)
|
||||||
|
OUTPUT_ARCH(i386:x86-64)
|
||||||
|
|
||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = 0xffffffff80000000;
|
||||||
|
|
||||||
|
_kernel_start = .;
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
*(.text .text.*)
|
||||||
|
}
|
||||||
|
_kernel_text_end = ALIGN(CONSTANT(MAXPAGESIZE));
|
||||||
|
. += CONSTANT(MAXPAGESIZE);
|
||||||
|
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
*(.data .data.*)
|
||||||
|
}
|
||||||
|
_kernel_data_end = ALIGN(CONSTANT(MAXPAGESIZE));
|
||||||
|
. += CONSTANT(MAXPAGESIZE);
|
||||||
|
|
||||||
|
.rodata :
|
||||||
|
{
|
||||||
|
*(.rodata .rodata.*)
|
||||||
|
}
|
||||||
|
_kernel_rodata_end = ALIGN(CONSTANT(MAXPAGESIZE));
|
||||||
|
. += CONSTANT(MAXPAGESIZE);
|
||||||
|
|
||||||
|
.init_array :
|
||||||
|
{
|
||||||
|
PROVIDE_HIDDEN(__init_array_start = .);
|
||||||
|
KEEP(*(.init_array .ctors))
|
||||||
|
KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
|
||||||
|
PROVIDE_HIDDEN (__init_array_end = .);
|
||||||
|
}
|
||||||
|
|
||||||
|
.fini_array :
|
||||||
|
{
|
||||||
|
PROVIDE_HIDDEN(__fini_array_start = .);
|
||||||
|
KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
|
||||||
|
KEEP(*(.fini_array .dtors))
|
||||||
|
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||||
|
}
|
||||||
|
. += CONSTANT(MAXPAGESIZE);
|
||||||
|
|
||||||
|
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
*(COMMON)
|
||||||
|
*(.bss .bss.*)
|
||||||
|
}
|
||||||
|
. += CONSTANT(MAXPAGESIZE);
|
||||||
|
_kernel_end = ALIGN(CONSTANT(MAXPAGESIZE));
|
||||||
|
|
||||||
|
/DISCARD/ :
|
||||||
|
{
|
||||||
|
*(.comment*)
|
||||||
|
*(.note*)
|
||||||
|
}
|
||||||
|
}
|
15
Kernel/Architecture/amd64/runtime/crt0.c
Normal file
15
Kernel/Architecture/amd64/runtime/crt0.c
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// #include <types.h>
|
||||||
|
|
||||||
|
// #include <debug.h>
|
||||||
|
|
||||||
|
// int Entry(void *Info);
|
||||||
|
|
||||||
|
// void _start(void *Raw)
|
||||||
|
// {
|
||||||
|
// error("Todo");
|
||||||
|
// while (1)
|
||||||
|
// asmv("hlt");
|
||||||
|
// Entry(NULL);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// C stuff
|
15
Kernel/Architecture/amd64/runtime/crt1.c
Normal file
15
Kernel/Architecture/amd64/runtime/crt1.c
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
int Entry(void *Info);
|
||||||
|
|
||||||
|
void _start(void *Raw)
|
||||||
|
{
|
||||||
|
error("ERROR! INVALID BOOT PROTOCOL!");
|
||||||
|
while (1)
|
||||||
|
asmv("hlt");
|
||||||
|
Entry(NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// C stuff
|
1
Kernel/Architecture/amd64/runtime/crtbegin.c
Normal file
1
Kernel/Architecture/amd64/runtime/crtbegin.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
// C++ constructor/destructor stuff
|
1
Kernel/Architecture/amd64/runtime/crtend.c
Normal file
1
Kernel/Architecture/amd64/runtime/crtend.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
// C++ constructor/destructor stuff
|
13
Kernel/Architecture/amd64/runtime/crti.S
Normal file
13
Kernel/Architecture/amd64/runtime/crti.S
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.section .init
|
||||||
|
.global _init
|
||||||
|
.type _init, @function
|
||||||
|
_init:
|
||||||
|
push %rbp
|
||||||
|
movq %rsp, %rbp
|
||||||
|
|
||||||
|
.section .fini
|
||||||
|
.global _fini
|
||||||
|
.type _fini, @function
|
||||||
|
_fini:
|
||||||
|
push %rbp
|
||||||
|
movq %rsp, %rbp
|
7
Kernel/Architecture/amd64/runtime/crtn.S
Normal file
7
Kernel/Architecture/amd64/runtime/crtn.S
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
.section .init
|
||||||
|
popq %rbp
|
||||||
|
ret
|
||||||
|
|
||||||
|
.section .fini
|
||||||
|
popq %rbp
|
||||||
|
ret
|
21
Kernel/Architecture/amd64/rust-target.json
Normal file
21
Kernel/Architecture/amd64/rust-target.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"llvm-target": "x86_64-unknown-none",
|
||||||
|
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
|
||||||
|
"cpu": "x86-64",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"features": "-mmx,-sse,+soft-float",
|
||||||
|
"target-endian": "little",
|
||||||
|
"target-pointer-width": "64",
|
||||||
|
"target-c-int-width": "32",
|
||||||
|
"os": "none",
|
||||||
|
"linker-flavor": "ld",
|
||||||
|
"pre-link-args": {
|
||||||
|
"ld": [
|
||||||
|
"-m64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"no-compiler-rt": true,
|
||||||
|
"disable-redzone": true,
|
||||||
|
"eliminate-frame-pointer": false,
|
||||||
|
"morestack": false
|
||||||
|
}
|
285
Kernel/Architecture/i686/ArithmeticOperations.c
Normal file
285
Kernel/Architecture/i686/ArithmeticOperations.c
Normal file
@ -0,0 +1,285 @@
|
|||||||
|
/* Source: https://github.com/glitchub/arith64 */
|
||||||
|
#define arith64_u64 unsigned long long int
|
||||||
|
#define arith64_s64 signed long long int
|
||||||
|
#define arith64_u32 unsigned int
|
||||||
|
#define arith64_s32 int
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
arith64_u64 u64;
|
||||||
|
arith64_s64 s64;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||||
|
arith64_u32 hi;
|
||||||
|
arith64_u32 lo;
|
||||||
|
#else
|
||||||
|
arith64_u32 lo;
|
||||||
|
arith64_u32 hi;
|
||||||
|
#endif
|
||||||
|
} u32;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||||
|
arith64_s32 hi;
|
||||||
|
arith64_s32 lo;
|
||||||
|
#else
|
||||||
|
arith64_s32 lo;
|
||||||
|
arith64_s32 hi;
|
||||||
|
#endif
|
||||||
|
} s32;
|
||||||
|
} arith64_word;
|
||||||
|
|
||||||
|
#define arith64_hi(n) (arith64_word){.u64 = n}.u32.hi
|
||||||
|
#define arith64_lo(n) (arith64_word){.u64 = n}.u32.lo
|
||||||
|
#define arith64_neg(a, b) (((a) ^ ((((arith64_s64)(b)) >= 0) - 1)) + (((arith64_s64)(b)) < 0))
|
||||||
|
#define arith64_abs(a) arith64_neg(a, a)
|
||||||
|
|
||||||
|
arith64_s64 __absvdi2(arith64_s64 a)
|
||||||
|
{
|
||||||
|
return arith64_abs(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
arith64_s64 __ashldi3(arith64_s64 a, int b)
|
||||||
|
{
|
||||||
|
arith64_word w = {.s64 = a};
|
||||||
|
|
||||||
|
b &= 63;
|
||||||
|
|
||||||
|
if (b >= 32)
|
||||||
|
{
|
||||||
|
w.u32.hi = w.u32.lo << (b - 32);
|
||||||
|
w.u32.lo = 0;
|
||||||
|
}
|
||||||
|
else if (b)
|
||||||
|
{
|
||||||
|
w.u32.hi = (w.u32.lo >> (32 - b)) | (w.u32.hi << b);
|
||||||
|
w.u32.lo <<= b;
|
||||||
|
}
|
||||||
|
return w.s64;
|
||||||
|
}
|
||||||
|
|
||||||
|
arith64_s64 __ashrdi3(arith64_s64 a, int b)
|
||||||
|
{
|
||||||
|
arith64_word w = {.s64 = a};
|
||||||
|
|
||||||
|
b &= 63;
|
||||||
|
|
||||||
|
if (b >= 32)
|
||||||
|
{
|
||||||
|
w.s32.lo = w.s32.hi >> (b - 32);
|
||||||
|
w.s32.hi >>= 31; // 0xFFFFFFFF or 0
|
||||||
|
}
|
||||||
|
else if (b)
|
||||||
|
{
|
||||||
|
w.u32.lo = (w.u32.hi << (32 - b)) | (w.u32.lo >> b);
|
||||||
|
w.s32.hi >>= b;
|
||||||
|
}
|
||||||
|
return w.s64;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __clzsi2(arith64_u32 a)
|
||||||
|
{
|
||||||
|
int b, n = 0;
|
||||||
|
b = !(a & 0xffff0000) << 4;
|
||||||
|
n += b;
|
||||||
|
a <<= b;
|
||||||
|
b = !(a & 0xff000000) << 3;
|
||||||
|
n += b;
|
||||||
|
a <<= b;
|
||||||
|
b = !(a & 0xf0000000) << 2;
|
||||||
|
n += b;
|
||||||
|
a <<= b;
|
||||||
|
b = !(a & 0xc0000000) << 1;
|
||||||
|
n += b;
|
||||||
|
a <<= b;
|
||||||
|
return n + !(a & 0x80000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __clzdi2(arith64_u64 a)
|
||||||
|
{
|
||||||
|
int b, n = 0;
|
||||||
|
b = !(a & 0xffffffff00000000ULL) << 5;
|
||||||
|
n += b;
|
||||||
|
a <<= b;
|
||||||
|
b = !(a & 0xffff000000000000ULL) << 4;
|
||||||
|
n += b;
|
||||||
|
a <<= b;
|
||||||
|
b = !(a & 0xff00000000000000ULL) << 3;
|
||||||
|
n += b;
|
||||||
|
a <<= b;
|
||||||
|
b = !(a & 0xf000000000000000ULL) << 2;
|
||||||
|
n += b;
|
||||||
|
a <<= b;
|
||||||
|
b = !(a & 0xc000000000000000ULL) << 1;
|
||||||
|
n += b;
|
||||||
|
a <<= b;
|
||||||
|
return n + !(a & 0x8000000000000000ULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __ctzsi2(arith64_u32 a)
|
||||||
|
{
|
||||||
|
int b, n = 0;
|
||||||
|
b = !(a & 0x0000ffff) << 4;
|
||||||
|
n += b;
|
||||||
|
a >>= b;
|
||||||
|
b = !(a & 0x000000ff) << 3;
|
||||||
|
n += b;
|
||||||
|
a >>= b;
|
||||||
|
b = !(a & 0x0000000f) << 2;
|
||||||
|
n += b;
|
||||||
|
a >>= b;
|
||||||
|
b = !(a & 0x00000003) << 1;
|
||||||
|
n += b;
|
||||||
|
a >>= b;
|
||||||
|
return n + !(a & 0x00000001);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __ctzdi2(arith64_u64 a)
|
||||||
|
{
|
||||||
|
int b, n = 0;
|
||||||
|
b = !(a & 0x00000000ffffffffULL) << 5;
|
||||||
|
n += b;
|
||||||
|
a >>= b;
|
||||||
|
b = !(a & 0x000000000000ffffULL) << 4;
|
||||||
|
n += b;
|
||||||
|
a >>= b;
|
||||||
|
b = !(a & 0x00000000000000ffULL) << 3;
|
||||||
|
n += b;
|
||||||
|
a >>= b;
|
||||||
|
b = !(a & 0x000000000000000fULL) << 2;
|
||||||
|
n += b;
|
||||||
|
a >>= b;
|
||||||
|
b = !(a & 0x0000000000000003ULL) << 1;
|
||||||
|
n += b;
|
||||||
|
a >>= b;
|
||||||
|
return n + !(a & 0x0000000000000001ULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
arith64_u64 __divmoddi4(arith64_u64 a, arith64_u64 b, arith64_u64 *c)
|
||||||
|
{
|
||||||
|
if (b > a) //
|
||||||
|
{
|
||||||
|
if (c)
|
||||||
|
*c = a;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!arith64_hi(b))
|
||||||
|
{
|
||||||
|
if (b == 0)
|
||||||
|
{
|
||||||
|
volatile char x = 0;
|
||||||
|
x = 1 / x;
|
||||||
|
}
|
||||||
|
if (b == 1)
|
||||||
|
{
|
||||||
|
if (c)
|
||||||
|
*c = 0;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
if (!arith64_hi(a))
|
||||||
|
{
|
||||||
|
if (c)
|
||||||
|
*c = arith64_lo(a) % arith64_lo(b);
|
||||||
|
return arith64_lo(a) / arith64_lo(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char bits = __clzdi2(b) - __clzdi2(a) + 1;
|
||||||
|
arith64_u64 rem = a >> bits;
|
||||||
|
a <<= 64 - bits;
|
||||||
|
arith64_u64 wrap = 0;
|
||||||
|
while (bits-- > 0)
|
||||||
|
{
|
||||||
|
rem = (rem << 1) | (a >> 63);
|
||||||
|
a = (a << 1) | (wrap & 1);
|
||||||
|
wrap = ((arith64_s64)(b - rem - 1) >> 63);
|
||||||
|
rem -= b & wrap;
|
||||||
|
}
|
||||||
|
if (c)
|
||||||
|
*c = rem;
|
||||||
|
return (a << 1) | (wrap & 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
arith64_s64 __divdi3(arith64_s64 a, arith64_s64 b)
|
||||||
|
{
|
||||||
|
arith64_u64 q = __divmoddi4(arith64_abs(a), arith64_abs(b), (void *)0);
|
||||||
|
return arith64_neg(q, a ^ b);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __ffsdi2(arith64_u64 a) { return a ? __ctzdi2(a) + 1 : 0; }
|
||||||
|
|
||||||
|
arith64_u64 __lshrdi3(arith64_u64 a, int b)
|
||||||
|
{
|
||||||
|
arith64_word w = {.u64 = a};
|
||||||
|
|
||||||
|
b &= 63;
|
||||||
|
|
||||||
|
if (b >= 32)
|
||||||
|
{
|
||||||
|
w.u32.lo = w.u32.hi >> (b - 32);
|
||||||
|
w.u32.hi = 0;
|
||||||
|
}
|
||||||
|
else if (b)
|
||||||
|
{
|
||||||
|
w.u32.lo = (w.u32.hi << (32 - b)) | (w.u32.lo >> b);
|
||||||
|
w.u32.hi >>= b;
|
||||||
|
}
|
||||||
|
return w.u64;
|
||||||
|
}
|
||||||
|
|
||||||
|
arith64_s64 __moddi3(arith64_s64 a, arith64_s64 b)
|
||||||
|
{
|
||||||
|
arith64_u64 r;
|
||||||
|
__divmoddi4(arith64_abs(a), arith64_abs(b), &r);
|
||||||
|
return arith64_neg(r, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __popcountsi2(arith64_u32 a)
|
||||||
|
{
|
||||||
|
|
||||||
|
a = a - ((a >> 1) & 0x55555555);
|
||||||
|
a = ((a >> 2) & 0x33333333) + (a & 0x33333333);
|
||||||
|
a = (a + (a >> 4)) & 0x0F0F0F0F;
|
||||||
|
a = (a + (a >> 16));
|
||||||
|
|
||||||
|
return (a + (a >> 8)) & 63;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __popcountdi2(arith64_u64 a)
|
||||||
|
{
|
||||||
|
|
||||||
|
a = a - ((a >> 1) & 0x5555555555555555ULL);
|
||||||
|
a = ((a >> 2) & 0x3333333333333333ULL) + (a & 0x3333333333333333ULL);
|
||||||
|
a = (a + (a >> 4)) & 0x0F0F0F0F0F0F0F0FULL;
|
||||||
|
a = (a + (a >> 32));
|
||||||
|
a = (a + (a >> 16));
|
||||||
|
|
||||||
|
return (a + (a >> 8)) & 127;
|
||||||
|
}
|
||||||
|
|
||||||
|
arith64_u64 __udivdi3(arith64_u64 a, arith64_u64 b) { return __divmoddi4(a, b, (void *)0); }
|
||||||
|
|
||||||
|
arith64_u64 __umoddi3(arith64_u64 a, arith64_u64 b)
|
||||||
|
{
|
||||||
|
arith64_u64 r;
|
||||||
|
__divmoddi4(a, b, &r);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Good documentation: https://splichal.eu/scripts/sphinx/gccint/_build/html/the-gcc-low-level-runtime-library/routines-for-floating-point-emulation.html */
|
||||||
|
|
||||||
|
double __adddf3(double a, double b) { return a + b; }
|
||||||
|
double __muldf3(double a, double b) { return a * b; }
|
||||||
|
double __floatsidf(int i) { return (double)i; }
|
||||||
|
int __ltdf2(double a, double b) { return a < b; }
|
||||||
|
int __gtdf2(double a, double b) { return a > b; }
|
||||||
|
int __nedf2(double a, double b) { return a != b; }
|
||||||
|
int __eqdf2(double a, double b) { return a == b; }
|
||||||
|
double __floatdidf(long i) { return (double)i; }
|
||||||
|
double __divdf3(double a, double b) { return a / b; }
|
||||||
|
double __subdf3(double a, double b) { return a - b; }
|
||||||
|
int __gedf2(double a, double b) { return a >= b; }
|
||||||
|
int __fixdfsi(double a) { return (int)a; }
|
||||||
|
long __fixdfdi(double a) { return (long)a; }
|
||||||
|
int __ledf2(double a, double b) { return a <= b; }
|
123
Kernel/Architecture/i686/Interrupts/8259PIC.cpp
Normal file
123
Kernel/Architecture/i686/Interrupts/8259PIC.cpp
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
#include "pic.hpp"
|
||||||
|
|
||||||
|
#include <io.h>
|
||||||
|
|
||||||
|
namespace PIC
|
||||||
|
{
|
||||||
|
PIC::PIC(uint8_t MasterCommandPort, uint8_t MasterDataPort, uint8_t SlaveCommandPort, uint8_t SlaveDataPort, uint8_t MasterOffset, uint8_t SlaveOffset)
|
||||||
|
{
|
||||||
|
this->MasterCommandPort = MasterCommandPort;
|
||||||
|
this->MasterDataPort = MasterDataPort;
|
||||||
|
this->SlaveCommandPort = SlaveCommandPort;
|
||||||
|
this->SlaveDataPort = SlaveDataPort;
|
||||||
|
this->MasterOffset = MasterOffset;
|
||||||
|
this->SlaveOffset = SlaveOffset;
|
||||||
|
|
||||||
|
MasterMask = 0xFF;
|
||||||
|
SlaveMask = 0xFF;
|
||||||
|
|
||||||
|
// ICW1
|
||||||
|
outb(MasterCommandPort, 0x11);
|
||||||
|
outb(SlaveCommandPort, 0x11);
|
||||||
|
|
||||||
|
// ICW2
|
||||||
|
outb(MasterDataPort, MasterOffset);
|
||||||
|
outb(SlaveDataPort, SlaveOffset);
|
||||||
|
|
||||||
|
// ICW3
|
||||||
|
outb(MasterDataPort, 0x04);
|
||||||
|
outb(SlaveDataPort, 0x02);
|
||||||
|
|
||||||
|
// ICW4
|
||||||
|
outb(MasterDataPort, 0x01);
|
||||||
|
outb(SlaveDataPort, 0x01);
|
||||||
|
|
||||||
|
// OCW1
|
||||||
|
outb(MasterDataPort, MasterMask);
|
||||||
|
outb(SlaveDataPort, SlaveMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
PIC::~PIC()
|
||||||
|
{
|
||||||
|
outb(MasterDataPort, 0xFF);
|
||||||
|
outb(SlaveDataPort, 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PIC::Mask(uint8_t IRQ)
|
||||||
|
{
|
||||||
|
uint16_t Port;
|
||||||
|
uint8_t Value;
|
||||||
|
|
||||||
|
if (IRQ < 8)
|
||||||
|
{
|
||||||
|
Port = MasterDataPort;
|
||||||
|
Value = MasterMask & ~(1 << IRQ);
|
||||||
|
MasterMask = Value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Port = SlaveDataPort;
|
||||||
|
Value = SlaveMask & ~(1 << (IRQ - 8));
|
||||||
|
SlaveMask = Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
outb(Port, Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PIC::Unmask(uint8_t IRQ)
|
||||||
|
{
|
||||||
|
uint16_t Port;
|
||||||
|
uint8_t Value;
|
||||||
|
|
||||||
|
if (IRQ < 8)
|
||||||
|
{
|
||||||
|
Port = MasterDataPort;
|
||||||
|
Value = MasterMask | (1 << IRQ);
|
||||||
|
MasterMask = Value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Port = SlaveDataPort;
|
||||||
|
Value = SlaveMask | (1 << (IRQ - 8));
|
||||||
|
SlaveMask = Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
outb(Port, Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PIC::SendEOI(uint8_t IRQ)
|
||||||
|
{
|
||||||
|
if (IRQ >= 8)
|
||||||
|
outb(SlaveCommandPort, 0x20);
|
||||||
|
|
||||||
|
outb(MasterCommandPort, 0x20);
|
||||||
|
}
|
||||||
|
|
||||||
|
PIT::PIT(uint16_t Port, uint16_t Frequency)
|
||||||
|
{
|
||||||
|
this->Port = Port;
|
||||||
|
this->Frequency = Frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
PIT::~PIT()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void PIT::PrepareSleep(uint32_t Milliseconds)
|
||||||
|
{
|
||||||
|
uint16_t Divisor = 1193182 / Frequency;
|
||||||
|
uint8_t Low = (uint8_t)(Divisor & 0xFF);
|
||||||
|
uint8_t High = (uint8_t)((Divisor >> 8) & 0xFF);
|
||||||
|
|
||||||
|
outb(Port + 3, 0x36);
|
||||||
|
outb(Port + 0, Low);
|
||||||
|
outb(Port + 1, High);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PIT::PerformSleep()
|
||||||
|
{
|
||||||
|
uint8_t Value = inb(Port + 0);
|
||||||
|
while (Value != 0)
|
||||||
|
Value = inb(Port + 0);
|
||||||
|
}
|
||||||
|
}
|
42
Kernel/Architecture/i686/Interrupts/pic.hpp
Normal file
42
Kernel/Architecture/i686/Interrupts/pic.hpp
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#ifndef __FENNIX_KERNEL_8259PIC_H__
|
||||||
|
#define __FENNIX_KERNEL_8259PIC_H__
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
namespace PIC
|
||||||
|
{
|
||||||
|
class PIC
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint8_t MasterCommandPort;
|
||||||
|
uint8_t MasterDataPort;
|
||||||
|
uint8_t SlaveCommandPort;
|
||||||
|
uint8_t SlaveDataPort;
|
||||||
|
uint8_t MasterOffset;
|
||||||
|
uint8_t SlaveOffset;
|
||||||
|
uint8_t MasterMask;
|
||||||
|
uint8_t SlaveMask;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PIC(uint8_t MasterCommandPort, uint8_t MasterDataPort, uint8_t SlaveCommandPort, uint8_t SlaveDataPort, uint8_t MasterOffset, uint8_t SlaveOffset);
|
||||||
|
~PIC();
|
||||||
|
void Mask(uint8_t IRQ);
|
||||||
|
void Unmask(uint8_t IRQ);
|
||||||
|
void SendEOI(uint8_t IRQ);
|
||||||
|
};
|
||||||
|
|
||||||
|
class PIT
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint16_t Port;
|
||||||
|
uint16_t Frequency;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PIT(uint16_t Port, uint16_t Frequency);
|
||||||
|
~PIT();
|
||||||
|
void PrepareSleep(uint32_t Milliseconds);
|
||||||
|
void PerformSleep();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !__FENNIX_KERNEL_8259PIC_H__
|
343
Kernel/Architecture/i686/Multiboot2.cpp
Normal file
343
Kernel/Architecture/i686/Multiboot2.cpp
Normal file
@ -0,0 +1,343 @@
|
|||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
#include <boot/protocols/multiboot2.h>
|
||||||
|
#include <io.h>
|
||||||
|
|
||||||
|
#include "../../kernel.h"
|
||||||
|
|
||||||
|
enum VideoType
|
||||||
|
{
|
||||||
|
VIDEO_TYPE_NONE = 0x00,
|
||||||
|
VIDEO_TYPE_COLOUR = 0x20,
|
||||||
|
VIDEO_TYPE_MONOCHROME = 0x30,
|
||||||
|
};
|
||||||
|
|
||||||
|
uint16_t GetBiosAreaHardware()
|
||||||
|
{
|
||||||
|
const uint16_t *BIOSDataAreaDetectedHardware = (const uint16_t *)0x410;
|
||||||
|
return *BIOSDataAreaDetectedHardware;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum VideoType GetVideoType() { return (enum VideoType)(GetBiosAreaHardware() & 0x30); }
|
||||||
|
|
||||||
|
void GetSMBIOS()
|
||||||
|
{
|
||||||
|
unsigned char *SMBIOSAddress = (unsigned char *)0xF0000;
|
||||||
|
while ((unsigned int)(unsigned long)SMBIOSAddress < 0x100000)
|
||||||
|
{
|
||||||
|
if (SMBIOSAddress[0] == '_' &&
|
||||||
|
SMBIOSAddress[1] == 'S' &&
|
||||||
|
SMBIOSAddress[2] == 'M' &&
|
||||||
|
SMBIOSAddress[3] == '_')
|
||||||
|
{
|
||||||
|
unsigned char Checksum = 0;
|
||||||
|
int Length = SMBIOSAddress[5];
|
||||||
|
for (int i = 0; i < Length; i++)
|
||||||
|
Checksum += SMBIOSAddress[i];
|
||||||
|
|
||||||
|
if (Checksum == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
SMBIOSAddress += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((unsigned int)(unsigned long)SMBIOSAddress == 0x100000)
|
||||||
|
{
|
||||||
|
// No SMBIOS found
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct multiboot_info
|
||||||
|
{
|
||||||
|
multiboot_uint32_t Size;
|
||||||
|
multiboot_uint32_t Reserved;
|
||||||
|
struct multiboot_tag *Tag;
|
||||||
|
};
|
||||||
|
|
||||||
|
EXTERNC void x32Multiboot2Entry(multiboot_info *Info, unsigned int Magic)
|
||||||
|
{
|
||||||
|
if (Info == NULL || Magic == NULL)
|
||||||
|
{
|
||||||
|
if (Magic == NULL)
|
||||||
|
error("Multiboot magic is NULL");
|
||||||
|
if (Info == NULL)
|
||||||
|
error("Multiboot info is NULL");
|
||||||
|
CPU::Stop();
|
||||||
|
}
|
||||||
|
else if (Magic != MULTIBOOT2_BOOTLOADER_MAGIC)
|
||||||
|
{
|
||||||
|
error("Multiboot magic is invalid (%#x != %#x)", Magic, MULTIBOOT2_BOOTLOADER_MAGIC);
|
||||||
|
trace("Hello, World!");
|
||||||
|
CPU::Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t div = 1193180 / 1000;
|
||||||
|
outb(0x43, 0xB6);
|
||||||
|
outb(0x42, (uint8_t)div);
|
||||||
|
outb(0x42, (uint8_t)(div >> 8));
|
||||||
|
uint8_t tmp = inb(0x61);
|
||||||
|
if (tmp != (tmp | 3))
|
||||||
|
outb(0x61, tmp | 3);
|
||||||
|
|
||||||
|
BootInfo binfo;
|
||||||
|
uint32_t Itr = 0;
|
||||||
|
|
||||||
|
for (uint32_t i = 8; i < Info->Size; i += Itr)
|
||||||
|
{
|
||||||
|
multiboot_tag *Tag = (multiboot_tag *)((uint8_t *)Info + i);
|
||||||
|
if (Tag->type == MULTIBOOT_TAG_TYPE_END)
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch (Tag->type)
|
||||||
|
{
|
||||||
|
case MULTIBOOT_TAG_TYPE_CMDLINE:
|
||||||
|
{
|
||||||
|
strncpy(binfo.Kernel.CommandLine,
|
||||||
|
((multiboot_tag_string *)Tag)->string,
|
||||||
|
strlen(((multiboot_tag_string *)Tag)->string));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME:
|
||||||
|
{
|
||||||
|
strncpy(binfo.Bootloader.Name,
|
||||||
|
((multiboot_tag_string *)Tag)->string,
|
||||||
|
strlen(((multiboot_tag_string *)Tag)->string));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_MODULE:
|
||||||
|
{
|
||||||
|
multiboot_tag_module *module = (multiboot_tag_module *)Tag;
|
||||||
|
static int module_count = 0;
|
||||||
|
binfo.Modules[module_count++].Address = (void *)module->mod_start;
|
||||||
|
binfo.Modules[module_count++].Size = module->size;
|
||||||
|
strncpy(binfo.Modules[module_count++].Path, "(null)", 6);
|
||||||
|
strncpy(binfo.Modules[module_count++].CommandLine, module->cmdline,
|
||||||
|
strlen(module->cmdline));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO:
|
||||||
|
{
|
||||||
|
multiboot_tag_basic_meminfo *meminfo = (multiboot_tag_basic_meminfo *)Tag;
|
||||||
|
fixme("basic_meminfo->[mem_lower: %#x, mem_upper: %#x]",
|
||||||
|
meminfo->mem_lower, meminfo->mem_upper);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_BOOTDEV:
|
||||||
|
{
|
||||||
|
multiboot_tag_bootdev *bootdev = (multiboot_tag_bootdev *)Tag;
|
||||||
|
fixme("bootdev->[biosdev: %#x, slice: %#x, part: %#x]",
|
||||||
|
bootdev->biosdev, bootdev->slice, bootdev->part);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_MMAP:
|
||||||
|
{
|
||||||
|
multiboot_tag_mmap *mmap = (multiboot_tag_mmap *)Tag;
|
||||||
|
uint32_t EntryCount = mmap->size / sizeof(multiboot_mmap_entry);
|
||||||
|
|
||||||
|
binfo.Memory.Entries = EntryCount;
|
||||||
|
for (uint32_t i = 0; i < EntryCount; i++)
|
||||||
|
{
|
||||||
|
if (EntryCount > MAX_MEMORY_ENTRIES)
|
||||||
|
{
|
||||||
|
warn("Too many memory entries, skipping the rest...");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
multiboot_mmap_entry entry = mmap->entries[i];
|
||||||
|
binfo.Memory.Size += entry.len;
|
||||||
|
switch (entry.type)
|
||||||
|
{
|
||||||
|
case MULTIBOOT_MEMORY_AVAILABLE:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
|
||||||
|
binfo.Memory.Entry[i].Length = entry.len;
|
||||||
|
binfo.Memory.Entry[i].Type = Usable;
|
||||||
|
break;
|
||||||
|
case MULTIBOOT_MEMORY_RESERVED:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
|
||||||
|
binfo.Memory.Entry[i].Length = entry.len;
|
||||||
|
binfo.Memory.Entry[i].Type = Reserved;
|
||||||
|
break;
|
||||||
|
case MULTIBOOT_MEMORY_ACPI_RECLAIMABLE:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
|
||||||
|
binfo.Memory.Entry[i].Length = entry.len;
|
||||||
|
binfo.Memory.Entry[i].Type = ACPIReclaimable;
|
||||||
|
break;
|
||||||
|
case MULTIBOOT_MEMORY_NVS:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
|
||||||
|
binfo.Memory.Entry[i].Length = entry.len;
|
||||||
|
binfo.Memory.Entry[i].Type = ACPINVS;
|
||||||
|
break;
|
||||||
|
case MULTIBOOT_MEMORY_BADRAM:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
|
||||||
|
binfo.Memory.Entry[i].Length = entry.len;
|
||||||
|
binfo.Memory.Entry[i].Type = BadMemory;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
binfo.Memory.Entry[i].BaseAddress = (void *)entry.addr;
|
||||||
|
binfo.Memory.Entry[i].Length = entry.len;
|
||||||
|
binfo.Memory.Entry[i].Type = Unknown;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_VBE:
|
||||||
|
{
|
||||||
|
multiboot_tag_vbe *vbe = (multiboot_tag_vbe *)Tag;
|
||||||
|
fixme("vbe->[vbe_mode: %#x, vbe_interface_seg: %#x, vbe_interface_off: %#x, vbe_interface_len: %#x]",
|
||||||
|
vbe->vbe_mode, vbe->vbe_interface_seg, vbe->vbe_interface_off, vbe->vbe_interface_len);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_FRAMEBUFFER:
|
||||||
|
{
|
||||||
|
multiboot_tag_framebuffer *fb = (multiboot_tag_framebuffer *)Tag;
|
||||||
|
static int fb_count = 0;
|
||||||
|
|
||||||
|
binfo.Framebuffer[fb_count].BaseAddress = (void *)fb->common.framebuffer_addr;
|
||||||
|
binfo.Framebuffer[fb_count].Width = fb->common.framebuffer_width;
|
||||||
|
binfo.Framebuffer[fb_count].Height = fb->common.framebuffer_height;
|
||||||
|
binfo.Framebuffer[fb_count].Pitch = fb->common.framebuffer_pitch;
|
||||||
|
binfo.Framebuffer[fb_count].BitsPerPixel = fb->common.framebuffer_bpp;
|
||||||
|
binfo.Framebuffer[fb_count].MemoryModel = fb->common.framebuffer_type;
|
||||||
|
|
||||||
|
switch (fb->common.framebuffer_type)
|
||||||
|
{
|
||||||
|
case MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED:
|
||||||
|
{
|
||||||
|
fixme("indexed");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_FRAMEBUFFER_TYPE_RGB:
|
||||||
|
{
|
||||||
|
binfo.Framebuffer[fb_count].RedMaskSize = fb->framebuffer_red_mask_size;
|
||||||
|
binfo.Framebuffer[fb_count].RedMaskShift = fb->framebuffer_red_field_position;
|
||||||
|
binfo.Framebuffer[fb_count].GreenMaskSize = fb->framebuffer_green_mask_size;
|
||||||
|
binfo.Framebuffer[fb_count].GreenMaskShift = fb->framebuffer_green_field_position;
|
||||||
|
binfo.Framebuffer[fb_count].BlueMaskSize = fb->framebuffer_blue_mask_size;
|
||||||
|
binfo.Framebuffer[fb_count].BlueMaskShift = fb->framebuffer_blue_field_position;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT:
|
||||||
|
{
|
||||||
|
fixme("ega_text");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
debug("Framebuffer %d: %dx%d %d bpp", i, fb->common.framebuffer_width, fb->common.framebuffer_height, fb->common.framebuffer_bpp);
|
||||||
|
debug("More info:\nAddress: %p\nPitch: %lld\nMemoryModel: %d\nRedMaskSize: %d\nRedMaskShift: %d\nGreenMaskSize: %d\nGreenMaskShift: %d\nBlueMaskSize: %d\nBlueMaskShift: %d",
|
||||||
|
fb->common.framebuffer_addr, fb->common.framebuffer_pitch, fb->common.framebuffer_type,
|
||||||
|
fb->framebuffer_red_mask_size, fb->framebuffer_red_field_position, fb->framebuffer_green_mask_size,
|
||||||
|
fb->framebuffer_green_field_position, fb->framebuffer_blue_mask_size, fb->framebuffer_blue_field_position);
|
||||||
|
|
||||||
|
fb_count++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_ELF_SECTIONS:
|
||||||
|
{
|
||||||
|
multiboot_tag_elf_sections *elf = (multiboot_tag_elf_sections *)Tag;
|
||||||
|
fixme("elf_sections->[num=%d, size=%d, entsize=%d, shndx=%d]",
|
||||||
|
elf->num, elf->size, elf->entsize, elf->shndx);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_APM:
|
||||||
|
{
|
||||||
|
multiboot_tag_apm *apm = (multiboot_tag_apm *)Tag;
|
||||||
|
fixme("apm->[version: %d, cseg: %d, offset: %d, cseg_16: %d, dseg: %d, flags: %d, cseg_len: %d, cseg_16_len: %d, dseg_len: %d]",
|
||||||
|
apm->version, apm->cseg, apm->offset, apm->cseg_16, apm->dseg, apm->flags, apm->cseg_len, apm->cseg_16_len, apm->dseg_len);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_EFI32:
|
||||||
|
{
|
||||||
|
multiboot_tag_efi32 *efi32 = (multiboot_tag_efi32 *)Tag;
|
||||||
|
fixme("efi32->[pointer: %p, size: %d]", efi32->pointer, efi32->size);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_EFI64:
|
||||||
|
{
|
||||||
|
multiboot_tag_efi64 *efi64 = (multiboot_tag_efi64 *)Tag;
|
||||||
|
fixme("efi64->[pointer: %p, size: %d]", efi64->pointer, efi64->size);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_SMBIOS:
|
||||||
|
{
|
||||||
|
multiboot_tag_smbios *smbios = (multiboot_tag_smbios *)Tag;
|
||||||
|
fixme("smbios->[major: %d, minor: %d]", smbios->major, smbios->minor);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_ACPI_OLD:
|
||||||
|
{
|
||||||
|
binfo.RSDP = (BootInfo::RSDPInfo *)((multiboot_tag_old_acpi *)Tag)->rsdp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_ACPI_NEW:
|
||||||
|
{
|
||||||
|
binfo.RSDP = (BootInfo::RSDPInfo *)((multiboot_tag_new_acpi *)Tag)->rsdp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_NETWORK:
|
||||||
|
{
|
||||||
|
multiboot_tag_network *net = (multiboot_tag_network *)Tag;
|
||||||
|
fixme("network->[dhcpack: %p]", net->dhcpack);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_EFI_MMAP:
|
||||||
|
{
|
||||||
|
multiboot_tag_efi_mmap *efi_mmap = (multiboot_tag_efi_mmap *)Tag;
|
||||||
|
fixme("efi_mmap->[descr_size: %d, descr_vers: %d, efi_mmap: %p]",
|
||||||
|
efi_mmap->descr_size, efi_mmap->descr_vers, efi_mmap->efi_mmap);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_EFI_BS:
|
||||||
|
{
|
||||||
|
fixme("efi_bs->[%p] (unknown structure)", Tag);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_EFI32_IH:
|
||||||
|
{
|
||||||
|
multiboot_tag_efi32_ih *efi32_ih = (multiboot_tag_efi32_ih *)Tag;
|
||||||
|
fixme("efi32_ih->[pointer: %p]", efi32_ih->pointer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_EFI64_IH:
|
||||||
|
{
|
||||||
|
multiboot_tag_efi64_ih *efi64_ih = (multiboot_tag_efi64_ih *)Tag;
|
||||||
|
fixme("efi64_ih->[pointer: %p]", efi64_ih->pointer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR:
|
||||||
|
{
|
||||||
|
multiboot_tag_load_base_addr *load_base_addr = (multiboot_tag_load_base_addr *)Tag;
|
||||||
|
binfo.Kernel.PhysicalBase = (void *)load_base_addr->load_base_addr;
|
||||||
|
binfo.Kernel.VirtualBase = (void *)(load_base_addr->load_base_addr + 0xC0000000);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Itr = Tag->size;
|
||||||
|
if ((Itr % 8) != 0)
|
||||||
|
Itr += (8 - Itr % 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = inb(0x61) & 0xFC;
|
||||||
|
outb(0x61, tmp);
|
||||||
|
|
||||||
|
int *vm = (int *)0xb8000;
|
||||||
|
// "Not supported yet"
|
||||||
|
vm[0] = 0x054E;
|
||||||
|
vm[1] = 0x056F;
|
||||||
|
vm[2] = 0x0574;
|
||||||
|
vm[3] = 0x0520;
|
||||||
|
vm[4] = 0x0573;
|
||||||
|
vm[5] = 0x0575;
|
||||||
|
vm[6] = 0x0570;
|
||||||
|
vm[7] = 0x0570;
|
||||||
|
vm[8] = 0x0572;
|
||||||
|
vm[9] = 0x056F;
|
||||||
|
vm[10] = 0x0574;
|
||||||
|
vm[11] = 0x0520;
|
||||||
|
vm[12] = 0x0579;
|
||||||
|
vm[13] = 0x0565;
|
||||||
|
vm[14] = 0x0574;
|
||||||
|
|
||||||
|
CPU::Stop();
|
||||||
|
// Entry(&binfo);
|
||||||
|
}
|
13
Kernel/Architecture/i686/SystemCalls.cpp
Normal file
13
Kernel/Architecture/i686/SystemCalls.cpp
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#include <syscalls.hpp>
|
||||||
|
|
||||||
|
#include <cpu.hpp>
|
||||||
|
|
||||||
|
#include "cpu/gdt.hpp"
|
||||||
|
|
||||||
|
using namespace CPU::x32;
|
||||||
|
|
||||||
|
extern "C" uint32_t SystemCallsHandler(SyscallsFrame *regs);
|
||||||
|
|
||||||
|
void InitializeSystemCalls()
|
||||||
|
{
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user