pax_global_header00006660000000000000000000000064147121565060014521gustar00rootroot0000000000000052 comment=5ea320f0f01c8de8f9dd4e4e38a245608f0287dd ncroxon-gnu-efi-157d47c/000077500000000000000000000000001471215650600150775ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/.github/000077500000000000000000000000001471215650600164375ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/.github/dependabot.yml000066400000000000000000000012511471215650600212660ustar00rootroot00000000000000# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file version: 2 updates: # Maintain dependencies for GitHub Actions - package-ecosystem: "github-actions" # Workflow files stored in the default location of `.github/workflows`. (You don't need to specify `/.github/workflows` for `directory`. You can use `directory: "/"`.) directory: "/" schedule: interval: "weekly" ncroxon-gnu-efi-157d47c/.github/workflows/000077500000000000000000000000001471215650600204745ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/.github/workflows/linux-gcc-musl.yml000066400000000000000000000051771471215650600241000ustar00rootroot00000000000000name: Linux, gcc+musl on: [push, pull_request] jobs: build: runs-on: ubuntu-latest strategy: matrix: arch: [x64] include: - arch: x64 dir: x86_64 musl: musl-dev cross_compile: x86_64-linux-musl- steps: - name: Install toolchain run: | sudo apt-get update sudo apt-get install ${{ matrix.musl }} - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Build run: | mkdir -p $HOME/.local/bin for i in ld as ar ranlib objcopy; do ln -s /usr/bin/${i} $HOME/.local/bin/${{ matrix.cross_compile }}${i}; done make ARCH=${{ matrix.arch }} CROSS_COMPILE=${{ matrix.cross_compile }} - name: Generate binary information run: readelf -a ./${{ matrix.dir }}/apps/ctors_dtors_priority_test.so > ./${{ matrix.dir }}/apps/readelf.txt - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.arch }} path: | ./${{ matrix.dir }}/apps/* tests: runs-on: ubuntu-24.04 needs: build strategy: matrix: arch: [x64] include: - arch: x64 pkg: qemu-system-x86 qemu_arch: x86_64 qemu_opts: -M q35 fw_base: OVMF steps: - name: Set up Linux environment run: | sudo apt-get update sudo apt-get -y --no-install-recommends install ${{ matrix.pkg }} - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download artifacts uses: actions/download-artifact@v4 with: name: ${{ matrix.arch }} - name: Download UEFI firmware run: | fw_arch=$(echo ${{ matrix.arch }} | tr a-z A-Z) fw_zip=${{ matrix.fw_base }}-${fw_arch}.zip curl -O https://efi.akeo.ie/${{ matrix.fw_base }}/${fw_zip} 7z x ${fw_zip} rm ${fw_zip} - name: Download UEFI Shell run: | curl -L -O https://github.com/pbatard/UEFI-Shell/releases/download/23H2/UEFI-Shell-2.2-23H2-RELEASE.iso mkdir ./image 7z x -o./image *.iso rm *.iso - name: Run tests run: | export UEFI_ARCH=${{ matrix.arch }} export UEFI_DIR=./image export QEMU_CMD="qemu-system-${{ matrix.qemu_arch }} ${{ matrix.qemu_opts }} -nodefaults -nographic -serial stdio -net none -L . -drive if=pflash,format=raw,unit=0,file=${{ matrix.fw_base }}.fd,readonly=on -drive format=raw,file=fat:rw:image" ./tests/gen_tests.sh ./tests/test_list.txt ./tests/run_tests.sh ncroxon-gnu-efi-157d47c/.github/workflows/linux-gcc.yml000066400000000000000000000102761471215650600231160ustar00rootroot00000000000000name: Linux, gcc on: [push, pull_request] jobs: build: runs-on: ubuntu-latest strategy: matrix: arch: [ia32, x64, aa64, arm, riscv64, mips64] include: - arch: ia32 dir: ia32 gcc: multilib cross_compile: - arch: x64 dir: x86_64 gcc: multilib cross_compile: - arch: aa64 dir: aarch64 gcc: aarch64-linux-gnu cross_compile: aarch64-linux-gnu- - arch: arm dir: arm gcc: arm-linux-gnueabihf cross_compile: arm-linux-gnueabihf- - arch: riscv64 dir: riscv64 gcc: riscv64-linux-gnu cross_compile: riscv64-linux-gnu- - arch: mips64 dir: mips64el gcc: mips64el-linux-gnuabi64 cross_compile: mips64el-linux-gnuabi64- # - arch: loongarch64 # dir: loongarch64 # gcc: loongarch64-linux-gnu # cross_compile: loongarch64-linux-gnu- steps: - name: Install toolchain run: | sudo apt-get update sudo apt-get install gcc-${{ matrix.gcc }} - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Build run: make ARCH=${{ matrix.arch }} CROSS_COMPILE=${{ matrix.cross_compile }} - name: Generate binary information run: readelf -a ./${{ matrix.dir }}/apps/ctors_dtors_priority_test.so > ./${{ matrix.dir }}/apps/readelf.txt - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.arch }} path: | ./${{ matrix.dir }}/apps/* tests: runs-on: ubuntu-24.04 needs: build strategy: matrix: arch: [x64, ia32, aa64, arm, riscv64] include: - arch: x64 pkg: qemu-system-x86 qemu_arch: x86_64 qemu_opts: -M q35 fw_base: OVMF - arch: ia32 pkg: qemu-system-x86 qemu_arch: i386 qemu_opts: -M pc fw_base: OVMF - arch: aa64 pkg: qemu-system-arm qemu_arch: aarch64 qemu_opts: -M virt -cpu cortex-a57 fw_base: AAVMF - arch: arm pkg: qemu-system-arm qemu_arch: arm qemu_opts: -M virt -cpu cortex-a15 fw_base: AAVMF - arch: riscv64 pkg: qemu-system-riscv64 qemu_arch: riscv64 qemu_opts: -M virt,pflash0=pflash0 fw_base: QEMU_EFI steps: - name: Set up Linux environment run: | sudo apt-get update sudo apt-get -y --no-install-recommends install ${{ matrix.pkg }} - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download artifacts uses: actions/download-artifact@v4 with: name: ${{ matrix.arch }} - name: Download UEFI firmware run: | fw_arch=$(echo ${{ matrix.arch }} | tr a-z A-Z) fw_zip=${{ matrix.fw_base }}-${fw_arch}.zip curl -O https://efi.akeo.ie/${{ matrix.fw_base }}/${fw_zip} 7z x ${fw_zip} rm ${fw_zip} - name: Download UEFI Shell run: | curl -L -O https://github.com/pbatard/UEFI-Shell/releases/download/23H2/UEFI-Shell-2.2-23H2-RELEASE.iso mkdir ./image 7z x -o./image *.iso rm *.iso - name: Run tests run: | export UEFI_ARCH=${{ matrix.arch }} export UEFI_DIR=./image if [ "$UEFI_ARCH" = "riscv64" ]; then\ export QEMU_CMD="qemu-system-${{ matrix.qemu_arch }} ${{ matrix.qemu_opts }} -nodefaults -nographic -serial stdio -net none -blockdev node-name=pflash0,driver=file,read-only=on,filename=${{ matrix.fw_base }}.fd -drive format=raw,file=fat:rw:image,id=drv1 -device virtio-blk-device,drive=drv1" else \ export QEMU_CMD="qemu-system-${{ matrix.qemu_arch }} ${{ matrix.qemu_opts }} -nodefaults -nographic -serial stdio -net none -L . -drive if=pflash,format=raw,unit=0,file=${{ matrix.fw_base }}.fd,readonly=on -drive format=raw,file=fat:rw:image" fi ./tests/gen_tests.sh ./tests/test_list.txt ./tests/run_tests.sh ncroxon-gnu-efi-157d47c/.github/workflows/linux-llvm.yml000066400000000000000000000047141471215650600233340ustar00rootroot00000000000000name: Linux, LLVM on: [push, pull_request] jobs: build: runs-on: ubuntu-latest strategy: matrix: arch: [x64] include: - arch: x64 dir: x86_64 gcc: multilib cross_compile: steps: - name: Install toolchain run: | sudo apt-get update sudo apt-get install gcc-${{ matrix.gcc }} clang lld - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Build run: make ARCH=${{ matrix.arch }} CROSS_COMPILE=${{ matrix.cross_compile }} CC=clang LD=ld.lld - name: Generate binary information run: readelf -a ./${{ matrix.dir }}/apps/ctors_dtors_priority_test.so > ./${{ matrix.dir }}/apps/readelf.txt - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.arch }} path: | ./${{ matrix.dir }}/apps/* tests: runs-on: ubuntu-24.04 needs: build strategy: matrix: arch: [x64] include: - arch: x64 pkg: qemu-system-x86 qemu_arch: x86_64 qemu_opts: -M q35 fw_base: OVMF steps: - name: Set up Linux environment run: | sudo apt-get update sudo apt-get -y --no-install-recommends install ${{ matrix.pkg }} - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download artifacts uses: actions/download-artifact@v4 with: name: ${{ matrix.arch }} - name: Download UEFI firmware run: | fw_arch=$(echo ${{ matrix.arch }} | tr a-z A-Z) fw_zip=${{ matrix.fw_base }}-${fw_arch}.zip curl -O https://efi.akeo.ie/${{ matrix.fw_base }}/${fw_zip} 7z x ${fw_zip} rm ${fw_zip} - name: Download UEFI Shell run: | curl -L -O https://github.com/pbatard/UEFI-Shell/releases/download/23H2/UEFI-Shell-2.2-23H2-RELEASE.iso mkdir ./image 7z x -o./image *.iso rm *.iso - name: Run tests run: | export UEFI_ARCH=${{ matrix.arch }} export UEFI_DIR=./image export QEMU_CMD="qemu-system-${{ matrix.qemu_arch }} ${{ matrix.qemu_opts }} -nodefaults -nographic -serial stdio -net none -L . -drive if=pflash,format=raw,unit=0,file=${{ matrix.fw_base }}.fd,readonly=on -drive format=raw,file=fat:rw:image" ./tests/gen_tests.sh ./tests/test_list.txt ./tests/run_tests.sh ncroxon-gnu-efi-157d47c/.github/workflows/linux-mingw.yml000066400000000000000000000047771471215650600235140ustar00rootroot00000000000000name: Linux, MinGW on: [push, pull_request] jobs: build: runs-on: ubuntu-latest strategy: matrix: arch: [x64, ia32] include: - arch: x64 dir: x86_64 pkg: gcc-mingw-w64-x86-64 tuple: x86_64-w64-mingw32- - arch: ia32 dir: ia32 pkg: gcc-mingw-w64-i686 tuple: i686-w64-mingw32- steps: - name: Checkout repository and submodules uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install gcc toolchain run: sudo apt install ${{ matrix.pkg }} - name: Build run: make ARCH=${{ matrix.arch }} CROSS_COMPILE=${{ matrix.tuple }} - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.arch }} path: ./${{ matrix.dir }}/apps/*.efi tests: runs-on: ubuntu-latest needs: build strategy: matrix: arch: [x64, ia32] include: - arch: x64 pkg: qemu-system-x86 qemu_arch: x86_64 qemu_opts: -M q35 fw_base: OVMF - arch: ia32 pkg: qemu-system-x86 qemu_arch: i386 qemu_opts: -M pc fw_base: OVMF steps: - name: Set up Linux environment run: | sudo apt-get update sudo apt-get -y --no-install-recommends install ${{ matrix.pkg }} - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download artifacts uses: actions/download-artifact@v4 with: name: ${{ matrix.arch }} - name: Download UEFI firmware run: | fw_arch=$(echo ${{ matrix.arch }} | tr a-z A-Z) fw_zip=${{ matrix.fw_base }}-${fw_arch}.zip curl -O https://efi.akeo.ie/${{ matrix.fw_base }}/${fw_zip} 7z x ${fw_zip} rm ${fw_zip} - name: Download UEFI Shell run: | curl -L -O https://github.com/pbatard/UEFI-Shell/releases/download/23H2/UEFI-Shell-2.2-23H2-RELEASE.iso mkdir ./image 7z x -o./image *.iso rm *.iso - name: Run tests run: | export UEFI_ARCH=${{ matrix.arch }} export UEFI_DIR=./image export QEMU_CMD="qemu-system-${{ matrix.qemu_arch }} ${{ matrix.qemu_opts }} -L . -drive if=pflash,format=raw,unit=0,file=${{ matrix.fw_base }}.fd,readonly=on -drive format=raw,file=fat:rw:image -nodefaults -nographic -serial stdio -net none" ./tests/gen_tests.sh ./tests/test_list.txt ./tests/run_tests.sh ncroxon-gnu-efi-157d47c/.github/workflows/macos-gcc.yml000066400000000000000000000064151471215650600230610ustar00rootroot00000000000000name: macOS, gcc on: [push, pull_request] jobs: build: runs-on: macos-latest strategy: matrix: arch: [ia32, x64, aa64, arm] include: - arch: ia32 dir: ia32 cross_compile: i686-elf- toolchain: i686-elf-gcc - arch: x64 dir: x86_64 cross_compile: x86_64-elf- toolchain: x86_64-elf-gcc - arch: aa64 dir: aarch64 cross_compile: aarch64-elf- toolchain: aarch64-elf-gcc - arch: arm dir: arm cross_compile: arm-none-eabi- toolchain: arm-none-eabi-gcc steps: - name: Install toolchain run: | brew install ${{ matrix.toolchain }} - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Build run: | make ARCH=${{ matrix.arch }} CROSS_COMPILE=${{ matrix.cross_compile }} - name: Generate binary information run: ${{ matrix.cross_compile }}readelf -a ./${{ matrix.dir }}/apps/ctors_dtors_priority_test.so > ./${{ matrix.dir }}/apps/readelf.txt - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.arch }} path: | ./${{ matrix.dir }}/apps/* tests: runs-on: ubuntu-24.04 needs: build strategy: matrix: arch: [ia32, x64, aa64, arm] include: - arch: x64 pkg: qemu-system-x86 qemu_arch: x86_64 qemu_opts: -M q35 fw_base: OVMF - arch: ia32 pkg: qemu-system-x86 qemu_arch: i386 qemu_opts: -M pc fw_base: OVMF - arch: aa64 pkg: qemu-system-arm qemu_arch: aarch64 qemu_opts: -M virt -cpu cortex-a57 fw_base: AAVMF - arch: arm pkg: qemu-system-arm qemu_arch: arm qemu_opts: -M virt -cpu cortex-a15 fw_base: AAVMF steps: - name: Set up Linux environment run: | sudo apt-get update sudo apt-get -y --no-install-recommends install ${{ matrix.pkg }} - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download artifacts uses: actions/download-artifact@v4 with: name: ${{ matrix.arch }} - name: Download UEFI firmware run: | fw_arch=$(echo ${{ matrix.arch }} | tr a-z A-Z) fw_zip=${{ matrix.fw_base }}-${fw_arch}.zip curl -O https://efi.akeo.ie/${{ matrix.fw_base }}/${fw_zip} 7z x ${fw_zip} rm ${fw_zip} - name: Download UEFI Shell run: | curl -L -O https://github.com/pbatard/UEFI-Shell/releases/download/23H2/UEFI-Shell-2.2-23H2-RELEASE.iso mkdir ./image 7z x -o./image *.iso rm *.iso - name: Run tests run: | export UEFI_ARCH=${{ matrix.arch }} export UEFI_DIR=./image export QEMU_CMD="qemu-system-${{ matrix.qemu_arch }} ${{ matrix.qemu_opts }} -nodefaults -nographic -serial stdio -net none -L . -drive if=pflash,format=raw,unit=0,file=${{ matrix.fw_base }}.fd,readonly=on -drive format=raw,file=fat:rw:image" ./tests/gen_tests.sh ./tests/test_list.txt ./tests/run_tests.sh ncroxon-gnu-efi-157d47c/.github/workflows/windows-mingw.yml000066400000000000000000000051311471215650600240300ustar00rootroot00000000000000name: Windows, MinGW on: [push, pull_request] jobs: build: runs-on: windows-latest strategy: matrix: arch: [x64, ia32] include: - arch: x64 dir: x86_64 sys: mingw64 env: x86_64 - arch: ia32 dir: ia32 sys: mingw32 env: i686 defaults: run: shell: msys2 {0} steps: - name: Install MinGW uses: msys2/setup-msys2@v2 with: msystem: ${{ matrix.sys }} update: true install: >- mingw-w64-${{ matrix.env }}-toolchain base-devel git - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Build run: make - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.arch }} path: ./${{ matrix.dir }}/apps/*.efi tests: runs-on: ubuntu-latest needs: build strategy: matrix: arch: [x64, ia32] include: - arch: x64 pkg: qemu-system-x86 qemu_arch: x86_64 qemu_opts: -M q35 fw_base: OVMF - arch: ia32 pkg: qemu-system-x86 qemu_arch: i386 qemu_opts: -M pc fw_base: OVMF steps: - name: Set up Linux environment run: | sudo apt-get update sudo apt-get -y --no-install-recommends install ${{ matrix.pkg }} - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download artifacts uses: actions/download-artifact@v4 with: name: ${{ matrix.arch }} - name: Download UEFI firmware run: | fw_arch=$(echo ${{ matrix.arch }} | tr a-z A-Z) fw_zip=${{ matrix.fw_base }}-${fw_arch}.zip curl -O https://efi.akeo.ie/${{ matrix.fw_base }}/${fw_zip} 7z x ${fw_zip} rm ${fw_zip} - name: Download UEFI Shell run: | curl -L -O https://github.com/pbatard/UEFI-Shell/releases/download/23H2/UEFI-Shell-2.2-23H2-RELEASE.iso mkdir ./image 7z x -o./image *.iso rm *.iso - name: Run tests run: | export UEFI_ARCH=${{ matrix.arch }} export UEFI_DIR=./image export QEMU_CMD="qemu-system-${{ matrix.qemu_arch }} ${{ matrix.qemu_opts }} -L . -drive if=pflash,format=raw,unit=0,file=${{ matrix.fw_base }}.fd,readonly=on -drive format=raw,file=fat:rw:image -nodefaults -nographic -serial stdio -net none" ./tests/gen_tests.sh ./tests/test_list.txt ./tests/run_tests.sh ncroxon-gnu-efi-157d47c/.github/workflows/windows-vs2022.yml000066400000000000000000000053451471215650600236540ustar00rootroot00000000000000name: Windows, VS2022 on: [push, pull_request] jobs: build: runs-on: windows-latest strategy: matrix: arch: [x64, ia32, aa64, arm] conf: [Debug, Release] steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Add MSBuild to PATH uses: microsoft/setup-msbuild@v2 with: msbuild-architecture: x64 - name: Build shell: cmd run: msbuild ./gnu-efi.sln /m /p:Configuration=${{ matrix.conf }},Platform=${{ matrix.arch }} - name: Upload artifacts uses: actions/upload-artifact@v4 if: ${{ matrix.conf == 'Release' }} with: name: ${{ matrix.arch }} path: ./${{ matrix.arch }}/${{ matrix.conf }}/*.efi tests: runs-on: ubuntu-latest needs: build strategy: matrix: arch: [x64, ia32, aa64, arm] include: - arch: x64 pkg: qemu-system-x86 qemu_arch: x86_64 qemu_opts: -M q35 fw_base: OVMF - arch: ia32 pkg: qemu-system-x86 qemu_arch: i386 qemu_opts: -M pc fw_base: OVMF - arch: aa64 pkg: qemu-system-arm qemu_arch: aarch64 qemu_opts: -M virt -cpu cortex-a57 fw_base: AAVMF - arch: arm pkg: qemu-system-arm qemu_arch: arm qemu_opts: -M virt -cpu cortex-a15 fw_base: AAVMF steps: - name: Set up Linux environment run: | sudo apt-get update sudo apt-get -y --no-install-recommends install ${{ matrix.pkg }} - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download artifacts uses: actions/download-artifact@v4 with: name: ${{ matrix.arch }} - name: Download UEFI firmware run: | fw_arch=$(echo ${{ matrix.arch }} | tr a-z A-Z) fw_zip=${{ matrix.fw_base }}-${fw_arch}.zip curl -O https://efi.akeo.ie/${{ matrix.fw_base }}/${fw_zip} 7z x ${fw_zip} rm ${fw_zip} - name: Download UEFI Shell run: | curl -L -O https://github.com/pbatard/UEFI-Shell/releases/download/23H2/UEFI-Shell-2.2-23H2-RELEASE.iso mkdir ./image 7z x -o./image *.iso rm *.iso - name: Run tests run: | export UEFI_ARCH=${{ matrix.arch }} export UEFI_DIR=./image export QEMU_CMD="qemu-system-${{ matrix.qemu_arch }} ${{ matrix.qemu_opts }} -L . -drive if=pflash,format=raw,unit=0,file=${{ matrix.fw_base }}.fd,readonly=on -drive format=raw,file=fat:rw:image -nodefaults -nographic -serial stdio -net none" ./tests/gen_tests.sh ./tests/test_list.txt ./tests/run_tests.sh ncroxon-gnu-efi-157d47c/.gitignore000066400000000000000000000000551471215650600170670ustar00rootroot00000000000000*.efi *.efi.debug *.o *.a *.so *.tar.* *.tar ncroxon-gnu-efi-157d47c/.vs/000077500000000000000000000000001471215650600156055ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/.vs/apps/000077500000000000000000000000001471215650600165505ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/.vs/apps/AllocPages.vcxproj000066400000000000000000000011131471215650600221730ustar00rootroot00000000000000 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE} AllocPages 10.0 AllocPages ncroxon-gnu-efi-157d47c/.vs/apps/AllocPages.vcxproj.filters000066400000000000000000000012721471215650600236500ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/FreePages.vcxproj000066400000000000000000000011061471215650600220240ustar00rootroot00000000000000 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666} FreePages 10.0 FreePages ncroxon-gnu-efi-157d47c/.vs/apps/FreePages.vcxproj.filters000066400000000000000000000012671471215650600235030ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/_gen_vcxproj.ps1000066400000000000000000000034171471215650600216650ustar00rootroot00000000000000$Source = "AllocPages" $EfiArchName = @{ "x64" = "x64" "Win32" = "ia32" "ARM64" = "aa64" "ARM" = "arm" } $i = 0 $sln = (Get-Content ..\..\gnu-efi.sln) -as [collections.arraylist] Get-ChildItem "..\..\apps" -Filter *.c | Foreach-Object { if ($_.BaseName -ne $Source) { $guid = [guid]::NewGuid().ToString().ToUpper() Write-Host $guid = $_.BaseName copy "$Source.vcxproj" "$($_.BaseName).vcxproj" copy "$Source.vcxproj.filters" "$($_.BaseName).vcxproj.filters" copy "$Source.vcxproj.user" "$($_.BaseName).vcxproj.user" (Get-Content "$($_.BaseName).vcxproj").Replace("DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE", $guid).Replace($Source, $_.BaseName) | Set-Content "$($_.BaseName).vcxproj" (Get-Content "$($_.BaseName).vcxproj.filters").Replace($Source, $_.BaseName) | Set-Content "$($_.BaseName).vcxproj.filters" $line = 14 + 5 * $i $sln.insert($line,"Project(""{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"") = ""$($_.BaseName)"", "".vs\apps\$($_.BaseName).vcxproj"", ""{$guid}""") $line++ $sln.insert($line," ProjectSection(ProjectDependencies) = postProject") $line++ $sln.insert($line," {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974}") $line++ $sln.insert($line," EndProjectSection") $line++ $sln.insert($line,"EndProject") $line++ $line += 44 + 16 * $i foreach ($Build in @("Debug", "Release")) { foreach ($Arch in @("ARM64", "ARM", "Win32", "x64")) { foreach ($Cfg in @("ActiveCfg", "Build.0")) { $sln.insert($line, " {$guid}.$Build|$($EfiArchName.$Arch).$Cfg = $Build|$Arch") $line++ } } } $line += 6 + $i $sln.insert($line, " {$guid} = {DF105116-5A3A-4D48-AB1D-7221690ED545}") $i++ } } $sln | Set-Content ..\..\gnu-efi.sln ncroxon-gnu-efi-157d47c/.vs/apps/bltgrid.vcxproj000066400000000000000000000011001471215650600216040ustar00rootroot00000000000000 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C} bltgrid 10.0 bltgrid ncroxon-gnu-efi-157d47c/.vs/apps/bltgrid.vcxproj.filters000066400000000000000000000012651471215650600232670ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/common.props000066400000000000000000000436221471215650600211340ustar00rootroot00000000000000 Debug ARM Debug ARM64 Debug Win32 Debug x64 Release ARM Release ARM64 Release Win32 Release x64 x64 Application true v143 Unicode Application true v143 Unicode Application true v143 Unicode true Application true v143 Unicode true Application false v143 Unicode Application false v143 Unicode Application false v143 Unicode true Application false v143 Unicode true .efi false false $(SolutionDir)x64\$(Configuration)\ $(OutDir)$(ProjectName)\ .efi false false $(SolutionDir)ia32\$(Configuration)\ $(OutDir)$(ProjectName)\ .efi false false $(SolutionDir)arm\$(Configuration)\ $(OutDir)$(ProjectName)\ .efi false false $(SolutionDir)aa64\$(Configuration)\ $(OutDir)$(ProjectName)\ .efi false false $(SolutionDir)x64\$(Configuration)\ $(OutDir)$(ProjectName)\ .efi false false $(SolutionDir)ia32\$(Configuration)\ $(OutDir)$(ProjectName)\ .efi false false $(SolutionDir)arm\$(Configuration)\ $(OutDir)$(ProjectName)\ .efi false false $(SolutionDir)aa64\$(Configuration)\ $(OutDir)$(ProjectName)\ $(SolutionDir)\inc %(PreprocessorDefinitions) false CompileAsC Level3 4091 ProgramDatabase Default false /Oi- %(AdditionalOptions) EFI Application true efilib.lib;libcmtd.lib;%(AdditionalDependencies) false true efi_main EFI Application $(OutDir);%(AdditionalLibraryDirectories) true $(SolutionDir)\inc %(PreprocessorDefinitions) false CompileAsC Level3 ProgramDatabase 4091 Default false /Oi- %(AdditionalOptions) EFI Application true efilib.lib;libcmtd.lib;%(AdditionalDependencies) false true efi_main EFI Application $(OutDir);%(AdditionalLibraryDirectories) true MachineX86 $(SolutionDir)\inc %(PreprocessorDefinitions) false CompileAsC Level3 ProgramDatabase 4091 Default false /Oi- %(AdditionalOptions) EFI Application true efilib.lib;libcmtd.lib;%(AdditionalDependencies) false true efi_main EFI Application $(OutDir);%(AdditionalLibraryDirectories) true $(SolutionDir)\inc %(PreprocessorDefinitions) false CompileAsC Level3 ProgramDatabase 4091 Default false /Oi- %(AdditionalOptions) EFI Application true efilib.lib;libcmtd.lib;%(AdditionalDependencies) false true efi_main EFI Application $(OutDir);%(AdditionalLibraryDirectories) true $(SolutionDir)\inc %(PreprocessorDefinitions) false CompileAsC Level3 4091 false /Oi- %(AdditionalOptions) EFI Application true false true efi_main EFI Application efilib.lib;libcmt.lib;%(AdditionalDependencies) $(OutDir);%(AdditionalLibraryDirectories) true $(SolutionDir)\inc %(PreprocessorDefinitions) false CompileAsC Level3 4091 false /Oi- %(AdditionalOptions) EFI Application true false true efi_main EFI Application efilib.lib;libcmt.lib;%(AdditionalDependencies) $(OutDir);%(AdditionalLibraryDirectories) true $(SolutionDir)\inc %(PreprocessorDefinitions) false CompileAsC Level3 4091 false /Oi- %(AdditionalOptions) EFI Application true false true efi_main EFI Application efilib.lib;libcmt.lib;%(AdditionalDependencies) $(OutDir);%(AdditionalLibraryDirectories) true $(SolutionDir)\inc %(PreprocessorDefinitions) false CompileAsC Level3 4091 false /Oi- %(AdditionalOptions) EFI Application true false true efi_main EFI Application efilib.lib;libcmt.lib;%(AdditionalDependencies) $(OutDir);%(AdditionalLibraryDirectories) true ncroxon-gnu-efi-157d47c/.vs/apps/debughook.vcxproj000066400000000000000000000011061471215650600221320ustar00rootroot00000000000000 {090590E4-A94D-477A-8512-42522BDDFE0C} debughook 10.0 debughook ncroxon-gnu-efi-157d47c/.vs/apps/debughook.vcxproj.filters000066400000000000000000000012671471215650600236110ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/drv0.vcxproj000066400000000000000000000037571471215650600210540ustar00rootroot00000000000000 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F} drv0 10.0 drv0 EFI Boot Service Driver EFI Boot Service Driver EFI Boot Service Driver EFI Boot Service Driver EFI Boot Service Driver EFI Boot Service Driver EFI Boot Service Driver EFI Boot Service Driver ncroxon-gnu-efi-157d47c/.vs/apps/drv0.vcxproj.filters000066400000000000000000000012621471215650600225100ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/drv0_use.vcxproj000066400000000000000000000011031471215650600217070ustar00rootroot00000000000000 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640} drv0_use 10.0 drv0_use ncroxon-gnu-efi-157d47c/.vs/apps/drv0_use.vcxproj.filters000066400000000000000000000012661471215650600233700ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/exit.vcxproj000066400000000000000000000010671471215650600211420ustar00rootroot00000000000000 {80BD2830-EF30-4110-97BA-1B9A7B855996} exit 10.0 exit ncroxon-gnu-efi-157d47c/.vs/apps/exit.vcxproj.filters000066400000000000000000000012621471215650600226060ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/lfbgrid.vcxproj000066400000000000000000000011001471215650600215660ustar00rootroot00000000000000 {7C059723-3CD2-484B-8064-238CE7A437BD} lfbgrid 10.0 lfbgrid ncroxon-gnu-efi-157d47c/.vs/apps/lfbgrid.vcxproj.filters000066400000000000000000000012651471215650600232510ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/modelist.vcxproj000066400000000000000000000011031471215650600220000ustar00rootroot00000000000000 {5AD238D9-79AA-4166-BC86-EF759EA45BAB} modelist 10.0 modelist ncroxon-gnu-efi-157d47c/.vs/apps/modelist.vcxproj.filters000066400000000000000000000012661471215650600234610ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/printenv.vcxproj000066400000000000000000000011031471215650600220250ustar00rootroot00000000000000 {731CD95E-7CCD-495F-9456-E2D71357C807} printenv 10.0 printenv ncroxon-gnu-efi-157d47c/.vs/apps/printenv.vcxproj.filters000066400000000000000000000012661471215650600235060ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/route80h.vcxproj000066400000000000000000000011031471215650600216360ustar00rootroot00000000000000 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1} route80h 10.0 route80h ncroxon-gnu-efi-157d47c/.vs/apps/route80h.vcxproj.filters000066400000000000000000000012661471215650600233170ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/setdbg.vcxproj000066400000000000000000000010751471215650600214400ustar00rootroot00000000000000 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5} setdbg 10.0 setdbg ncroxon-gnu-efi-157d47c/.vs/apps/setdbg.vcxproj.filters000066400000000000000000000012641471215650600231070ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/setjmp.vcxproj000066400000000000000000000010751471215650600214720ustar00rootroot00000000000000 {8EC47C20-B7C3-4B82-8B06-967A15C7B323} setjmp 10.0 setjmp ncroxon-gnu-efi-157d47c/.vs/apps/setjmp.vcxproj.filters000066400000000000000000000012641471215650600231410ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/t.vcxproj000066400000000000000000000010561471215650600204320ustar00rootroot00000000000000 {9BA1F692-0824-442E-B700-69C3D85D64EE} t 10.0 t ncroxon-gnu-efi-157d47c/.vs/apps/t.vcxproj.filters000066400000000000000000000012571471215650600221040ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/t2.vcxproj000066400000000000000000000010611471215650600205100ustar00rootroot00000000000000 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6} t2 10.0 t2 ncroxon-gnu-efi-157d47c/.vs/apps/t2.vcxproj.filters000066400000000000000000000012601471215650600221600ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/t3.vcxproj000066400000000000000000000010611471215650600205110ustar00rootroot00000000000000 {AFF91400-F772-419A-9463-D9900B43C666} t3 10.0 t3 ncroxon-gnu-efi-157d47c/.vs/apps/t3.vcxproj.filters000066400000000000000000000012601471215650600221610ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/t4.vcxproj000066400000000000000000000010611471215650600205120ustar00rootroot00000000000000 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E} t4 10.0 t4 ncroxon-gnu-efi-157d47c/.vs/apps/t4.vcxproj.filters000066400000000000000000000012601471215650600221620ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/t5.vcxproj000066400000000000000000000010611471215650600205130ustar00rootroot00000000000000 {7F52AAA4-2071-49D6-A783-529D3CB5AF61} t5 10.0 t5 ncroxon-gnu-efi-157d47c/.vs/apps/t5.vcxproj.filters000066400000000000000000000012601471215650600221630ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/t6.vcxproj000066400000000000000000000010611471215650600205140ustar00rootroot00000000000000 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60} t6 10.0 t6 ncroxon-gnu-efi-157d47c/.vs/apps/t6.vcxproj.filters000066400000000000000000000012601471215650600221640ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/t7.vcxproj000066400000000000000000000010611471215650600205150ustar00rootroot00000000000000 {04D2685F-8150-47E0-BC10-338D2D6B804C} t7 10.0 t7 ncroxon-gnu-efi-157d47c/.vs/apps/t7.vcxproj.filters000066400000000000000000000012601471215650600221650ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/t8.vcxproj000066400000000000000000000010611471215650600205160ustar00rootroot00000000000000 {6C664A44-BC53-4225-A14B-D969D4EED647} t8 10.0 t8 ncroxon-gnu-efi-157d47c/.vs/apps/t8.vcxproj.filters000066400000000000000000000012601471215650600221660ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/tcc.vcxproj000066400000000000000000000010641471215650600207370ustar00rootroot00000000000000 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA} tcc 10.0 tcc ncroxon-gnu-efi-157d47c/.vs/apps/tcc.vcxproj.filters000066400000000000000000000012611471215650600224050ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/apps/unsetdbg.vcxproj000066400000000000000000000011031471215650600217730ustar00rootroot00000000000000 {06089797-265A-4FF5-838E-25374C1F0159} unsetdbg 10.0 unsetdbg ncroxon-gnu-efi-157d47c/.vs/apps/unsetdbg.vcxproj.filters000066400000000000000000000012661471215650600234540ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd Source Files ncroxon-gnu-efi-157d47c/.vs/efilib.vcxproj000066400000000000000000000561701471215650600204650ustar00rootroot00000000000000 Debug ARM Debug ARM64 Debug Win32 Debug x64 Release ARM Release ARM64 Release Win32 Release x64 {3135D563-9596-4584-9ED6-616ADEC52974} gnuefi 10.0 efilib x64 StaticLibrary true v143 Unicode StaticLibrary true v143 Unicode StaticLibrary true v143 Unicode true StaticLibrary true v143 Unicode true StaticLibrary false v143 true Unicode StaticLibrary false v143 true Unicode StaticLibrary false v143 true Unicode true StaticLibrary false v143 true Unicode true $(SolutionDir)x64\$(Configuration)\ $(OutDir)$(ProjectName)\ $(SolutionDir)ia32\$(Configuration)\ $(OutDir)$(ProjectName)\ $(SolutionDir)arm\$(Configuration)\ $(OutDir)$(ProjectName)\ $(SolutionDir)aa64\$(Configuration)\ $(OutDir)$(ProjectName)\ $(SolutionDir)x64\$(Configuration)\ $(OutDir)$(ProjectName)\ $(SolutionDir)ia32\$(Configuration)\ $(OutDir)$(ProjectName)\ $(SolutionDir)arm\$(Configuration)\ $(OutDir)$(ProjectName)\ $(SolutionDir)aa64\$(Configuration)\ $(OutDir)$(ProjectName)\ Level3 Disabled $(SolutionDir)\inc false CompileAsC MultiThreadedDebug 4312 ProgramDatabase Default false /Oi- %(PreprocessorDefinitions) true EFI Application true Level3 Disabled $(SolutionDir)\inc false CompileAsC MultiThreadedDebug ProgramDatabase 4312 Default false /Oi- %(PreprocessorDefinitions) true EFI Application true Level3 Disabled $(SolutionDir)\inc false CompileAsC MultiThreadedDebug ProgramDatabase 4312 Default false /Oi- %(PreprocessorDefinitions) true EFI Application true Level3 Disabled $(SolutionDir)\inc false CompileAsC MultiThreadedDebug ProgramDatabase 4312 Default false /Oi- %(PreprocessorDefinitions) true EFI Application true Level3 $(SolutionDir)\inc false CompileAsC MultiThreaded 4312 false false /Oi- %(PreprocessorDefinitions) true true true EFI Application true Level3 $(SolutionDir)\inc false CompileAsC MultiThreaded 4312 false false /Oi- %(PreprocessorDefinitions) true true true EFI Application true Level3 $(SolutionDir)\inc false CompileAsC MultiThreaded 4312 false false /Oi- %(PreprocessorDefinitions) true true true EFI Application true Level3 $(SolutionDir)\inc false CompileAsC MultiThreaded 4312 false false /Oi- %(PreprocessorDefinitions) true true true EFI Application true true true false false true true true true true true false false true true true true false false true true true true true true false false true true true true true true true true true true false false true true true true true true false false true true true true true true true true false false true true true true true true false false ncroxon-gnu-efi-157d47c/.vs/efilib.vcxproj.filters000066400000000000000000000104441471215650600221260ustar00rootroot00000000000000 {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd {20c8e9bd-0fa8-46d3-b825-e3eebd64ab3d} {87122940-e80f-416d-a840-5e32f703f3ff} {e6e3d25a-4fce-4036-bef9-3cfbafc4baaf} {cf7e7031-77e5-4827-9aa6-f996fc4b3d06} Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files\arm Source Files\x86_64 Source Files\ia32 Source Files\x86_64 Source Files\ia32 Source Files\arm Source Files\aarch64 Source Files\aarch64 ncroxon-gnu-efi-157d47c/LICENSE000066400000000000000000000432541471215650600161140ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ncroxon-gnu-efi-157d47c/Make.defaults000077500000000000000000000211201471215650600175040ustar00rootroot00000000000000# -*- makefile -*- # Copyright (c) 1999-2007 Hewlett-Packard Development Company, L.P. # Contributed by David Mosberger # Contributed by Stephane Eranian # # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * 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. # * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS # BE LIABLE FOR ANYDIRECT, 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. # TOPDIR ?= $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) # # Variables below overridable from command-line: # make VARNAME=value ... # # # Where to install the package. GNU-EFI will create and access # lib and include under the root # DESTDIR ?= / ifeq ($(origin INSTALLROOT),undefined) INSTALLROOT = $(DESTDIR) endif empty := space := $(empty) $(empty) stripped = $(subst $(space),/,$(strip $(subst /,$(space),$(1)))) unstripped = $(subst $(space),/,$(subst /,$(space),$(1))) is_absolute = $(subst $(call stripped,$(1)),$(empty),$(call unstripped,$(1))) override INSTALLROOT:=$(if $(call is_absolute,$(INSTALLROOT)),,$(TOPDIR)/)$(INSTALLROOT) PREFIX := /usr/local EXEC_PREFIX := $(PREFIX) LIBDIR := $(EXEC_PREFIX)/lib INCLUDEDIR := $(PREFIX)/include INSTALL := install # Compilation tools HOSTCC := $(prefix)gcc CC := $(prefix)$(CROSS_COMPILE)gcc AS := $(prefix)$(CROSS_COMPILE)as LD := $(prefix)$(CROSS_COMPILE)ld AR := $(prefix)$(CROSS_COMPILE)ar RANLIB := $(prefix)$(CROSS_COMPILE)ranlib OBJCOPY := $(prefix)$(CROSS_COMPILE)objcopy # Set verbose or nonverbose output similarly to automake's silent rules. # Default is nonverbose, but, just like with automake, it can be disabled # with: 'make V=1' ifneq ($(V),1) HIDE=@ ECHO=echo else HIDE= ECHO=true endif # Host/target identification OS := $(shell uname -s) USING_APPLE ?= $(shell echo $(OS) | grep -q 'Darwin' && echo 1 || echo 0) USING_FREEBSD ?= $(shell echo $(OS) | grep -q 'FreeBSD' && echo 1 || echo 0) # FreeBSD uses clang with no gcc symlink ifeq ($(USING_FREEBSD),1) override HOSTCC := $(prefix)clang endif HOSTARCH ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed -e s,i[3456789]86,ia32, -e 's,armv[67].*,arm,' ) ARCH ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed -e s,i[3456789]86,ia32, -e 's,armv[67].*,arm,' ) # Get ARCH from the compiler if cross compiling ifneq ($(CROSS_COMPILE),) override ARCH := $(shell $(CC) -dumpmachine | cut -f1 -d-| sed -e s,i[3456789]86,ia32, -e 's,armv[67].*,arm,' ) endif # FreeBSD (and possibly others) reports amd64 instead of x86_64 ifeq ($(ARCH),amd64) override ARCH := x86_64 endif # Allow UEFI shorthands to be specified for the arch ifeq ($(ARCH),x64) override ARCH := x86_64 endif ifeq ($(ARCH),mips64) override ARCH := mips64el endif GCCVERSION := $(shell $(CC) -dumpversion | sed -e 's/-win32/.0/' | cut -f1 -d.) GCCMINOR := $(shell $(CC) -dumpversion | sed -e 's/-win32/.0/' | cut -f2 -d.) USING_CLANG := $(shell $(CC) -v 2>&1 | grep -q 'clang version' && echo clang || echo 0) NO_GLIBC ?= 0 # Rely on GCC MS ABI support? GCCNEWENOUGH := $(shell ( [ $(GCCVERSION) -gt "4" ] \ || ( [ $(GCCVERSION) -eq "4" ] \ && [ $(GCCMINOR) -ge "7" ] ) ) \ && echo 1) PART_ONE = $(shell echo "$(1)" | cut -f1 -d.) PART_TWO = $(shell echo "$(1)" | cut -f2 -d.) IS_NEW_ENOUGH = $(shell ( [ $(call PART_ONE,$(1)) -gt "$(2)" ] \ || ( [ $(call PART_ONE,$(1)) -eq "$(2)" ] \ && [ $(call PART_TWO,$(1)) -ge "$(3)" ] ) ) \ && echo 1) # # Where to build the package # OBJDIR := $(TOPDIR)/$(ARCH) # # Variables below derived from variables above # # Arch-specific compilation flags CPPFLAGS += -DCONFIG_$(ARCH) CFLAGS += -Wno-error=pragmas ifeq ($(ARCH),ia64) CFLAGS += -mfixed-range=f32-f127 endif ifeq ($(ARCH),ia32) CFLAGS += -mno-mmx -mno-sse ifeq ($(HOSTARCH),x86_64) ARCH3264 = -m32 endif endif # Set ISO C mode CPPFLAGS += -std=c11 ifeq ($(ARCH),x86_64) ifeq ($(GCCNEWENOUGH),1) CPPFLAGS += -DGNU_EFI_USE_MS_ABI ifneq ($(USING_CLANG),clang) CPPFLAGS += -maccumulate-outgoing-args endif endif CFLAGS += -mno-red-zone ifeq ($(HOSTARCH),ia32) ARCH3264 = -m64 endif endif ifneq (,$(filter $(ARCH),ia32 x86_64)) # Disable AVX, if the compiler supports that. CC_CAN_DISABLE_AVX=$(shell $(CC) -Werror -c -o /dev/null -xc -mno-avx - /dev/null 2>&1 && echo 1) ifeq ($(CC_CAN_DISABLE_AVX), 1) CFLAGS += -mno-avx endif endif ifeq ($(ARCH),mips64el) CFLAGS += -march=mips64r2 ARCH3264 = -mabi=64 endif # # Set HAVE_EFI_OBJCOPY if objcopy understands --target efi-[app|bsdrv|rtdrv], # otherwise we need to compose the PE/COFF header using the assembler # OBJCOPY_VERSION := $(shell $(OBJCOPY) --version | head -n 1 | awk '{print $$(NF)}') ifneq ($(ARCH),arm) ifneq ($(ARCH),mips64el) export HAVE_EFI_OBJCOPY=y endif endif ifeq ($(ARCH),riscv64) ifneq ($(call IS_NEW_ENOUGH,$(OBJCOPY_VERSION),2,42),1) export SYSTEM_HAS_EFI_OBJCOPY ?= 0 endif endif ifeq ($(ARCH),aarch64) ifneq ($(call IS_NEW_ENOUGH,$(OBJCOPY_VERSION),2,38),1) export SYSTEM_HAS_EFI_OBJCOPY ?= 0 endif endif ifeq ($(ARCH),ia32) ifeq ($(USING_APPLE),1) export SYSTEM_HAS_EFI_OBJCOPY ?= 0 endif endif ifeq ($(HAVE_EFI_OBJCOPY),y) export SYSTEM_HAS_EFI_OBJCOPY ?= 1 else export SYSTEM_HAS_EFI_OBJCOPY ?= 0 endif ifeq ($(USING_APPLE),1) CFLAGS += -D__GNU_EFI_NO_GLIBC endif ifeq ($(NO_GLIBC),1) CFLAGS += -D__GNU_EFI_NO_GLIBC endif ifeq ($(ARCH),arm) CFLAGS += -marm endif ifneq (,$(filter $(ARCH),aarch64 arm loongarch64)) LDFLAGS += -z common-page-size=4096 LDFLAGS += -z max-page-size=4096 endif # Generic compilation flags INCDIR += -I$(SRCDIR) -I$(TOPDIR)/inc -I$(TOPDIR)/inc/$(ARCH) \ -I$(TOPDIR)/inc/protocol # Only enable -fPIE for non MinGW compilers (unneeded on MinGW) GCCMACHINE := $(shell $(CC) -dumpmachine) IS_MINGW32 := $(findstring mingw32, $(GCCMACHINE)) ifeq ($(IS_MINGW32),) CFLAGS += -fPIE endif ifeq ($(USING_FREEBSD),1) CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \ -fno-strict-aliasing \ -ffreestanding -fno-stack-protector else CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Wno-pointer-sign -Werror \ -fno-strict-aliasing \ -ffreestanding -fno-stack-protector -fno-stack-check \ $(if $(findstring 0,$(USING_CLANG)),-Wno-error=maybe-uninitialized,) \ $(if $(findstring 0,$(USING_CLANG)),-fno-merge-all-constants,) endif # Force DWARF 4 on LLVM # Otherwise readelf becomes very unhappy ifeq ($(USING_CLANG),clang) CFLAGS += -gdwarf-4 endif # Force hard float (for library mismatch) ifeq ($(ARCH),arm) ifeq ($(USING_APPLE),1) CFLAGS += -mfloat-abi=hard -mfpu=vfpv2 endif endif ifeq ($(V),1) ARFLAGS := rDv else ARFLAGS := rD endif ASFLAGS += $(ARCH3264) LDFLAGS += -nostdlib ifeq ($(IS_MINGW32),) LDFLAGS += --warn-common --no-undefined --fatal-warnings \ --build-id=sha1 ifeq ($(USING_APPLE),0) LDFLAGS += -z norelro -z nocombreloc endif else LDFLAGS += -Wl,--warn-common -Wl,--no-undefined -Wl,--fatal-warnings \ -Wl,--build-id=sha1 endif ifneq ($(ARCH),arm) export LIBGCC=$(shell $(CC) $(CFLAGS) $(ARCH3264) -print-libgcc-file-name) endif ncroxon-gnu-efi-157d47c/Make.rules000066400000000000000000000061431471215650600170340ustar00rootroot00000000000000# # Copyright (C) 1999-2007 Hewlett-Packard Co. # Contributed by David Mosberger # Contributed by Stephane Eranian # # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * 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. # * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS # BE LIABLE FOR ANYDIRECT, 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. # .SECONDARY: CHAR_SUBSYSTEM=$(subst 0x,\x,$(SUBSYSTEM)) ifeq ($(IS_MINGW32),) %.efi: %.so @$(ECHO) " OBJCOPY $(notdir $@)" $(HIDE)$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .rodata -j .rel \ -j .rela -j .rel.* -j .rela.* -j .rel* -j .rela* \ -j .areloc -j .reloc $(FORMAT) $*.so $@ ifeq ($(ARCH),riscv64) ifeq ($(SYSTEM_HAS_EFI_OBJCOPY),0) $(HIDE)/bin/echo -ne "$(CHAR_SUBSYSTEM)" | dd of=$@ bs=1 seek=156 count=1 conv=notrunc status=none endif endif %.efi.debug: %.so @$(ECHO) " OBJCOPY $(notdir $@)" $(HIDE)$(OBJCOPY) -j .debug_info -j .debug_abbrev -j .debug_aranges \ -j .debug_line -j .debug_str -j .debug_ranges \ -j .note.gnu.build-id \ $(FORMAT) $*.so $@ %.so: %.o @$(ECHO) " LD $(notdir $@)" $(HIDE)$(LD) $(LDFLAGS) $^ -o $@ $(LOADLIBES) else %.efi: %.o @$(ECHO) " CCLD $(notdir $@)" $(HIDE)$(CC) $(LDFLAGS) $< -o $@ $(LOADLIBES) endif %.o: %.c @$(ECHO) " CC $(notdir $@)" $(HIDE)$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ %.s: %.c @$(ECHO) " CC $(notdir $@)" $(HIDE)$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -S $< -o $@ %.i: %.c @$(ECHO) " CPP $(notdir $@)" $(HIDE)$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -E $< -o $@ %.o: %.S @$(ECHO) " CC $(notdir $@)" $(HIDE)$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ %.s: %.S @$(ECHO) " CPP $(notdir $@)" $(HIDE)$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -E $< -o $@ ncroxon-gnu-efi-157d47c/Makefile000066400000000000000000000105521471215650600165420ustar00rootroot00000000000000# # Copyright (C) 1999-2007 Hewlett-Packard Co. # Contributed by David Mosberger # Contributed by Stephane Eranian # # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * 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. # * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS # BE LIABLE FOR ANYDIRECT, 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. # export VERSION = 4.0.0 MKFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) SRCDIR = $(dir $(MKFILE_PATH)) VPATH = $(SRCDIR) include $(SRCDIR)/Make.defaults SUBDIRS = lib inc apps ifeq ($(IS_MINGW32),) SUBDIRS += gnuefi endif all: check_gcc $(SUBDIRS) ifeq ($(IS_MINGW32),) gnuefi: lib apps: gnuefi else apps: lib endif mkvars: @echo AR=$(AR) @echo ARCH=$(ARCH) @echo ARCH3264=$(ARCH3264) @echo AS=$(AS) @echo ASFLAGS=$(ASFLAGS) @echo CC=$(CC) @echo CFLAGS=$(CFLAGS) @echo CPPFLAGS=$(CPPFLAGS) @echo GCCMINOR=$(GCCMINOR) @echo GCCNEWENOUGH=$(GCCNEWENOUGH) @echo GCCVERSION=$(GCCVERSION) @echo HOSTARCH=$(HOSTARCH) @echo INCDIR=$(INCDIR) @echo INSTALL=$(INSTALL) @echo INSTALLROOT=$(INSTALLROOT) @echo LD=$(LD) @echo LDFLAGS=$(LDFLAGS) @echo LIBDIR=$(LIBDIR) @echo OBJCOPY=$(OBJCOPY) @echo OS=$(OS) @echo prefix=$(prefix) @echo PREFIX=$(PREFIX) @echo RANLIB=$(RANLIB) @echo SRCDIR=$(SRCDIR) @echo TOPDIR=$(TOPDIR) $(SUBDIRS): mkdir -p $(OBJDIR)/$@ $(MAKE) -C $(OBJDIR)/$@ -f $(SRCDIR)/$@/Makefile SRCDIR=$(SRCDIR)/$@ ARCH=$(ARCH) clean: @rm -vrf *~ @set -e ; for d in $(SUBDIRS); do \ if [ -d $(OBJDIR)/$$d ]; then \ $(MAKE) -C $(OBJDIR)/$$d -f $(SRCDIR)/$$d/Makefile SRCDIR=$(SRCDIR)/$$d clean; \ fi; \ done install: @set -e ; for d in $(SUBDIRS); do \ mkdir -p $(OBJDIR)/$$d; \ $(MAKE) -C $(OBJDIR)/$$d -f $(SRCDIR)/$$d/Makefile SRCDIR=$(SRCDIR)/$$d install; done .PHONY: $(SUBDIRS) clean depend # # on both platforms you must use gcc 3.0 or higher # check_gcc: ifeq ($(GCC_VERSION),2) @echo "you need to use a version of gcc >= 3.0, you are using `$(CC) --version`" @exit 1 endif include $(SRCDIR)/Make.rules test-archive: @rm -rf /tmp/gnu-efi-$(VERSION) /tmp/gnu-efi-$(VERSION)-tmp @mkdir -p /tmp/gnu-efi-$(VERSION)-tmp @git archive --format=tar $(shell git branch | awk '/^*/ { print $$2 }') | ( cd /tmp/gnu-efi-$(VERSION)-tmp/ ; tar x ) @git diff | ( cd /tmp/gnu-efi-$(VERSION)-tmp/ ; patch -s -p1 -b -z .gitdiff ) @mv /tmp/gnu-efi-$(VERSION)-tmp/ /tmp/gnu-efi-$(VERSION)/ @dir=$$PWD; cd /tmp; tar -c --bzip2 -f $$dir/gnu-efi-$(VERSION).tar.bz2 gnu-efi-$(VERSION) @rm -rf /tmp/gnu-efi-$(VERSION) @echo "The archive is in gnu-efi-$(VERSION).tar.bz2" tag: git tag $(VERSION) refs/heads/master archive: tag @rm -rf /tmp/gnu-efi-$(VERSION) /tmp/gnu-efi-$(VERSION)-tmp @mkdir -p /tmp/gnu-efi-$(VERSION)-tmp @git archive --format=tar $(VERSION) | ( cd /tmp/gnu-efi-$(VERSION)-tmp/ ; tar x ) @mv /tmp/gnu-efi-$(VERSION)-tmp/ /tmp/gnu-efi-$(VERSION)/ @dir=$$PWD; cd /tmp; tar -c --bzip2 -f $$dir/gnu-efi-$(VERSION).tar.bz2 gnu-efi-$(VERSION) @rm -rf /tmp/gnu-efi-$(VERSION) @echo "The archive is in gnu-efi-$(VERSION).tar.bz2" ncroxon-gnu-efi-157d47c/README.md000066400000000000000000000422221471215650600163600ustar00rootroot00000000000000------------------------------------------------- Building EFI Applications Using the GNU Toolchain ------------------------------------------------- David Mosberger 23 September 1999 Copyright (c) 1999-2007 Hewlett-Packard Co. Copyright (c) 2006-2010 Intel Co. Last update (DD/MM/YYYY): 19/08/2024 # Introduction This document has two parts: the first part describes how to develop EFI applications for IA-64,x86 and x86_64 using the GNU toolchain and the EFI development environment contained in this directory. The second part describes some of the more subtle aspects of how this development environment works. # Part 1: Developing EFI Applications ## Prerequisites: To develop EFI applications, the following tools are needed: - A C11 compiler: gcc, clang (Supported since 4.0) or MSVC (Supported since 4.0) - A version of "objcopy" that supports EFI applications (if using a GNU based toolchain). To check if your version includes EFI support, issue the command: `objcopy --help` Verify that the line "supported targets" contains the string "efi-app-ia32" and "efi-app-x86_64" (for x86 and x64 respectively) and that the "-j" option accepts wildcards. The binutils release binutils-2.24 supports Intel64 EFI and accepts wildcard section names. - For debugging purposes, it's useful to have a version of "objdump" that supports EFI applications as well. This allows inspect and disassemble EFI binaries. Alternatively, use dumpbin on Windows from Visual Studio Development Tools, by launching it through Developer Command Prompt for Visual Studio. ## Directory Structure This EFI development environment contains the following subdirectories: - inc: This directory contains the EFI-related include files. The files are taken from Intel's EFI source distribution, except that various fixes were applied to make it compile with the GNU toolchain. - lib: This directory contains the source code for Intel's EFI library. Again, the files are taken from Intel's EFI source distribution, with changes to make them compile with the GNU toolchain. - gnuefi: This directory contains the glue necessary to convert ELF64 binaries to EFI binaries. Various runtime code bits, such as a self-relocator are included as well. This code has been contributed by the Hewlett-Packard Company and is distributed under the GNU GPL. - apps: This directory contains a few simple EFI test apps. - licenses: This directory contains the supplementary license files applicable to this project The main license is found in LICENSE - docs: This directory contains some additional notices about building with gnu-efi ## Setup It is necessary to edit the Makefile in the directory containing this README file before EFI applications can be built. Specifically, you should verify that macros CC, AS, LD, AR, RANLIB, and OBJCOPY point to the appropriate compiler, assembler, linker, ar, and ranlib binaries, respectively. If you're working in a cross-development environment, be sure to set macro ARCH to the desired target architecture ("ia32" for x86, "x86_64" for x86_64 and "ia64" for IA-64). For convenience, this can also be done from the make command line (e.g., "make ARCH=ia64"). ## Building To build the sample EFI applications provided in subdirectory "apps", simply invoke "make" in the toplevel directory (the directory containing this README file). This should build lib/libefi.a and gnuefi/libgnuefi.a first and then all the EFI applications such as a apps/t6.efi. ## Running Just copy the EFI application (e.g., apps/t6.efi) to the EFI filesystem, boot EFI, and then select "Invoke EFI application" to run the application you want to test. Alternatively, you can invoke the Intel-provided "nshell" application and then invoke your test binary via the command line interface that "nshell" provides. ## Writing Your Own EFI Application Suppose you have your own EFI application in a file called "apps/myefiapp.c". To get this application built by the GNU EFI build environment, simply add "myefiapp.efi" to macro TARGETS in apps/Makefile. Once this is done, invoke "make" in the top level directory. This should result in EFI application apps/myefiapp.efi, ready for execution. The GNU EFI build environment allows to write EFI applications as described in Intel's EFI documentation, except for two differences: - The EFI application's entry point is always called "efi_main". The declaration of this routine is: EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab); - UNICODE string literals must be written as W2U(L"Sample String") instead of just L"Sample String". The W2U() macro is defined in . This header file also declares the function W2UCpy() which allows to convert a wide string into a UNICODE string and store the result in a programmer-supplied buffer. - Calls to EFI services should be made via uefi_call_wrapper(). This ensures appropriate parameter passing for the architecture. # Part 2: Inner Workings WARNING: This part contains all the gory detail of how the GNU EFI toolchain works. Normal users do not have to worry about such details. Reading this part incurs a definite risk of inducing severe headaches or other maladies. The basic idea behind the GNU EFI build environment is to use the GNU toolchain to build a normal ELF binary that, at the end, is converted to an EFI binary. EFI binaries are really just PE32+ binaries. PE stands for "Portable Executable" and is the object file format Microsoft is using on its Windows platforms. PE is basically the COFF object file format with an MS-DOS2.0 compatible header slapped on in front of it. The "32" in PE32+ stands for 32 bits, meaning that PE32 is a 32-bit object file format. The plus in "PE32+" indicates that this format has been hacked to allow loading a 4GB binary anywhere in a 64-bit address space (unlike ELF64, however, this is not a full 64-bit object file format because the entire binary cannot span more than 4GB of address space). EFI binaries are plain PE32+ binaries except that the "subsystem id" differs from normal Windows binaries. There are two flavors of EFI binaries: "applications" and "drivers" and each has there own subsystem id and are identical otherwise. At present, the GNU EFI build environment supports the building of EFI applications only, though it would be trivial to generate drivers, as the only difference is the subsystem id. For more details on PE32+, see the [Specification](https://learn.microsoft.com/en-us/windows/win32/debug/pe-format). In theory, converting a suitable ELF64 binary to PE32+ is easy and could be accomplished with the "objcopy" utility by specifying option --target=efi-app-ia32 (x86) or --target=efi-app-ia64 (IA-64). But life never is that easy, so here some complicating factors: 1. COFF sections are very different from ELF sections. ELF binaries distinguish between program headers and sections. The program headers describe the memory segments that need to be loaded/initialized, whereas the sections describe what constitutes those segments. In COFF (and therefore PE32+) no such distinction is made. Thus, COFF sections need to be page aligned and have a size that is a multiple of the page size (4KB for EFI), whereas ELF allows sections at arbitrary addresses and with arbitrary sizes. 2. EFI binaries should be relocatable. Since EFI binaries are executed in physical mode, EFI cannot guarantee that a given binary can be loaded at its preferred address. EFI does _try_ to load a binary at it's preferred address, but if it can't do so, it will load it at another address and then relocate the binary using the contents of the .reloc section. 3. On IA-64, the EFI entry point needs to point to a function descriptor, not to the code address of the entry point. 4. The EFI specification assumes that wide characters use UNICODE encoding. ANSI C does not specify the size or encoding that a wide character uses. These choices are "implementation defined". On most UNIX systems, the GNU toolchain uses a wchar_t that is 4 bytes in size. The encoding used for such characters is (mostly) UCS4. In the following sections, we address how the GNU EFI build environment addresses each of these issues. ## (1) Accommodating COFF Sections In order to satisfy the COFF constraint of page-sized and page-aligned sections, the GNU EFI build environment uses the special linker script in gnuefi/elf_$(ARCH)_efi.lds where $(ARCH) is the target architecture ("ia32" for x86, "x86_64" for x86_64 and "ia64" for IA-64). This script is set up to create only eight COFF section, each page aligned and page sized.These eight sections are used to group together the much greater number of sections that are typically present in ELF object files. Specifically: - .text Collects all sections containing executable code. - .data Collects read-write data, literal string data, global offset tables, the uninitialized data segment (bss) and various other sections containing data. The reason the uninitialized data is placed in this section is that the EFI loader appears to be unable to handle sections that are allocated but not loaded from the binary. - .rodata Collects read-only data to retain the correct memory permissions The reason read-only data is placed here instead of the in .text is to make it possible to disassemble the .text section without getting garbage due to read-only data. Besides, since EFI binaries execute in physical mode, differences in page protection do not matter. - .dynamic, .rela, .rel, .reloc, .areloc These sections contains the dynamic information necessary to self-relocate the binary (see below). ### Unnecessary sections: - .hash (and/or .gnu.hash) Collects the ELF .hash info (this section _must_ be the first section in order to build a shared object file; the section is not actually loaded or used at runtime). GNU binutils provides a mechanism to generate different hash info via --hash-style= option. In this case output shared object will contain .hash section, .gnu.hash section or both. In order to generate correct output linker script preserves both types of hash sections. - .dynsym, .symtab The symbol tables used for ELF debugging A couple of more points worth noting about the linker script: - On IA-64, the global pointer symbol (__gp) needs to be placed such that the _entire_ EFI binary can be addressed using the signed 22-bit offset that the "addl" instruction affords. Specifically, this means that __gp should be placed at ImageBase + 0x200000. Strictly speaking, only a couple of symbols need to be addressable in this fashion, so with some care it should be possible to build binaries much larger than 4MB. To get a list of symbols that need to be addressable in this fashion, grep the assembly files in directory gnuefi for the string "@gprel". - The link address (ImageBase) of the binary is (arbitrarily) set to zero. This could be set to something larger to increase the chance of EFI being able to load the binary without requiring relocation. However, a start address of 0 makes debugging a wee bit easier (great for those of us who can add, but not subtract... ;-). - The relocation related sections (.dynamic, .rel, .rela, .reloc) cannot be placed inside .data because some tools in the GNU toolchain rely on the existence of these sections. - Some sections in the ELF binary intentionally get dropped when building the EFI binary. Particularly noteworthy are the dynamic relocation sections for the .plabel and .reloc sections. It would be _wrong_ to include these sections in the EFI binary because it would result in .reloc and .plabel being relocated twice (once by the EFI loader and once by the self-relocator; see below for a description of the latter). Specifically, only the sections mentioned with the -j option in the final "objcopy" command are retained in the EFI binary (see Make.rules). ## (2) Building Relocatable Binaries ELF binaries are normally linked for a fixed load address and are thus not relocatable. The only kind of ELF object that is relocatable are shared objects ("shared libraries"). However, even those objects are usually not completely position independent and therefore require runtime relocation by the dynamic loader. For example, IA-64 binaries normally require relocation of the global offset table. The approach to building relocatable binaries in the GNU EFI build environment is to: 1. build an ELF shared object 2. link it together with a self-relocator that takes care of applying the dynamic relocations that may be present in the ELF shared object 3. convert the resulting image to an EFI binary The self-relocator is of course architecture dependent. The x86 version can be found in gnuefi/reloc_ia32.c, the x86_64 version can be found in gnuefi/reloc_x86_64.c and the IA-64 version can be found in gnuefi/reloc_ia64.S. The self-relocator operates as follows: the startup code invokes it right after EFI has handed off control to the EFI binary at symbol "_start". Upon activation, the self-relocator searches the .dynamic section (whose starting address is given by symbol _DYNAMIC) for the dynamic relocation information, which can be found in the DT_REL, DT_RELSZ, and DT_RELENT entries of the dynamic table (DT_RELA, DT_RELASZ, and DT_RELAENT in the case of rela relocations, as is the case for IA-64). The dynamic relocation information points to the ELF relocation table. Once this table is found, the self-relocator walks through it, applying each relocation one by one. Since the EFI binaries are fully resolved shared objects, only a subset of all possible relocations need to be supported. Specifically, on x86 only the R_386_RELATIVE relocation is needed. On IA-64, the relocations R_IA64_DIR64LSB, R_IA64_REL64LSB, and R_IA64_FPTR64LSB are needed. Note that the R_IA64_FPTR64LSB relocation requires access to the dynamic symbol table. This is why the .dynsym section is included in the EFI binary. Another complication is that this relocation requires memory to hold the function descriptors (aka "procedure labels" or "plabels"). Each function descriptor uses 16 bytes of memory. The IA-64 self-relocator currently reserves a static memory area that can hold 100 of these descriptors. If the self-relocator runs out of space, it causes the EFI binary to fail with error code 5 (EFI_BUFFER_TOO_SMALL). When this happens, the manifest constant MAX_FUNCTION_DESCRIPTORS in gnuefi/reloc_ia64.S should be increased and the application recompiled. An easy way to count the number of function descriptors required by an EFI application is to run the command: `objdump --dynamic-reloc example.so | fgrep FPTR64 | wc -l` assuming "example" is the name of the desired EFI application. ## (3) Creating the Function Descriptor for the IA-64 EFI Binaries As mentioned above, the IA-64 PE32+ format assumes that the entry point of the binary is a function descriptor. A function descriptors consists of two double words: the first one is the code entry point and the second is the global pointer that should be loaded before calling the entry point. Since the ELF toolchain doesn't know how to generate a function descriptor for the entry point, the startup code in gnuefi/crt0-efi-ia64.S crafts one manually by with the code: .section .plabel, "a" _start_plabel: data8 _start data8 __gp this places the procedure label for entry point _start in a section called ".plabel". Now, the only problem is that _start and __gp need to be relocated _before_ EFI hands control over to the EFI binary. Fortunately, PE32+ defines a section called ".reloc" that can achieve this. Thus, in addition to manually crafting the function descriptor, the startup code also crafts a ".reloc" section that has will cause the EFI loader to relocate the function descriptor before handing over control to the EFI binary (again, see the PECOFF spec mentioned above for details). A final question may be why .plabel and .reloc need to go in their own COFF sections. The answer is simply: we need to be able to discard the relocation entries that are generated for these sections. By placing them in these sections, the relocations end up in sections ".rela.plabel" and ".rela.reloc" which makes it easy to filter them out in the filter script. Also, the ".reloc" section needs to be in its own section so that the objcopy program can recognize it and can create the correct directory entries in the PE32+ binary. ## (4) Convenient and Portable Generation of UNICODE String Literals From gnu-efi-3.0, we made use (and somewhat abused) the gcc option that forces wide characters (WCHAR_T) to use short integers (2 bytes) instead of integers (4 bytes). This way we match the Unicode character size. By abuse, we mean that we rely on the fact that the regular ASCII characters are encoded the same way between (short) wide characters and Unicode and basically only use the first byte. This allows us to just use them interchangeably. The gcc option to force short wide characters is : -fshort-wchar We have since defined CHAR16 to be char16_t which allows us to use the C11 'u' string literals instead hence avoiding abuse of short wide characters ***The End*** ncroxon-gnu-efi-157d47c/SECURITY.md000066400000000000000000000007521471215650600166740ustar00rootroot00000000000000# Security Policy ## Supported Versions | Version | Supported | | ------- | ------------------ | | 4.0.x | :white_check_mark: | | 3.0.x | :x: | | 3.0a | :x: | ## Reporting a Vulnerability Please provide: 1. Details of how the EFI binary was produced 2. Where the vulnerability is found in gnu-efi's source code (if known) 3. Steps to (re-)produce the vulnerability [Report here](https://github.com/ncroxon/gnu-efi/security/advisories/new) ncroxon-gnu-efi-157d47c/apps/000077500000000000000000000000001471215650600160425ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/apps/AllocPages.c000066400000000000000000000134041471215650600202220ustar00rootroot00000000000000 /* * Copyright (C) 2013 Jerry Hoemann * * * Application to allocate memory at EFI. Syntax of command * mimics the EFI Boot Service "AllocatePages." * * See UEFI spec 2.3, Section 6.2. * * FS1:\> memmap Type Start End #pages Attributes BS_Code 0000000000000000-0000000000000FFF 0000000000000001 000000000000000F Available 0000000000001000-000000000008DFFF 000000000000008D 000000000000000F Reserved 000000000008E000-000000000008FFFF 0000000000000002 000000000000000F Available 0000000000090000-000000000009FFFF 0000000000000010 000000000000000F Available 0000000000100000-000000000FFFFFFF 000000000000FF00 000000000000000F BS_Code 0000000010000000-0000000010061FFF 0000000000000062 000000000000000F Available 0000000010062000-000000005CDFFFFF 000000000004CD9E 000000000000000F ACPI_NVS 000000005CE00000-000000005DDFFFFF 0000000000001000 000000000000000F BS_Data 000000005DE00000-000000005DFFFFFF 0000000000000200 000000000000000F Available 000000005E000000-000000005EF1CFFF 0000000000000F1D 000000000000000F BS_Data 000000005EF1D000-00000000709FBFFF 0000000000011ADF 000000000000000F Available 00000000709FC000-00000000710E3FFF 00000000000006E8 000000000000000F LoaderCode 00000000710E4000-00000000711FEFFF 000000000000011B 000000000000000F Available 00000000711FF000-0000000071901FFF 0000000000000703 000000000000000F BS_Code 0000000071902000-00000000721FEFFF 00000000000008FD 000000000000000F Example to allocat 5 pages type BootCode at address 20000000 (hex) FS1:\> AllocPages.efi 2 3 5 20000000 AllocatePage: __AllocType__ __MemType__ __NumPages__ [__Addr__] __AllocType__ {0,1,2} -- Any, MaxAddr, Addr __MemType__ {0..13}, Reserved ==0, LCode==1, LData==2, BSCode==3, BSData==4, ... __NumPages__ {0..F000000} [__Addr__] 0... 3FFFFFFFFFFF All numbers in hex no leading 0x AllocatPage(2,3,5,20000000) Example to allocat 5 pages type BootCode at address 30000000 (hex) FS1:\> AllocPages.efi 2 3 5 30000000 AllocatePage: __AllocType__ __MemType__ __NumPages__ [__Addr__] __AllocType__ {0,1,2} -- Any, MaxAddr, Addr __MemType__ {0..13}, Reserved ==0, LCode==1, LData==2, BSCode==3, BSData==4, ... __NumPages__ {0..F000000} [__Addr__] 0... 3FFFFFFFFFFF All numbers in hex no leading 0x FS1:\> memmap Type Start End #pages Attributes BS_Code 0000000000000000-0000000000000FFF 0000000000000001 000000000000000F Available 0000000000001000-000000000008DFFF 000000000000008D 000000000000000F Reserved 000000000008E000-000000000008FFFF 0000000000000002 000000000000000F Available 0000000000090000-000000000009FFFF 0000000000000010 000000000000000F Available 0000000000100000-000000000FFFFFFF 000000000000FF00 000000000000000F BS_Code 0000000010000000-0000000010061FFF 0000000000000062 000000000000000F Available 0000000010062000-000000001FFFFFFF 000000000000FF9E 000000000000000F BS_Code 0000000020000000-0000000020004FFF 0000000000000005 000000000000000F Available 0000000020005000-000000002FFFFFFF 000000000000FFFB 000000000000000F BS_Code 0000000030000000-0000000030004FFF 0000000000000005 000000000000000F Available 0000000030005000-000000005CDFFFFF 000000000002CDFB 000000000000000F ACPI_NVS 000000005CE00000-000000005DDFFFFF 0000000000001000 000000000000000F BS_Data 000000005DE00000-000000005DFFFFFF 0000000000000200 000000000000000F Available 000000005E000000-000000005EF1CFFF 0000000000000F1D 000000000000000F BS_Data 000000005EF1D000-00000000709FBFFF 0000000000011ADF 000000000000000F Available 00000000709FC000-00000000710E3FFF 00000000000006E8 000000000000000F LoaderCode 00000000710E4000-00000000711FEFFF 000000000000011B 000000000000000F Available 00000000711FF000-0000000071901FFF 0000000000000703 000000000000000F BS_Code 0000000071902000-00000000721FEFFF 00000000000008FD 000000000000000F */ #include #include #define MAX_NUM_PAGES 0x000000000F000000 #define MAX_ADDR ((1ULL << 46) - 1) #ifdef DEBUG #undef DEBUG #endif #define DEBUG 0 EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { EFI_STATUS efi_status; CHAR16 **argv; INTN argc; INTN err = 0; #if DEBUG INTN c = 0; #endif INTN AllocType = -1; INTN MemType = -1; INTN NumPages = -1; EFI_PHYSICAL_ADDRESS Addr = 0; InitializeLib(image, systab); Print(u"AllocatePage: __AllocType__ __MemType__ __NumPages__ [__Addr__]\n"); Print(u"__AllocType__ {0,1,2} -- Any, MaxAddr, Addr\n"); Print(u"__MemType__ {0..13}, Reserved ==0, LCode==1, LData==2, BSCode==3, BSData==4, ...\n"); Print(u"__NumPages__ {0..%x}\n", MAX_NUM_PAGES); Print(u"[__Addr__] 0... %llx\n", MAX_ADDR); Print(u"All numbers in hex no leading 0x\n"); Print(u"\n"); #if DEBUG Print(u"Now get argc/argv\n"); #endif argc = GetShellArgcArgv(image, &argv); #if DEBUG Print(u"argc = %d\n", argc); #endif #if DEBUG for (c = 0; c < argc; c++ ) { Print(u"argv[%d] = <%s>\n", c, argv[c]); } #endif if ( (argc < 4) || (argc > 5) ) { Print(u"Wrong argument count\n"); return EFI_SUCCESS; } AllocType = xtoi(argv[1]); MemType = xtoi(argv[2]); NumPages = xtoi(argv[3]); if ( argc == 5 ) Addr = xtoi(argv[4]); if ( (AllocType < 0) || (AllocType > 2)) { Print(u"Invalid AllocType\n"); err++; } if ( (MemType < 0) || (MemType > 13) ) { Print(u"Invalid MemType\n"); err++; } if ( (NumPages < 0) || (NumPages > MAX_NUM_PAGES) ) { Print(u"Inavlid NumPages\n"); err++; } if ( Addr > MAX_ADDR ) { Print(u"Inavlid Address\n"); err++; } if ( err ) { return EFI_INVALID_PARAMETER; } Print(u"AllocatPage(%d,%d,%d,%lx)\n", AllocType, MemType, NumPages, Addr); efi_status = uefi_call_wrapper(BS->AllocatePages, 4, AllocType, MemType, NumPages, &Addr); if ( EFI_ERROR(efi_status) ) { Print(u"Allocate Pages Failed: %d\n", efi_status); return efi_status; } return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/FreePages.c000066400000000000000000000101511471215650600200450ustar00rootroot00000000000000 /* * Copyright (C) 2013 Jerry Hoemann * * Application to allocate memory at EFI. Syntax of command * mimics the EFI Boot Service "FreePages." * * See UEFI spec 2.3, Section 6.2. * Example freeing a 5 page BS_Code setment at address: 0000000020000000 (hex) FS1:\> memmap Type Start End #pages Attributes BS_Code 0000000000000000-0000000000000FFF 0000000000000001 000000000000000F Available 0000000000001000-000000000008DFFF 000000000000008D 000000000000000F Reserved 000000000008E000-000000000008FFFF 0000000000000002 000000000000000F Available 0000000000090000-000000000009FFFF 0000000000000010 000000000000000F Available 0000000000100000-000000000FFFFFFF 000000000000FF00 000000000000000F BS_Code 0000000010000000-0000000010061FFF 0000000000000062 000000000000000F Available 0000000010062000-000000001FFFFFFF 000000000000FF9E 000000000000000F BS_Code 0000000020000000-0000000020004FFF 0000000000000005 000000000000000F Available 0000000020005000-000000005DDFFFFF 000000000003DDFB 000000000000000F BS_Data 000000005DE00000-000000005DFFFFFF 0000000000000200 000000000000000F Available 000000005E000000-000000006DE7CFFF 000000000000FE7D 000000000000000F ACPI_NVS 000000006DE7D000-000000006EE7CFFF 0000000000001000 000000000000000F BS_Data 000000006EE7D000-00000000709FBFFF 0000000000001B7F 000000000000000F Available 00000000709FC000-00000000710E3FFF 00000000000006E8 000000000000000F FS1:\> FreePages 0000000020000000 5 FreePages: __PhysAddr__ __PgCnt__ __PhysAddr__ 0... 3FFFFFFFFFFF __PgCnt__ [0..F000000] All numbers hex w/ no leading 0x FreePages(20000000,5) FS1:\> memmap Type Start End #pages Attributes BS_Code 0000000000000000-0000000000000FFF 0000000000000001 000000000000000F Available 0000000000001000-000000000008DFFF 000000000000008D 000000000000000F Reserved 000000000008E000-000000000008FFFF 0000000000000002 000000000000000F Available 0000000000090000-000000000009FFFF 0000000000000010 000000000000000F Available 0000000000100000-000000000FFFFFFF 000000000000FF00 000000000000000F BS_Code 0000000010000000-0000000010061FFF 0000000000000062 000000000000000F Available 0000000010062000-000000005DDFFFFF 000000000004DD9E 000000000000000F BS_Data 000000005DE00000-000000005DFFFFFF 0000000000000200 000000000000000F Available 000000005E000000-000000006DE7CFFF 000000000000FE7D 000000000000000F ACPI_NVS 000000006DE7D000-000000006EE7CFFF 0000000000001000 000000000000000F BS_Data 000000006EE7D000-00000000709FBFFF 0000000000001B7F 000000000000000F Available 00000000709FC000-00000000710E3FFF 00000000000006E8 000000000000000F */ #include #include /* * FreePages: __PhysAddr__ __PgCnt__ * */ #define MAX_NUM_PAGES 0x000000000F000000 #define MAX_ADDR ((1ULL << 46) - 1) #ifdef DEBUG #undef DEBUG #endif #define DEBUG 0 EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { EFI_STATUS efi_status; CHAR16 **argv; INTN argc = 0; #if DEBUG INTN c = 0; #endif INTN err = 0; INTN PgCnt = -1; EFI_PHYSICAL_ADDRESS PhysAddr = 0; InitializeLib(image, systab); Print(u"FreePages: __PhysAddr__ __PgCnt__\n"); Print(u"__PhysAddr__ 0... %llx\n", MAX_ADDR); Print(u"__PgCnt__ [0..%lx]\n", MAX_NUM_PAGES); Print(u"All numbers hex w/ no leading 0x\n"); Print(u"\n"); #if DEBUG Print(u"Now parse argc/argv\n"); #endif argc = GetShellArgcArgv(image, &argv); #if DEBUG Print(u"argc = %d\n", argc); #endif #if DEBUG for (c = 0; c < argc; c++ ) { Print(u"argv[%d] = <%s>\n", c, argv[c]); } #endif if (argc != 3) { Print(u"Invalid argument count\n"); return EFI_SUCCESS; } PhysAddr = xtoi(argv[1]); PgCnt = xtoi(argv[2]); if ( (PgCnt < 0) || (PgCnt > MAX_NUM_PAGES) ) { Print(u"Inavlid PgCnt\n"); err++; } if ( PhysAddr > MAX_ADDR ) { Print(u"Inavlid Address\n"); err++; } if ( err ) { return EFI_SUCCESS; } Print(u"FreePages(%lx,%d)\n", PhysAddr, PgCnt); efi_status = uefi_call_wrapper(BS->FreePages, 2, PhysAddr, PgCnt); if ( EFI_ERROR(efi_status) ) { Print(u"Free Pages Failed: %d\n", efi_status); return efi_status; } return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/Makefile000066400000000000000000000076371471215650600175170ustar00rootroot00000000000000# # Copyright (C) 1999-2001 Hewlett-Packard Co. # Contributed by David Mosberger # Contributed by Stephane Eranian # # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * 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. # * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS # BE LIABLE FOR ANYDIRECT, 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. # SRCDIR = . VPATH = $(SRCDIR) TOPDIR = $(SRCDIR)/.. include $(SRCDIR)/../Make.defaults LINUX_HEADERS = /usr/src/sys/build APPSDIR = $(LIBDIR)/gnuefi/apps CPPFLAGS += -D__KERNEL__ -I$(LINUX_HEADERS)/include ifneq ($(HAVE_EFI_OBJCOPY),) ifeq ($(SYSTEM_HAS_EFI_OBJCOPY),0) CRT0_LOCAL = -local LDS_LOCAL = _local endif endif ifeq ($(IS_MINGW32),) # The CRT0 libs are only needed for non MinGW platforms CRT0_LIBS = -lgnuefi endif ifneq ($(CRT0_LIBS),) CRTOBJS = $(TOPDIR)/$(ARCH)/gnuefi/crt0-efi-$(ARCH)$(CRT0_LOCAL).o LDSCRIPT = $(TOPDIR)/gnuefi/elf_$(ARCH)_efi$(LDS_LOCAL).lds ifeq ($(USING_FREEBSD),1) LDSCRIPT = $(TOPDIR)/gnuefi/elf_$(ARCH)_fbsd_efi.lds endif LDFLAGS += -L$(TOPDIR)/$(ARCH)/lib -L$(TOPDIR)/$(ARCH)/gnuefi $(CRTOBJS) LOADLIBES += -T $(LDSCRIPT) endif LDFLAGS += -shared -Bsymbolic -L$(TOPDIR)/$(ARCH)/lib LOADLIBES += -lefi $(CRT0_LIBS) LOADLIBES += $(LIBGCC) TARGET_APPS = t.efi t2.efi t3.efi t4.efi t5.efi t6.efi t7.efi t8.efi \ tcc.efi printenv.efi modelist.efi route80h.efi drv0_use.efi \ AllocPages.efi exit.efi FreePages.efi bltgrid.efi \ lfbgrid.efi setdbg.efi unsetdbg.efi old_ABI.efi ifeq ($(IS_MINGW32),) TARGET_APPS += setjmp.efi debughook.efi debughook.efi.debug \ ctors_test.efi ctors_dtors_priority_test.efi endif ifeq ($(USING_FREEBSD),0) TARGET_BSDRIVERS = drv0.efi else TARGET_BSDRIVERS = endif TARGET_RTDRIVERS = SUBSYSTEM := 0xa $(TARGET_BSDRIVERS): SUBSYSTEM = 0xb $(TARGET_RTDRIVERS): SUBSYSTEM = 0xc ifeq ($(SYSTEM_HAS_EFI_OBJCOPY),1) FORMAT := -O efi-app-$(ARCH) $(TARGET_BSDRIVERS): FORMAT=-O efi-bsdrv-$(ARCH) $(TARGET_RTDRIVERS): FORMAT=-O efi-rtdrv-$(ARCH) ifneq ($(IS_MINGW32),) LDFLAGS += -s -Wl,-dll -Wl,--subsystem,$(SUBSYSTEM) ifeq ($(ARCH),ia32) LDFLAGS += -e _efi_main else LDFLAGS += -e efi_main endif endif else FORMAT := -O binary LDFLAGS += --defsym=EFI_SUBSYSTEM=$(SUBSYSTEM) endif TARGETS = $(TARGET_APPS) $(TARGET_BSDRIVERS) $(TARGET_RTDRIVERS) all: $(TARGETS) ctors_test.so : ctors_fns.o ctors_test.o clean: @rm -vf $(TARGETS) *~ *.o *.so install: mkdir -p $(INSTALLROOT)$(APPSDIR) $(INSTALL) -m 644 $(TARGETS) $(INSTALLROOT)$(APPSDIR) .PHONY: install include $(SRCDIR)/../Make.rules ncroxon-gnu-efi-157d47c/apps/bltgrid.c000066400000000000000000000060641471215650600176430ustar00rootroot00000000000000#include #include extern EFI_GUID GraphicsOutputProtocol; static void fill_boxes(UINT32 *PixelBuffer, UINT32 Width, UINT32 Height) { UINT32 y, x = 0; /* * This assums BGRR, but it doesn't really matter; we pick red and * green so it'll just be blue/green if the pixel format is backwards. */ EFI_GRAPHICS_OUTPUT_BLT_PIXEL Red = {0, 0, 0xff, 0}, Green = {0, 0xff, 0, 0}, *Color; for (y = 0; y < Height; y++) { Color = ((y / 32) % 2 == 0) ? &Red : &Green; for (x = 0; x < Width; x++) { if (x % 32 == 0 && x != 0) Color = (Color == &Red) ? &Green : &Red; PixelBuffer[y * Width + x] = *(UINT32 *)Color; } } } static void draw_boxes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop) { int i, imax; EFI_STATUS rc; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info; UINTN NumPixels; UINT32 *PixelBuffer; UINT32 BufferSize; if (gop->Mode) { imax = gop->Mode->MaxMode; } else { Print(u"gop->Mode is NULL\n"); return; } for (i = 0; i < imax; i++) { UINTN SizeOfInfo; rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo, &info); if (rc == EFI_NOT_STARTED) { Print(u"gop->QueryMode() returned %r\n", rc); Print(u"Trying to start GOP with SetMode().\n"); rc = uefi_call_wrapper(gop->SetMode, 2, gop, gop->Mode ? gop->Mode->Mode : 0); rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo, &info); } if (EFI_ERROR(rc)) { Print(u"%d: Bad response from QueryMode: %r (%d)\n", i, rc, rc); continue; } if (CompareMem(info, gop->Mode->Info, sizeof (*info))) continue; NumPixels = (UINTN)info->VerticalResolution * (UINTN)info->HorizontalResolution; BufferSize = (UINT32)(NumPixels * sizeof(UINT32)); PixelBuffer = AllocatePool(BufferSize); if (!PixelBuffer) { Print(u"Allocation of 0x%08lx bytes failed.\n", sizeof(UINT32) * NumPixels); return; } fill_boxes(PixelBuffer, info->HorizontalResolution, info->VerticalResolution); uefi_call_wrapper(gop->Blt, 10, gop, (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)PixelBuffer, EfiBltBufferToVideo, 0, 0, 0, 0, info->HorizontalResolution, info->VerticalResolution, 0); FreePool(PixelBuffer); return; } Print(u"Never found the active video mode?\n"); } static EFI_STATUS SetWatchdog(UINTN seconds) { EFI_STATUS rc; rc = uefi_call_wrapper(BS->SetWatchdogTimer, 4, seconds, 0x1ffff, 0, NULL); if (EFI_ERROR(rc)) { CHAR16 Buffer[64]; StatusToString(Buffer, rc); Print(u"Bad response from QueryMode: %s (%d)\n", Buffer, rc); } return rc; } EFI_STATUS efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) { EFI_STATUS rc; EFI_GRAPHICS_OUTPUT_PROTOCOL *gop; InitializeLib(image_handle, systab); SetWatchdog(10); rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop); if (EFI_ERROR(rc)) { Print(u"Could not locate GOP: %r\n", rc); return rc; } if (!gop) { Print(u"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc); return EFI_UNSUPPORTED; } draw_boxes(gop); SetWatchdog(0); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/ctors_dtors_priority_test.c000066400000000000000000000015671471215650600235640ustar00rootroot00000000000000#include #include // 101 in init_array, 65434 in ctors static void __attribute__((constructor(101))) EFI_NO_TAIL_CALL ctors101() { Print(u"1) ctor with lower numbered priority \r\n"); } // 65434 in init_array, 101 in ctors static void __attribute__((constructor(65434))) EFI_NO_TAIL_CALL ctors65434() { Print(u"2) ctor with higher numbered priority \r\n"); } // 101 in fini_array, 65434 in dtors static void __attribute__((destructor(101))) EFI_NO_TAIL_CALL dtors101() { Print(u"4) dtor with lower numbered priority \r\n"); } // 65434 in fini_array, 101 in dtors static void __attribute__((destructor(65434))) EFI_NO_TAIL_CALL dtors65434() { Print(u"3) dtor with higher numbered priority \r\n"); } EFI_STATUS efi_main (EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED) { Print(u"Main function \r\n"); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/ctors_fns.c000066400000000000000000000013561471215650600202130ustar00rootroot00000000000000/* * ctors.c * Copyright 2019 Peter Jones * */ #include #include int constructed_value = 0; static void __attribute__((__constructor__)) EFI_NO_TAIL_CALL ctor(void) { Print(u"%a:%d:%a() constructed_value:%d\n", __FILE__, __LINE__, __func__, constructed_value); constructed_value = 1; Print(u"%a:%d:%a() constructed_value:%d\n", __FILE__, __LINE__, __func__, constructed_value); } static void __attribute__((__destructor__)) EFI_NO_TAIL_CALL dtor(void) { Print(u"%a:%d:%a() constructed_value:%d\n", __FILE__, __LINE__, __func__, constructed_value); constructed_value = 0; Print(u"%a:%d:%a() constructed_value:%d\n", __FILE__, __LINE__, __func__, constructed_value); } // vim:fenc=utf-8:tw=75:noet ncroxon-gnu-efi-157d47c/apps/ctors_test.c000066400000000000000000000006001471215650600203730ustar00rootroot00000000000000/* * ctors_test.c * Copyright 2019 Peter Jones * */ #include #include extern int constructed_value; EFI_STATUS efi_main (EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED) { Print(u"%a:%d:%a() constructed_value:%d\n", __FILE__, __LINE__, __func__, constructed_value); return EFI_SUCCESS; } // vim:fenc=utf-8:tw=75:noet ncroxon-gnu-efi-157d47c/apps/debughook.c000066400000000000000000000036571471215650600201700ustar00rootroot00000000000000#include #include EFI_STATUS GetVariableAttr(CHAR16 *var, UINT8 **data, UINTN *len, EFI_GUID owner, UINT32 *attributes) { EFI_STATUS efi_status; *len = 0; efi_status = uefi_call_wrapper(RT->GetVariable, 5, var, &owner, NULL, len, NULL); if (efi_status != EFI_BUFFER_TOO_SMALL) return efi_status; *data = AllocateZeroPool(*len); if (!*data) return EFI_OUT_OF_RESOURCES; efi_status = uefi_call_wrapper(RT->GetVariable, 5, var, &owner, attributes, len, *data); if (efi_status != EFI_SUCCESS) { FreePool(*data); *data = NULL; } return efi_status; } EFI_STATUS GetVariable(CHAR16 *var, UINT8 **data, UINTN *len, EFI_GUID owner) { return GetVariableAttr(var, data, len, owner, NULL); } EFI_GUID DUMMY_GUID = {0x55aad538, 0x8f82, 0x4e2a, {0xa4,0xf0,0xbe, 0x59, 0x13, 0xb6, 0x5f, 0x1e}}; static EFI_OPTNONE void DebugHook(void) { EFI_GUID guid = DUMMY_GUID; UINT8 *data = NULL; UINTN dataSize = 0; EFI_STATUS efi_status; register volatile unsigned long long x = 0; extern char _text, _data; if (x) return; efi_status = GetVariable(u"DUMMY_DEBUG", &data, &dataSize, guid); if (EFI_ERROR(efi_status)) { return; } Print(u"add-symbol-file /usr/lib/debug/boot/efi/debughook.debug " u"0x%08x -s .data 0x%08x\n", &_text, &_data); Print(u"Pausing for debugger attachment.\n"); Print(u"To disable this, remove the EFI variable DUMMY_DEBUG-%g .\n", &guid); x = 1; while (x++) { /* Make this so it can't /totally/ DoS us. */ #if defined(__x86_64__) || defined(__i386__) || defined(__i686__) if (x > 4294967294ULL) break; __asm__ __volatile__("pause"); #elif defined(__aarch64__) if (x > 1000) break; __asm__ __volatile__("wfi"); #else if (x > 12000) break; uefi_call_wrapper(BS->Stall, 1, 5000); #endif } x = 1; } EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { InitializeLib(image, systab); DebugHook(); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/drv0.c000066400000000000000000000120621471215650600170620ustar00rootroot00000000000000/* * Copyright (C) 2013 David Decotigny * * Sample EFI shell session, together with drv0_use.efi: * * # Loading first instance: * * fs0:\> load drv0.efi * Driver instance loaded successfully. * load: Image fs0:\drv0.efi loaded at 2FD7C000 - Success * * # Testing 1st instance: * * fs0:\> drv0_use.efi * Playing with driver instance 0... * Hello Sample UEFI Driver! * Hello was called 1 time(s). * * fs0:\> drv0_use.efi * Playing with driver instance 0... * Hello Sample UEFI Driver! * Hello was called 2 time(s). * * # Loading another instance: * * fs0:\> load drv0.efi * Driver instance loaded successfully. * load: Image fs0:\drv0.efi loaded at 2FD6D000 - Success * * # Using both instances: * * fs0:\> drv0_use.efi * Playing with driver instance 0... * Hello Sample UEFI Driver! * Hello was called 3 time(s). * Playing with driver instance 1... * Hello Sample UEFI Driver! * Hello was called 1 time(s). * * fs0:\> drv0_use.efi * Playing with driver instance 0... * Hello Sample UEFI Driver! * Hello was called 4 time(s). * Playing with driver instance 1... * Hello Sample UEFI Driver! * Hello was called 2 time(s). * * # Removing 1st instance: * * fs0:\> dh * Handle dump * 1: Image(DxeCore) * [...] * 79: Image(\/drv0.efi) ImageDevPath (..A,0x800,0x17F7DF)/\/drv0.efi) * 7A: Image(\/drv0.efi) ImageDevPath (..A,0x800,0x17F7DF)/\/drv0.efi) * * fs0:\> unload 79 * 79: Image(\/drv0.efi) ImageDevPath (..A,0x800,0x17F7DF)/\/drv0.efi) * Unload driver image (y/n)? y * Driver instance unloaded. * unload: Success * * # Only 2nd instance remaining: * * fs0:\> drv0_use.efi * Playing with driver instance 0... * Hello Sample UEFI Driver! * Hello was called 3 time(s). * * # Removing 2nd/last instance: * * fs0:\> dh * Handle dump * 1: Image(DxeCore) * [...] * 79: Image(\/drv0.efi) ImageDevPath (..A,0x800,0x17F7DF)/\/drv0.efi) * * fs0:\> unload 79 * 79: Image(\/drv0.efi) ImageDevPath (..A,0x800,0x17F7DF)/\/drv0.efi) * Unload driver image (y/n)? y * Driver instance unloaded. * unload: Success * * # Expect error: no other drv0 instance left * * fs0:\> drv0_use.efi * Error looking up handles for proto: 14 */ #include #include #include "drv0.h" static const EFI_GUID GnuEfiAppsDrv0ProtocolGuid = GNU_EFI_APPS_DRV0_PROTOCOL_GUID; static struct { GNU_EFI_APPS_DRV0_PROTOCOL Proto; UINTN Counter; } InternalGnuEfiAppsDrv0ProtocolData; static EFI_STATUS EFI_FUNCTION Drv0SayHello( IN const CHAR16 *HelloWho ) { if (! HelloWho) return EFI_INVALID_PARAMETER; Print(u"Hello %s!\n", HelloWho); InternalGnuEfiAppsDrv0ProtocolData.Counter ++; return EFI_SUCCESS; } static EFI_STATUS EFI_FUNCTION Drv0GetNumberOfHello( OUT UINTN *NumberOfHello ) { if (! NumberOfHello) return EFI_INVALID_PARAMETER; *NumberOfHello = InternalGnuEfiAppsDrv0ProtocolData.Counter; return EFI_SUCCESS; } static EFI_STATUS EFI_FUNCTION Drv0Unload(IN EFI_HANDLE ImageHandle) { LibUninstallProtocolInterfaces(ImageHandle, &GnuEfiAppsDrv0ProtocolGuid, &InternalGnuEfiAppsDrv0ProtocolData.Proto, NULL); Print(u"Driver instance unloaded.\n", ImageHandle); return EFI_SUCCESS; } EFI_STATUS efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SysTab) { EFI_STATUS Status; EFI_LOADED_IMAGE *LoadedImage = NULL; InitializeLib(ImageHandle, SysTab); /* Initialize global protocol definition + data */ InternalGnuEfiAppsDrv0ProtocolData.Proto.SayHello = (GNU_EFI_APPS_DRV0_SAY_HELLO) Drv0SayHello; InternalGnuEfiAppsDrv0ProtocolData.Proto.GetNumberOfHello = (GNU_EFI_APPS_DRV0_GET_NUMBER_OF_HELLO) Drv0GetNumberOfHello; InternalGnuEfiAppsDrv0ProtocolData.Counter = 0; /* Grab handle to this image: we'll attach our proto instance to it */ Status = uefi_call_wrapper(BS->OpenProtocol, 6, ImageHandle, &LoadedImageProtocol, (void**)&LoadedImage, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (EFI_ERROR(Status)) { Print(u"Could not open loaded image protocol: %d\n", Status); return Status; } /* Attach our proto to the current driver image */ Status = LibInstallProtocolInterfaces( &ImageHandle, &GnuEfiAppsDrv0ProtocolGuid, &InternalGnuEfiAppsDrv0ProtocolData.Proto, NULL); if (EFI_ERROR(Status)) { Print(u"Error registering driver instance: %d\n", Status); return Status; } /* Register Unload callback, used to unregister current protocol * instance from system */ LoadedImage->Unload = (EFI_IMAGE_UNLOAD)Drv0Unload; Print(u"Driver instance loaded successfully.\n"); return EFI_SUCCESS; /* at this point, this instance stays resident * until image is unloaded, eg. with shell's unload, * ExitBootServices() */ } ncroxon-gnu-efi-157d47c/apps/drv0.h000066400000000000000000000013241471215650600170660ustar00rootroot00000000000000#ifndef _GNU_EFI_APPS_DRV0_H_ #define _GNU_EFI_APPS_DRV0_H_ #ifdef __cplusplus extern "C" { #endif /* UEFI naming conventions */ #define GNU_EFI_APPS_DRV0_PROTOCOL_GUID \ { 0xe4dcafd0, 0x586c, 0x4b3d, {0x86, 0xe7, 0x28, 0xde, 0x7f, 0xcc, 0x04, 0xb9} } INTERFACE_DECL(_GNU_EFI_APPS_DRV0_PROTOCOL); typedef EFI_STATUS (EFIAPI *GNU_EFI_APPS_DRV0_SAY_HELLO) ( IN const CHAR16 *HelloWho ); typedef EFI_STATUS (EFIAPI *GNU_EFI_APPS_DRV0_GET_NUMBER_OF_HELLO) ( OUT UINTN *NumberOfHello ); typedef struct _GNU_EFI_APPS_DRV0_PROTOCOL { GNU_EFI_APPS_DRV0_SAY_HELLO SayHello; GNU_EFI_APPS_DRV0_GET_NUMBER_OF_HELLO GetNumberOfHello; } GNU_EFI_APPS_DRV0_PROTOCOL; #ifdef __cplusplus } #endif #endif ncroxon-gnu-efi-157d47c/apps/drv0_use.c000066400000000000000000000036741471215650600177470ustar00rootroot00000000000000/* * Copyright (C) 2013 David Decotigny * * See drv0.c for an example session. */ #include #include #include "drv0.h" static EFI_GUID GnuEfiAppsDrv0ProtocolGuid = GNU_EFI_APPS_DRV0_PROTOCOL_GUID; static EFI_STATUS PlayWithGnuEfiAppsDrv0Protocol(IN EFI_HANDLE DrvHandle) { EFI_STATUS Status; GNU_EFI_APPS_DRV0_PROTOCOL *drv = NULL; UINTN NumberOfHello = 0; Status = uefi_call_wrapper(BS->OpenProtocol, 6, DrvHandle, &GnuEfiAppsDrv0ProtocolGuid, (void**)&drv, DrvHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (EFI_ERROR(Status)) { Print(u"Cannot open proto: %d\n", Status); return Status; } Status = uefi_call_wrapper(drv->SayHello, 2, u"Sample UEFI Driver"); if (EFI_ERROR(Status)) { Print(u"Cannot call SayHello: %d\n", Status); } Status = uefi_call_wrapper(drv->GetNumberOfHello, 2, &NumberOfHello); if (EFI_ERROR(Status)) { Print(u"Cannot call GetNumberOfHello: %d\n", Status); } else { Print(u"Hello was called %d time(s).\n", NumberOfHello); } return EFI_SUCCESS; } EFI_STATUS efi_main (EFI_HANDLE Image, EFI_SYSTEM_TABLE *SysTab) { EFI_STATUS Status; EFI_HANDLE *Handles = NULL; UINTN i, NoHandles = 0; InitializeLib(Image, SysTab); Status = LibLocateHandle(ByProtocol, &GnuEfiAppsDrv0ProtocolGuid, NULL, &NoHandles, &Handles); if (EFI_ERROR(Status)) { Print(u"Error looking up handles for proto: %d\n", Status); return Status; } for (i = 0 ; i < NoHandles ; ++i) { Print(u"Playing with driver instance %d...\n", i); Status = PlayWithGnuEfiAppsDrv0Protocol(Handles[i]); if (EFI_ERROR(Status)) Print(u"Error playing with instance %d, skipping\n", i); } if (Handles) FreePool(Handles); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/exit.c000066400000000000000000000003201471215650600171520ustar00rootroot00000000000000#include #include EFI_STATUS efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) { InitializeLib(image_handle, systab); Exit(EFI_SUCCESS, 0, NULL); return EFI_UNSUPPORTED; } ncroxon-gnu-efi-157d47c/apps/lfbgrid.c000066400000000000000000000106771471215650600176320ustar00rootroot00000000000000#include #include extern EFI_GUID GraphicsOutputProtocol; #ifdef _MSC_VER #if defined(_M_X64) || defined (_M_ARM64) #define __SIZEOF_POINTER__ 8 #elif defined(_M_IX86) || defined(_M_ARM) #define __SIZEOF_POINTER__ 4 #else #error "Unknown arch" #endif #endif #ifdef __GNUC__ #define be32_to_cpu(x) __builtin_bswap32(x) #else static inline UINT32 be32_to_cpu(const UINT32 x) { return ((x >> 24) & 0x000000FFUL) | ((x << 24) & 0xFF000000UL) | ((x >> 8) & 0x0000FF00UL) | ((x << 8) & 0x00FF0000UL); } #endif static void fill_boxes(UINT32 *PixelBuffer, UINT32 Width, UINT32 Height, UINT32 Pitch, EFI_GRAPHICS_PIXEL_FORMAT Format, EFI_PIXEL_BITMASK Info ) { UINT32 Red, Green; UINT32 y, x, color; switch(Format) { case PixelRedGreenBlueReserved8BitPerColor: Red = be32_to_cpu(0xff000000); Green = be32_to_cpu(0x00ff0000); break; case PixelBlueGreenRedReserved8BitPerColor: Red = be32_to_cpu(0x0000ff00); Green = be32_to_cpu(0x00ff0000); break; case PixelBitMask: Red = Info.RedMask; Green = Info.GreenMask; break; case PixelBltOnly: return; default: Print(u"Invalid pixel format\n"); return; } for (y = 0; y < Height; y++) { color = ((y / 32) % 2 == 0) ? Red : Green; for (x = 0; x < Width; x++) { if (x % 32 == 0 && x != 0) color = (color == Red) ? Green : Red; PixelBuffer[y * Pitch + x] = color; } } } static void draw_boxes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop) { int i, imax; EFI_STATUS rc; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info; UINTN NumPixels; UINT32 *PixelBuffer; UINT32 CopySize, BufferSize; #if __SIZEOF_POINTER__ == 8 UINT64 FrameBufferAddr; #elif __SIZEOF_POINTER__ == 4 UINT32 FrameBufferAddr; #else #error YOUR ARCH HERE #endif if (gop->Mode) { imax = gop->Mode->MaxMode; } else { Print(u"gop->Mode is NULL\n"); return; } for (i = 0; i < imax; i++) { UINTN SizeOfInfo; rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo, &info); if (rc == EFI_NOT_STARTED) { Print(u"gop->QueryMode() returned %r\n", rc); Print(u"Trying to start GOP with SetMode().\n"); rc = uefi_call_wrapper(gop->SetMode, 2, gop, gop->Mode ? gop->Mode->Mode : 0); rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo, &info); } if (EFI_ERROR(rc)) { Print(u"%d: Bad response from QueryMode: %r (%d)\n", i, rc, rc); continue; } if (CompareMem(info, gop->Mode->Info, sizeof (*info))) continue; NumPixels = (UINTN)info->VerticalResolution * (UINTN)info->PixelsPerScanLine; BufferSize = (UINT32)(NumPixels * sizeof(UINT32)); if (BufferSize == gop->Mode->FrameBufferSize) { CopySize = BufferSize; } else { CopySize = BufferSize < gop->Mode->FrameBufferSize ? BufferSize : (UINT32)gop->Mode->FrameBufferSize; Print(u"height * pitch * pixelsize = %lu buf fb size is %lu; using %lu\n", BufferSize, gop->Mode->FrameBufferSize, CopySize); } PixelBuffer = AllocatePool(BufferSize); if (!PixelBuffer) { Print(u"Allocation of 0x%08lx bytes failed.\n", sizeof(UINT32) * NumPixels); return; } fill_boxes(PixelBuffer, info->HorizontalResolution, info->VerticalResolution, info->PixelsPerScanLine, info->PixelFormat, info->PixelInformation); if (info->PixelFormat == PixelBltOnly) { Print(u"No linear framebuffer on this device.\n"); return; } #if __SIZEOF_POINTER__ == 8 FrameBufferAddr = (UINT64)gop->Mode->FrameBufferBase; #elif __SIZEOF_POINTER__ == 4 FrameBufferAddr = (UINT32)(UINT64)gop->Mode->FrameBufferBase; #else #error YOUR ARCH HERE #endif CopyMem((VOID *)FrameBufferAddr, PixelBuffer, CopySize); return; } Print(u"Never found the active video mode?\n"); } static EFI_STATUS SetWatchdog(UINTN seconds) { EFI_STATUS rc; rc = uefi_call_wrapper(BS->SetWatchdogTimer, 4, seconds, 0x1ffff, 0, NULL); if (EFI_ERROR(rc)) { CHAR16 Buffer[64]; StatusToString(Buffer, rc); Print(u"Bad response from QueryMode: %s (%d)\n", Buffer, rc); } return rc; } EFI_STATUS efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) { EFI_STATUS rc; EFI_GRAPHICS_OUTPUT_PROTOCOL *gop; InitializeLib(image_handle, systab); SetWatchdog(10); rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop); if (EFI_ERROR(rc)) { Print(u"Could not locate GOP: %r\n", rc); return rc; } if (!gop) { Print(u"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc); return EFI_UNSUPPORTED; } draw_boxes(gop); SetWatchdog(0); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/modelist.c000066400000000000000000000047251471215650600200360ustar00rootroot00000000000000#include #include extern EFI_GUID GraphicsOutputProtocol; static void print_modes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop) { int i, imax; EFI_STATUS rc; if (gop->Mode) { imax = gop->Mode->MaxMode; Print(u"GOP reports MaxMode %d\n", imax); } else { Print(u"gop->Mode is NULL\n"); imax = 1; } for (i = 0; i < imax; i++) { EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info; UINTN SizeOfInfo; rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo, &info); if (rc == EFI_NOT_STARTED) { Print(u"gop->QueryMode() returned %r\n", rc); Print(u"Trying to start GOP with SetMode().\n"); rc = uefi_call_wrapper(gop->SetMode, 2, gop, gop->Mode ? gop->Mode->Mode : 0); rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo, &info); } if (EFI_ERROR(rc)) { Print(u"%d: Bad response from QueryMode: %r (%d)\n", i, rc, rc); continue; } Print(u"%c%d: %dx%d ", (gop->Mode && CompareMem(info,gop->Mode->Info,sizeof(*info)) == 0 ) ? '*' : ' ', i, info->HorizontalResolution, info->VerticalResolution); switch(info->PixelFormat) { case PixelRedGreenBlueReserved8BitPerColor: Print(u"RGBR"); break; case PixelBlueGreenRedReserved8BitPerColor: Print(u"BGRR"); break; case PixelBitMask: Print(u"R:%08x G:%08x B:%08x X:%08x", info->PixelInformation.RedMask, info->PixelInformation.GreenMask, info->PixelInformation.BlueMask, info->PixelInformation.ReservedMask); break; case PixelBltOnly: Print(u"(blt only)"); break; default: Print(u"(Invalid pixel format)"); break; } Print(u" pitch %d\n", info->PixelsPerScanLine); } } static EFI_STATUS SetWatchdog(UINTN seconds) { EFI_STATUS rc; rc = uefi_call_wrapper(BS->SetWatchdogTimer, 4, seconds, 0x1ffff, 0, NULL); if (EFI_ERROR(rc)) { CHAR16 Buffer[64]; StatusToString(Buffer, rc); Print(u"Bad response from QueryMode: %s (%d)\n", Buffer, rc); } return rc; } EFI_STATUS efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) { EFI_STATUS rc; EFI_GRAPHICS_OUTPUT_PROTOCOL *gop; InitializeLib(image_handle, systab); SetWatchdog(10); rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop); if (EFI_ERROR(rc)) { Print(u"Could not locate GOP: %r\n", rc); return rc; } if (!gop) { Print(u"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc); return EFI_UNSUPPORTED; } print_modes(gop); SetWatchdog(0); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/old_ABI.c000066400000000000000000000015571471215650600174470ustar00rootroot00000000000000#define GNU_EFI_3_0_COMPAT #include #include /* EFI_TIMESTAMP_PROTOCOL */ #define TEST_GUID { 0xafbfde41, 0x2e6e, 0x4262,\ { 0xba, 0x65, 0x62, 0xb9, 0x23, 0x6e, 0x54, 0x95 }} EFI_STATUS efi_main (EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED) { CHAR16 *Dest = 0; EFI_UNUSED CHAR16 *Copy = 0; UINTN test_str_size = 0; CONST CHAR16 *test_str = u"Hello World!"; test_str_size = StrSize(test_str); Dest = AllocatePool(test_str_size); CopyMem(Dest, test_str, test_str_size); Copy = ReallocatePool(Dest, test_str_size, test_str_size+10); Print(u"Done CopyMem and ReallocatePool!\r\n"); EFI_GUID a = TEST_GUID; EFI_GUID b = TEST_GUID; if (CompareGuid(&a, &b) == 0) { Print(u"CompareGuid ok!\r\n"); } else { Print(u"CompareGuid fail!\r\n"); } return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/printenv.c000066400000000000000000000013251471215650600200540ustar00rootroot00000000000000#include #include EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { EFI_STATUS status; CHAR16 name[256], *val, fmt[20]; EFI_GUID vendor; UINTN size; InitializeLib(image, systab); name[0] = 0; vendor = NullGuid; Print(u"GUID Variable Name Value\n"); Print(u"=================================== ==================== ========\n"); StrCpy(fmt, u"%.-35g %.-20s %s\n"); while (1) { size = sizeof(name); status = uefi_call_wrapper(RT->GetNextVariableName, 3, &size, name, &vendor); if (status != EFI_SUCCESS) break; val = LibGetVariable(name, &vendor); Print(fmt, &vendor, name, val); FreePool(val); } return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/route80h.c000066400000000000000000000061661471215650600176750ustar00rootroot00000000000000#include #include /* this example program changes the Reserved Page Route (RPR) bit on ICH10's General * Control And Status Register (GCS) from LPC to PCI. In practical terms, it routes * outb to port 80h to the PCI bus. */ #define GCS_OFFSET_ADDR 0x3410 #define GCS_RPR_SHIFT 2 #define GCS_RPR_PCI 1 #define GCS_RPR_LPC 0 #define VENDOR_ID_INTEL 0x8086 #define DEVICE_ID_LPCIF 0x3a16 #define DEVICE_ID_COUGARPOINT_LPCIF 0x1c56 static EFI_HANDLE ImageHandle; typedef struct { uint16_t vendor_id; /* 00-01 */ uint16_t device_id; /* 02-03 */ char pad[0xEB]; /* 04-EF */ uint32_t rcba; /* F0-F3 */ uint32_t reserved[3]; /* F4-FF */ } lpcif_t; static inline void set_bit(volatile uint32_t *flag, int bit, int value) { uint32_t val = *flag; Print(u"current value is 0x%2x\n", val); if (value) { val |= (1 << bit); } else { val &= ~(1 << bit); } Print(u"setting value to 0x%2x\n", val); *flag = val; val = *flag; Print(u"new value is 0x%2x\n", val); } static int is_device(EFI_PCI_IO *pciio, uint16_t vendor_id, uint16_t device_id) { lpcif_t lpcif; EFI_STATUS rc; rc = uefi_call_wrapper(pciio->Pci.Read, 5, pciio, EfiPciIoWidthUint16, 0, 2, &lpcif); if (EFI_ERROR(rc)) return 0; if (vendor_id == lpcif.vendor_id && device_id == lpcif.device_id) return 1; return 0; } static EFI_STATUS find_pci_device(uint16_t vendor_id, uint16_t device_id, EFI_PCI_IO **pciio) { EFI_STATUS rc; EFI_HANDLE *Handles; UINTN NoHandles, i; if (!pciio) return EFI_INVALID_PARAMETER; rc = LibLocateHandle(ByProtocol, &PciIoProtocol, NULL, &NoHandles, &Handles); if (EFI_ERROR(rc)) return rc; for (i = 0; i < NoHandles; i++) { void *pciio_tmp = NULL; rc = uefi_call_wrapper(BS->OpenProtocol, 6, Handles[i], &PciIoProtocol, &pciio_tmp, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (EFI_ERROR(rc)) continue; *pciio = pciio_tmp; if (!is_device(*pciio, vendor_id, device_id)) { *pciio = NULL; continue; } return EFI_SUCCESS; } return EFI_NOT_FOUND; } EFI_STATUS efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) { InitializeLib(image_handle, systab); EFI_PCI_IO *pciio = NULL; lpcif_t lpcif; EFI_STATUS rc = EFI_SUCCESS; struct { uint16_t vendor; uint16_t device; } devices[] = { { VENDOR_ID_INTEL, DEVICE_ID_LPCIF }, { VENDOR_ID_INTEL, DEVICE_ID_COUGARPOINT_LPCIF }, { 0, 0 } }; int i; ImageHandle = image_handle; for (i = 0; devices[i].vendor != 0; i++) { rc = find_pci_device(devices[i].vendor, devices[i].device, &pciio); if (EFI_ERROR(rc)) continue; } if (rc == EFI_NOT_FOUND) { Print(u"Device not found.\n"); return rc; } else if (EFI_ERROR(rc)) { return rc; } rc = uefi_call_wrapper(pciio->Pci.Read, 5, pciio, EfiPciIoWidthUint32, EFI_FIELD_OFFSET(lpcif_t, rcba), 1, &lpcif.rcba); if (EFI_ERROR(rc)) return rc; if (!(lpcif.rcba & 1)) { Print(u"rcrb is not mapped, cannot route port 80h\n"); return EFI_UNSUPPORTED; } lpcif.rcba &= ~1UL; Print(u"rcba: 0x%8x\n", lpcif.rcba, lpcif.rcba); set_bit((uint32_t *)(intptr_t)(lpcif.rcba + GCS_OFFSET_ADDR), GCS_RPR_SHIFT, GCS_RPR_PCI); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/setdbg.c000066400000000000000000000037101471215650600174570ustar00rootroot00000000000000#include #include EFI_GUID GRUB_EFI_GRUB_VARIABLE_GUID = {0x91376aff,0xcba6,0x42be,{0x94,0x9d,0x06,0xfd,0xe8,0x11,0x28,0xe8}}; EFI_GUID SHIM_GUID = {0x605dab50,0xe046,0x4300,{0xab,0xb6,0x3d,0xd8,0x10,0xdd,0x8b,0x23}}; char grubenv[] = "# GRUB Environment Block\n\ debug=tcp,http,net\n\ ####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################"; EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { EFI_STATUS status; InitializeLib(image, systab); #if 0 UINT8 data = 1; status = RT->SetVariable(u"SHIM_DEBUG", &SHIM_GUID, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, sizeof(data), &data); if (EFI_ERROR(status)) Print(u"SetVariable failed: %r\n", status); #endif status = RT->SetVariable(u"GRUB_ENV", &SHIM_GUID, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, sizeof(grubenv)-1, grubenv); if (EFI_ERROR(status)) Print(u"SetVariable(GRUB_ENV) failed: %r\n", status); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/setjmp.c000066400000000000000000000006521471215650600175130ustar00rootroot00000000000000 #include #include #include EFI_STATUS efi_main( EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab ) { jmp_buf env; int rc; InitializeLib(image_handle, systab); rc = setjmp(env); Print(u"setjmp() = %d\n", rc); if (rc == 3) { Print(u"3 worked\n"); longjmp(env, 0); return 0; } if (rc == 1) { Print(u"0 got to be one yay\n"); return 0; } longjmp(env, 3); return 0; } ncroxon-gnu-efi-157d47c/apps/t.c000066400000000000000000000010521471215650600164470ustar00rootroot00000000000000#include #include static CHAR16 * a2u (char *str) { static CHAR16 mem[2048]; int i; for (i = 0; str[i]; ++i) mem[i] = (CHAR16) str[i]; mem[i] = 0; return mem; } EFI_STATUS efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) { SIMPLE_TEXT_OUTPUT_INTERFACE *conout; InitializeLib(image_handle, systab); conout = systab->ConOut; uefi_call_wrapper(conout->OutputString, 2, conout, (CHAR16 *)u"Hello World!\r\n"); uefi_call_wrapper(conout->OutputString, 2, conout, a2u("Hello World!\r\n")); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/t2.c000066400000000000000000000004631471215650600165360ustar00rootroot00000000000000#include #include EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { SIMPLE_TEXT_OUTPUT_INTERFACE *conout; InitializeLib(image, systab); conout = systab->ConOut; uefi_call_wrapper(conout->OutputString, 2, conout, u"Hello World!\r\n"); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/t3.c000066400000000000000000000050161471215650600165360ustar00rootroot00000000000000#include #include EFI_STATUS efi_main( EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab ) { EFI_GUID loaded_image_protocol = LOADED_IMAGE_PROTOCOL; EFI_STATUS efi_status; EFI_LOADED_IMAGE *li; UINTN pat = PoolAllocationType; VOID *void_li_p; InitializeLib(image_handle, systab); PoolAllocationType = 2; /* klooj */ Print(u"Hello World! (0xd=0x%x, 13=%d)\n", 13, 13); Print(u"before InitializeLib(): PoolAllocationType=%d\n", pat); Print(u" after InitializeLib(): PoolAllocationType=%d\n", PoolAllocationType); /* * Locate loaded_image_handle instance. */ Print(u"BS->HandleProtocol() "); efi_status = uefi_call_wrapper( BS->HandleProtocol, 3, image_handle, &loaded_image_protocol, &void_li_p); li = void_li_p; Print(u"%xh (%r)\n", efi_status, efi_status); if (efi_status != EFI_SUCCESS) { return efi_status; } Print(u" li: %xh\n", li); if (!li) { return EFI_UNSUPPORTED; } Print(u" li->Revision: %xh\n", li->Revision); Print(u" li->ParentHandle: %xh\n", li->ParentHandle); Print(u" li->SystemTable: %xh\n", li->SystemTable); Print(u" li->DeviceHandle: %xh\n", li->DeviceHandle); Print(u" li->FilePath: %xh\n", li->FilePath); Print(u" li->Reserved: %xh\n", li->Reserved); Print(u" li->LoadOptionsSize: %xh\n", li->LoadOptionsSize); Print(u" li->LoadOptions: %xh\n", li->LoadOptions); Print(u" li->ImageBase: %xh\n", li->ImageBase); Print(u" li->ImageSize: %xh\n", li->ImageSize); Print(u" li->ImageCodeType: %xh\n", li->ImageCodeType); Print(u" li->ImageDataType: %xh\n", li->ImageDataType); Print(u" li->Unload: %xh\n", li->Unload); #if 0 typedef struct { UINT32 Revision; EFI_HANDLE ParentHandle; struct _EFI_SYSTEM_TABLE *SystemTable; // Source location of image EFI_HANDLE DeviceHandle; EFI_DEVICE_PATH *FilePath; VOID *Reserved; // Images load options UINT32 LoadOptionsSize; VOID *LoadOptions; // Location of where image was loaded VOID *ImageBase; UINT64 ImageSize; EFI_MEMORY_TYPE ImageCodeType; EFI_MEMORY_TYPE ImageDataType; // If the driver image supports a dynamic unload request EFI_IMAGE_UNLOAD Unload; } EFI_LOADED_IMAGE; #endif return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/t4.c000066400000000000000000000007541471215650600165430ustar00rootroot00000000000000#include #include EFI_STATUS efi_main (EFI_HANDLE *image, EFI_SYSTEM_TABLE *systab) { UINTN index; InitializeLib(image, systab); uefi_call_wrapper(systab->ConOut->OutputString, 2, systab->ConOut, u"Hello application started\r\n"); uefi_call_wrapper(systab->ConOut->OutputString, 2, systab->ConOut, u"\r\n\r\n\r\nHit any key to exit\r\n"); uefi_call_wrapper(systab->BootServices->WaitForEvent, 3, 1, &systab->ConIn->WaitForKey, &index); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/t5.c000066400000000000000000000005621471215650600165410ustar00rootroot00000000000000#include #include EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { InitializeLib(image, systab); Print(u"HelloLib application started\n"); Print(u"\n\n\nHit any key to exit this image\n"); WaitForSingleEvent(ST->ConIn->WaitForKey, 0); uefi_call_wrapper(ST->ConOut->OutputString, 2, ST->ConOut, u"\n\n"); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/t6.c000066400000000000000000000021661471215650600165440ustar00rootroot00000000000000#include #include typedef EFI_STATUS (*foo_t)(EFI_HANDLE, EFI_GUID *, VOID **); typedef struct { unsigned long addr; unsigned long gp; } fdesc_t; EFI_LOADED_IMAGE my_loaded; EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { EFI_LOADED_IMAGE *loaded_image = NULL; #if 0 EFI_DEVICE_PATH *dev_path; #endif EFI_STATUS status; InitializeLib(image, systab); status = uefi_call_wrapper(systab->BootServices->HandleProtocol, 3, image, &LoadedImageProtocol, (void **) &loaded_image); if (EFI_ERROR(status)) { Print(u"handleprotocol: %r\n", status); } #if 0 BS->HandleProtocol(loaded_image->DeviceHandle, &DevicePathProtocol, (void **) &dev_path); Print(u"Image device : %s\n", DevicePathToStr(dev_path)); Print(u"Image file : %s\n", DevicePathToStr(loaded_image->FilePath)); #endif Print(u"Image base : %lx\n", loaded_image->ImageBase); Print(u"Image size : %lx\n", loaded_image->ImageSize); Print(u"Load options size : %lx\n", loaded_image->LoadOptionsSize); Print(u"Load options : %s\n", loaded_image->LoadOptions); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/t7.c000066400000000000000000000012101471215650600165320ustar00rootroot00000000000000#include #include EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { EFI_INPUT_KEY efi_input_key; EFI_STATUS efi_status; InitializeLib(image, systab); Print(u"HelloLib application started\n"); Print(u"\n\n\nHit any key to exit this image\n"); WaitForSingleEvent(ST->ConIn->WaitForKey, 0); uefi_call_wrapper(ST->ConOut->OutputString, 2, ST->ConOut, u"\n\n"); efi_status = uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, &efi_input_key); Print(u"ScanCode: %xh UnicodeChar: %xh CallRtStatus: %x\n", efi_input_key.ScanCode, efi_input_key.UnicodeChar, efi_status); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/t8.c000066400000000000000000000006431471215650600165440ustar00rootroot00000000000000#include #include EFI_STATUS efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) { INTN Argc, i; CHAR16 **Argv; InitializeLib(ImageHandle, SystemTable); Argc = GetShellArgcArgv(ImageHandle, &Argv); Print(u"Hello World, started with Argc=%d\n", Argc); for (i = 0 ; i < Argc ; ++i) Print(u" Argv[%d] = '%s'\n", i, Argv[i]); Print(u"Bye.\n"); return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/apps/tcc.c000066400000000000000000000213671471215650600167700ustar00rootroot00000000000000/* * Test if our calling convention gymnastics actually work */ #include #include #if 0 extern void dump_stack(void); asm( ".globl dump_stack\n" "dump_stack:\n" " movq %rsp, %rdi\n" " jmp *dump_stack_helper@GOTPCREL(%rip)\n" ".size dump_stack, .-dump_stack"); void dump_stack_helper(uint64_t rsp_val) { uint64_t *rsp = (uint64_t *)rsp_val; int x; Print(u"%%rsp: 0x%08x%08x stack:\r\n", (rsp_val & 0xffffffff00000000) >>32, rsp_val & 0xffffffff); for (x = 0; x < 8; x++) { Print(u"%08x: ", ((uint64_t)rsp) & 0xffffffff); Print(u"%016x ", *rsp++); Print(u"%016x ", *rsp++); Print(u"%016x ", *rsp++); Print(u"%016x\r\n", *rsp++); } } #endif EFI_STATUS EFI_FUNCTION test_failure_callback(void) { return EFI_UNSUPPORTED; } EFI_STATUS test_failure(void) { return uefi_call_wrapper(test_failure_callback, 0); } EFI_STATUS EFI_FUNCTION test_call0_callback(void) { return EFI_SUCCESS; } EFI_STATUS test_call0(void) { return uefi_call_wrapper(test_call0_callback, 0); } EFI_STATUS EFI_FUNCTION test_call1_callback(UINT32 a) { if (a != 0x12345678) { return EFI_LOAD_ERROR; } return EFI_SUCCESS; } EFI_STATUS test_call1(void) { return uefi_call_wrapper(test_call1_callback, 1,0x12345678); } EFI_STATUS EFI_FUNCTION test_call2_callback(UINT32 a, UINT32 b) { if (a != 0x12345678) { return EFI_LOAD_ERROR; } if (b != 0x23456789) { return EFI_INVALID_PARAMETER; } return EFI_SUCCESS; } EFI_STATUS test_call2(void) { return uefi_call_wrapper(test_call2_callback, 2, 0x12345678, 0x23456789); } EFI_STATUS EFI_FUNCTION test_call3_callback(UINT32 a, UINT32 b, UINT32 c) { if (a != 0x12345678) return EFI_LOAD_ERROR; if (b != 0x23456789) return EFI_INVALID_PARAMETER; if (c != 0x3456789a) return EFI_UNSUPPORTED; return EFI_SUCCESS; } EFI_STATUS test_call3(void) { return uefi_call_wrapper(test_call3_callback, 3, 0x12345678, 0x23456789, 0x3456789a); } EFI_STATUS EFI_FUNCTION test_call4_callback(UINT32 a, UINT32 b, UINT32 c, UINT32 d) { if (a != 0x12345678) return EFI_LOAD_ERROR; if (b != 0x23456789) return EFI_INVALID_PARAMETER; if (c != 0x3456789a) return EFI_UNSUPPORTED; if (d != 0x456789ab) return EFI_BAD_BUFFER_SIZE; return EFI_SUCCESS; } EFI_STATUS test_call4(void) { return uefi_call_wrapper(test_call4_callback, 4, 0x12345678, 0x23456789, 0x3456789a, 0x456789ab); } EFI_STATUS EFI_FUNCTION test_call5_callback(UINT32 a, UINT32 b, UINT32 c, UINT32 d, UINT32 e) { if (a != 0x12345678) return EFI_LOAD_ERROR; if (b != 0x23456789) return EFI_INVALID_PARAMETER; if (c != 0x3456789a) return EFI_UNSUPPORTED; if (d != 0x456789ab) return EFI_BAD_BUFFER_SIZE; if (e != 0x56789abc) return EFI_BUFFER_TOO_SMALL; return EFI_SUCCESS; } EFI_STATUS test_call5(void) { return uefi_call_wrapper(test_call5_callback, 5, 0x12345678, 0x23456789, 0x3456789a, 0x456789ab, 0x56789abc); } EFI_STATUS EFI_FUNCTION test_call6_callback(UINT32 a, UINT32 b, UINT32 c, UINT32 d, UINT32 e, UINT32 f) { if (a != 0x12345678) return EFI_LOAD_ERROR; if (b != 0x23456789) return EFI_INVALID_PARAMETER; if (c != 0x3456789a) return EFI_UNSUPPORTED; if (d != 0x456789ab) return EFI_BAD_BUFFER_SIZE; if (e != 0x56789abc) return EFI_BUFFER_TOO_SMALL; if (f != 0x6789abcd) return EFI_NOT_READY; return EFI_SUCCESS; } EFI_STATUS test_call6(void) { return uefi_call_wrapper(test_call6_callback, 6, 0x12345678, 0x23456789, 0x3456789a, 0x456789ab, 0x56789abc, 0x6789abcd); } EFI_STATUS EFI_FUNCTION test_call7_callback(UINT32 a, UINT32 b, UINT32 c, UINT32 d, UINT32 e, UINT32 f, UINT32 g) { if (a != 0x12345678) return EFI_LOAD_ERROR; if (b != 0x23456789) return EFI_INVALID_PARAMETER; if (c != 0x3456789a) return EFI_UNSUPPORTED; if (d != 0x456789ab) return EFI_BAD_BUFFER_SIZE; if (e != 0x56789abc) return EFI_BUFFER_TOO_SMALL; if (f != 0x6789abcd) return EFI_NOT_READY; if (g != 0x789abcde) return EFI_DEVICE_ERROR; return EFI_SUCCESS; } EFI_STATUS test_call7(void) { return uefi_call_wrapper(test_call7_callback, 7, 0x12345678, 0x23456789, 0x3456789a, 0x456789ab, 0x56789abc, 0x6789abcd, 0x789abcde); } EFI_STATUS EFI_FUNCTION test_call8_callback(UINT32 a, UINT32 b, UINT32 c, UINT32 d, UINT32 e, UINT32 f, UINT32 g, UINT32 h) { if (a != 0x12345678) return EFI_LOAD_ERROR; if (b != 0x23456789) return EFI_INVALID_PARAMETER; if (c != 0x3456789a) return EFI_UNSUPPORTED; if (d != 0x456789ab) return EFI_BAD_BUFFER_SIZE; if (e != 0x56789abc) return EFI_BUFFER_TOO_SMALL; if (f != 0x6789abcd) return EFI_NOT_READY; if (g != 0x789abcde) return EFI_DEVICE_ERROR; if (h != 0x89abcdef) return EFI_WRITE_PROTECTED; return EFI_SUCCESS; } EFI_STATUS test_call8(void) { return uefi_call_wrapper(test_call8_callback, 8, 0x12345678, 0x23456789, 0x3456789a, 0x456789ab, 0x56789abc, 0x6789abcd, 0x789abcde, 0x89abcdef); } EFI_STATUS EFI_FUNCTION test_call9_callback(UINT32 a, UINT32 b, UINT32 c, UINT32 d, UINT32 e, UINT32 f, UINT32 g, UINT32 h, UINT32 i) { if (a != 0x12345678) return EFI_LOAD_ERROR; if (b != 0x23456789) return EFI_INVALID_PARAMETER; if (c != 0x3456789a) return EFI_UNSUPPORTED; if (d != 0x456789ab) return EFI_BAD_BUFFER_SIZE; if (e != 0x56789abc) return EFI_BUFFER_TOO_SMALL; if (f != 0x6789abcd) return EFI_NOT_READY; if (g != 0x789abcde) return EFI_DEVICE_ERROR; if (h != 0x89abcdef) return EFI_WRITE_PROTECTED; if (i != 0x9abcdef0) return EFI_OUT_OF_RESOURCES; return EFI_SUCCESS; } EFI_STATUS test_call9(void) { return uefi_call_wrapper(test_call9_callback, 9, 0x12345678, 0x23456789, 0x3456789a, 0x456789ab, 0x56789abc, 0x6789abcd, 0x789abcde, 0x89abcdef, 0x9abcdef0); } extern EFI_STATUS test_call10(void); EFI_STATUS EFI_FUNCTION test_call10_callback(UINT32 a, UINT32 b, UINT32 c, UINT32 d, UINT32 e, UINT32 f, UINT32 g, UINT32 h, UINT32 i, UINT32 j) { if (a != 0x12345678) return EFI_LOAD_ERROR; if (b != 0x23456789) return EFI_INVALID_PARAMETER; if (c != 0x3456789a) return EFI_UNSUPPORTED; if (d != 0x456789ab) return EFI_BAD_BUFFER_SIZE; if (e != 0x56789abc) return EFI_BUFFER_TOO_SMALL; if (f != 0x6789abcd) return EFI_NOT_READY; if (g != 0x789abcde) return EFI_DEVICE_ERROR; if (h != 0x89abcdef) return EFI_WRITE_PROTECTED; if (i != 0x9abcdef0) return EFI_OUT_OF_RESOURCES; if (j != 0xabcdef01) return EFI_VOLUME_CORRUPTED; return EFI_SUCCESS; } EFI_STATUS test_call10(void) { return uefi_call_wrapper(test_call10_callback, 10, 0x12345678, 0x23456789, 0x3456789a, 0x456789ab, 0x56789abc, 0x6789abcd, 0x789abcde, 0x89abcdef, 0x9abcdef0, 0xabcdef01); } EFI_STATUS efi_main (EFI_HANDLE *image, EFI_SYSTEM_TABLE *systab) { EFI_STATUS rc = EFI_SUCCESS; InitializeLib(image, systab); PoolAllocationType = 2; /* klooj */ #ifdef __x86_64__ __asm__ volatile("out %0,%1" : : "a" ((uint8_t)0x14), "dN" (0x80)); #endif Print(u"Hello\n"); rc = test_failure(); if (EFI_ERROR(rc)) { Print(u"Returning Failure works\n"); } else { Print(u"Returning failure doesn't work.\n"); Print(u"%%rax was 0x%016x, should have been 0x%016x\n", rc, EFI_UNSUPPORTED); return EFI_INVALID_PARAMETER; } rc = test_call0(); if (!EFI_ERROR(rc)) { Print(u"0 args works just fine here.\n"); } else { Print(u"0 args failed: 0x%016x\n", rc); return rc; } rc = test_call1(); if (!EFI_ERROR(rc)) { Print(u"1 arg works just fine here.\n"); } else { Print(u"1 arg failed: 0x%016x\n", rc); return rc; } rc = test_call2(); if (!EFI_ERROR(rc)) { Print(u"2 args works just fine here.\n"); } else { Print(u"2 args failed: 0x%016x\n", rc); return rc; } rc = test_call3(); if (!EFI_ERROR(rc)) { Print(u"3 args works just fine here.\n"); } else { Print(u"3 args failed: 0x%016x\n", rc); return rc; } rc = test_call4(); if (!EFI_ERROR(rc)) { Print(u"4 args works just fine here.\n"); } else { Print(u"4 args failed: 0x%016x\n", rc); return rc; } rc = test_call5(); if (!EFI_ERROR(rc)) { Print(u"5 args works just fine here.\n"); } else { Print(u"5 args failed: 0x%016x\n", rc); return rc; } rc = test_call6(); if (!EFI_ERROR(rc)) { Print(u"6 args works just fine here.\n"); } else { Print(u"6 args failed: 0x%016x\n", rc); return rc; } rc = test_call7(); if (!EFI_ERROR(rc)) { Print(u"7 args works just fine here.\n"); } else { Print(u"7 args failed: 0x%016x\n", rc); return rc; } rc = test_call8(); if (!EFI_ERROR(rc)) { Print(u"8 args works just fine here.\n"); } else { Print(u"8 args failed: 0x%016x\n", rc); return rc; } rc = test_call9(); if (!EFI_ERROR(rc)) { Print(u"9 args works just fine here.\n"); } else { Print(u"9 args failed: 0x%016x\n", rc); return rc; } rc = test_call10(); if (!EFI_ERROR(rc)) { Print(u"10 args works just fine here.\n"); } else { Print(u"10 args failed: 0x%016x\n", rc); return rc; } return rc; } ncroxon-gnu-efi-157d47c/apps/unsetdbg.c000066400000000000000000000036751471215650600200340ustar00rootroot00000000000000#include #include EFI_GUID GRUB_EFI_GRUB_VARIABLE_GUID = {0x91376aff,0xcba6,0x42be,{0x94,0x9d,0x06,0xfd,0xe8,0x11,0x28,0xe8}}; EFI_GUID SHIM_GUID = {0x605dab50,0xe046,0x4300,{0xab,0xb6,0x3d,0xd8,0x10,0xdd,0x8b,0x23}}; char grubenv[] = "# GRUB Environment Block\n\ debug=all\n\ #############################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################"; EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { EFI_STATUS status; UINT8 data = 1; InitializeLib(image, systab); status = RT->SetVariable(u"SHIM_DEBUG", &SHIM_GUID, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, 0, &data); if (EFI_ERROR(status)) Print(u"SetVariable failed: %r\n", status); #if 0 status = RT->SetVariable(u"GRUB_ENV", &SHIM_GUID, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, sizeof(grubenv)-1, grubenv); if (EFI_ERROR(status)) Print(u"SetVariable(GRUB_ENV) failed: %r\n", status); #endif return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/docs/000077500000000000000000000000001471215650600160275ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/docs/README.ABI.md000066400000000000000000000015761471215650600177110ustar00rootroot000000000000001) When using gnu-efi 4.0 with an application which was written for gnu-efi 3.0, it may be required to set the `GNU_EFI_3_0_COMPAT` compile flag this changes the default versions of some changed functions back to their prior versions This currently includes the following functions: - ReallocatePool Inputs were re-ordered - CopyMem Source is no longer marked as constant CopyMemC is introduced as a helper function when using a constant source input - CompareGuid Function now returns BOOLEAN instead of INTN Return codes are now reversed **Will break at runtime - likely causing opposite output to expected** 2) Applications which haven't been updated in a while may also be missing the required `.rodata` section which contains needed read-only data which will prevent any binary missing this section from running correctly ncroxon-gnu-efi-157d47c/docs/README.elilo.md000066400000000000000000000011401471215650600204050ustar00rootroot00000000000000 # IMPORTANT information related to the gnu-efi package ---------------------------------------------------- June 2001 As of version 3.0, the gnu-efi package is now split in two different packages: - gnu-efi-X.y: contains the EFI library, include files and crt0. - elilo-X.y : contains the ELILO bootloader. Note that X.y don't need to match for both packages. However elilo-3.x requires at least gnu-efi-3.0. EFI support for x86_64 is provided in gnu-efi-3.0d. Both packages can be downloaded from: - [gnu-efi](https://github.com/ncroxon/gnu-efi) - [elilo](https://sourceforge.net/projects/elilo/) ncroxon-gnu-efi-157d47c/docs/README.git.md000066400000000000000000000022061471215650600200700ustar00rootroot00000000000000# README.git Generating releases on GitHub is a very simple process; ## Set version in repo 1) Edit the file "Makefile". Changing the "VERSION" line to the new version. 2) Do a "git commit" just for the version number change. ## Create new release 1) Go to the [GitHub release page](https://github.com/ncroxon/gnu-efi/releases/new) 2) Enter the version number in the tag field, selecting "create tag on publish" **Ignore GitHub's suggestion of prefixing the version with a "v"** 3) Set previous tag manually - Last stable for stable releases - Last alpha/beta for alpha/beta releases **Ensures GitHub sets the Full Changelog to be between the last release in the cycle** **and not the start of the repository** 4) Add a release title - use the version number **Otherwise GitHub will add the last commit name as the title** 5) ***OPTIONAL*** Add a release description *and/or* a list of pull requests and contributors via "Generate release notes" 6) For alpha/beta versions, set it to be a pre-release 7) Release the new version 8) GitHub will automatically generate a GZ compressed TAR file and a ZIP file of the repo ncroxon-gnu-efi-157d47c/docs/README.packaging.md000066400000000000000000000017771471215650600212450ustar00rootroot00000000000000# Packaging gnu-efi ## Set variables per distro configuration make should be called with the following variables: - PREFIX (defaults to `/usr/local`)(`%{_prefix}` on RPM distros) - EXEC_PREFIX (*optional*) (defaults to `$PREFIX`) (`%{_exec_prefix}` on RPM distros) - LIBDIR (defaults to `$EXEC_PREFIX/lib`) (`%{_libdir}` on RPM distros) - INCLUDEDIR (*optional*) (defaults to `$PREFIX/include`) (`%{_includedir}` on RPM distros) - LINUX_HEADERS (*optional*) (**build only**) - location of Linux kernel header files (defaults to `/usr/src/sys/build`) - DESTDIR (**install only**) - installation output directory (`%{buildroot}` on RPM distros - included in `%make_install`) Currently, these variables unless stated will need to be set for both build and installation stages. Those without optional markers I heavily suggest you to set them otherwise files may be located in the wrong directory for the architecture which you are building for *The related RPM variables are included here for cross referencing purposes*ncroxon-gnu-efi-157d47c/gnu-efi.sln000066400000000000000000001052601471215650600171530ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.7.34221.43 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "efilib", ".vs\efilib.vcxproj", "{3135D563-9596-4584-9ED6-616ADEC52974}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apps", "apps", "{DF105116-5A3A-4D48-AB1D-7221690ED545}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AllocPages", ".vs\apps\AllocPages.vcxproj", "{DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bltgrid", ".vs\apps\bltgrid.vcxproj", "{7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "drv0", ".vs\apps\drv0.vcxproj", "{ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "drv0_use", ".vs\apps\drv0_use.vcxproj", "{3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "exit", ".vs\apps\exit.vcxproj", "{80BD2830-EF30-4110-97BA-1B9A7B855996}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreePages", ".vs\apps\FreePages.vcxproj", "{627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lfbgrid", ".vs\apps\lfbgrid.vcxproj", "{7C059723-3CD2-484B-8064-238CE7A437BD}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "modelist", ".vs\apps\modelist.vcxproj", "{5AD238D9-79AA-4166-BC86-EF759EA45BAB}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "printenv", ".vs\apps\printenv.vcxproj", "{731CD95E-7CCD-495F-9456-E2D71357C807}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "route80h", ".vs\apps\route80h.vcxproj", "{6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "setdbg", ".vs\apps\setdbg.vcxproj", "{5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t", ".vs\apps\t.vcxproj", "{9BA1F692-0824-442E-B700-69C3D85D64EE}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t2", ".vs\apps\t2.vcxproj", "{DCB81D4D-15B8-440D-A757-5B0036C0F4F6}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t3", ".vs\apps\t3.vcxproj", "{AFF91400-F772-419A-9463-D9900B43C666}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t4", ".vs\apps\t4.vcxproj", "{3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t5", ".vs\apps\t5.vcxproj", "{7F52AAA4-2071-49D6-A783-529D3CB5AF61}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t6", ".vs\apps\t6.vcxproj", "{0AE45092-20C3-4999-BFDC-77F2D0FDFF60}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t7", ".vs\apps\t7.vcxproj", "{04D2685F-8150-47E0-BC10-338D2D6B804C}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "t8", ".vs\apps\t8.vcxproj", "{6C664A44-BC53-4225-A14B-D969D4EED647}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcc", ".vs\apps\tcc.vcxproj", "{6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unsetdbg", ".vs\apps\unsetdbg.vcxproj", "{06089797-265A-4FF5-838E-25374C1F0159}" ProjectSection(ProjectDependencies) = postProject {3135D563-9596-4584-9ED6-616ADEC52974} = {3135D563-9596-4584-9ED6-616ADEC52974} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|aa64 = Debug|aa64 Debug|arm = Debug|arm Debug|ia32 = Debug|ia32 Debug|x64 = Debug|x64 Release|aa64 = Release|aa64 Release|arm = Release|arm Release|ia32 = Release|ia32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|aa64.ActiveCfg = Debug|ARM64 {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|aa64.Build.0 = Debug|ARM64 {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|arm.ActiveCfg = Debug|ARM {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|arm.Build.0 = Debug|ARM {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|ia32.ActiveCfg = Debug|Win32 {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|ia32.Build.0 = Debug|Win32 {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x64.ActiveCfg = Debug|x64 {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x64.Build.0 = Debug|x64 {3135D563-9596-4584-9ED6-616ADEC52974}.Release|aa64.ActiveCfg = Release|ARM64 {3135D563-9596-4584-9ED6-616ADEC52974}.Release|aa64.Build.0 = Release|ARM64 {3135D563-9596-4584-9ED6-616ADEC52974}.Release|arm.ActiveCfg = Release|ARM {3135D563-9596-4584-9ED6-616ADEC52974}.Release|arm.Build.0 = Release|ARM {3135D563-9596-4584-9ED6-616ADEC52974}.Release|ia32.ActiveCfg = Release|Win32 {3135D563-9596-4584-9ED6-616ADEC52974}.Release|ia32.Build.0 = Release|Win32 {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x64.ActiveCfg = Release|x64 {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x64.Build.0 = Release|x64 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|aa64.ActiveCfg = Debug|ARM64 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|aa64.Build.0 = Debug|ARM64 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|arm.ActiveCfg = Debug|ARM {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|arm.Build.0 = Debug|ARM {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|ia32.ActiveCfg = Debug|Win32 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|ia32.Build.0 = Debug|Win32 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x64.ActiveCfg = Debug|x64 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x64.Build.0 = Debug|x64 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|aa64.ActiveCfg = Release|ARM64 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|aa64.Build.0 = Release|ARM64 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|arm.ActiveCfg = Release|ARM {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|arm.Build.0 = Release|ARM {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|ia32.ActiveCfg = Release|Win32 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|ia32.Build.0 = Release|Win32 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x64.ActiveCfg = Release|x64 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x64.Build.0 = Release|x64 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Debug|aa64.ActiveCfg = Debug|ARM64 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Debug|aa64.Build.0 = Debug|ARM64 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Debug|arm.ActiveCfg = Debug|ARM {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Debug|arm.Build.0 = Debug|ARM {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Debug|ia32.ActiveCfg = Debug|Win32 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Debug|ia32.Build.0 = Debug|Win32 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Debug|x64.ActiveCfg = Debug|x64 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Debug|x64.Build.0 = Debug|x64 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Release|aa64.ActiveCfg = Release|ARM64 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Release|aa64.Build.0 = Release|ARM64 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Release|arm.ActiveCfg = Release|ARM {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Release|arm.Build.0 = Release|ARM {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Release|ia32.ActiveCfg = Release|Win32 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Release|ia32.Build.0 = Release|Win32 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Release|x64.ActiveCfg = Release|x64 {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C}.Release|x64.Build.0 = Release|x64 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Debug|aa64.ActiveCfg = Debug|ARM64 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Debug|aa64.Build.0 = Debug|ARM64 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Debug|arm.ActiveCfg = Debug|ARM {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Debug|arm.Build.0 = Debug|ARM {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Debug|ia32.ActiveCfg = Debug|Win32 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Debug|ia32.Build.0 = Debug|Win32 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Debug|x64.ActiveCfg = Debug|x64 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Debug|x64.Build.0 = Debug|x64 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Release|aa64.ActiveCfg = Release|ARM64 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Release|aa64.Build.0 = Release|ARM64 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Release|arm.ActiveCfg = Release|ARM {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Release|arm.Build.0 = Release|ARM {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Release|ia32.ActiveCfg = Release|Win32 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Release|ia32.Build.0 = Release|Win32 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Release|x64.ActiveCfg = Release|x64 {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F}.Release|x64.Build.0 = Release|x64 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Debug|aa64.ActiveCfg = Debug|ARM64 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Debug|aa64.Build.0 = Debug|ARM64 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Debug|arm.ActiveCfg = Debug|ARM {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Debug|arm.Build.0 = Debug|ARM {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Debug|ia32.ActiveCfg = Debug|Win32 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Debug|ia32.Build.0 = Debug|Win32 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Debug|x64.ActiveCfg = Debug|x64 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Debug|x64.Build.0 = Debug|x64 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Release|aa64.ActiveCfg = Release|ARM64 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Release|aa64.Build.0 = Release|ARM64 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Release|arm.ActiveCfg = Release|ARM {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Release|arm.Build.0 = Release|ARM {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Release|ia32.ActiveCfg = Release|Win32 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Release|ia32.Build.0 = Release|Win32 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Release|x64.ActiveCfg = Release|x64 {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640}.Release|x64.Build.0 = Release|x64 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Debug|aa64.ActiveCfg = Debug|ARM64 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Debug|aa64.Build.0 = Debug|ARM64 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Debug|arm.ActiveCfg = Debug|ARM {80BD2830-EF30-4110-97BA-1B9A7B855996}.Debug|arm.Build.0 = Debug|ARM {80BD2830-EF30-4110-97BA-1B9A7B855996}.Debug|ia32.ActiveCfg = Debug|Win32 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Debug|ia32.Build.0 = Debug|Win32 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Debug|x64.ActiveCfg = Debug|x64 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Debug|x64.Build.0 = Debug|x64 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Release|aa64.ActiveCfg = Release|ARM64 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Release|aa64.Build.0 = Release|ARM64 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Release|arm.ActiveCfg = Release|ARM {80BD2830-EF30-4110-97BA-1B9A7B855996}.Release|arm.Build.0 = Release|ARM {80BD2830-EF30-4110-97BA-1B9A7B855996}.Release|ia32.ActiveCfg = Release|Win32 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Release|ia32.Build.0 = Release|Win32 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Release|x64.ActiveCfg = Release|x64 {80BD2830-EF30-4110-97BA-1B9A7B855996}.Release|x64.Build.0 = Release|x64 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Debug|aa64.ActiveCfg = Debug|ARM64 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Debug|aa64.Build.0 = Debug|ARM64 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Debug|arm.ActiveCfg = Debug|ARM {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Debug|arm.Build.0 = Debug|ARM {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Debug|ia32.ActiveCfg = Debug|Win32 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Debug|ia32.Build.0 = Debug|Win32 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Debug|x64.ActiveCfg = Debug|x64 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Debug|x64.Build.0 = Debug|x64 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Release|aa64.ActiveCfg = Release|ARM64 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Release|aa64.Build.0 = Release|ARM64 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Release|arm.ActiveCfg = Release|ARM {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Release|arm.Build.0 = Release|ARM {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Release|ia32.ActiveCfg = Release|Win32 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Release|ia32.Build.0 = Release|Win32 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Release|x64.ActiveCfg = Release|x64 {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666}.Release|x64.Build.0 = Release|x64 {7C059723-3CD2-484B-8064-238CE7A437BD}.Debug|aa64.ActiveCfg = Debug|ARM64 {7C059723-3CD2-484B-8064-238CE7A437BD}.Debug|aa64.Build.0 = Debug|ARM64 {7C059723-3CD2-484B-8064-238CE7A437BD}.Debug|arm.ActiveCfg = Debug|ARM {7C059723-3CD2-484B-8064-238CE7A437BD}.Debug|arm.Build.0 = Debug|ARM {7C059723-3CD2-484B-8064-238CE7A437BD}.Debug|ia32.ActiveCfg = Debug|Win32 {7C059723-3CD2-484B-8064-238CE7A437BD}.Debug|ia32.Build.0 = Debug|Win32 {7C059723-3CD2-484B-8064-238CE7A437BD}.Debug|x64.ActiveCfg = Debug|x64 {7C059723-3CD2-484B-8064-238CE7A437BD}.Debug|x64.Build.0 = Debug|x64 {7C059723-3CD2-484B-8064-238CE7A437BD}.Release|aa64.ActiveCfg = Release|ARM64 {7C059723-3CD2-484B-8064-238CE7A437BD}.Release|aa64.Build.0 = Release|ARM64 {7C059723-3CD2-484B-8064-238CE7A437BD}.Release|arm.ActiveCfg = Release|ARM {7C059723-3CD2-484B-8064-238CE7A437BD}.Release|arm.Build.0 = Release|ARM {7C059723-3CD2-484B-8064-238CE7A437BD}.Release|ia32.ActiveCfg = Release|Win32 {7C059723-3CD2-484B-8064-238CE7A437BD}.Release|ia32.Build.0 = Release|Win32 {7C059723-3CD2-484B-8064-238CE7A437BD}.Release|x64.ActiveCfg = Release|x64 {7C059723-3CD2-484B-8064-238CE7A437BD}.Release|x64.Build.0 = Release|x64 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Debug|aa64.ActiveCfg = Debug|ARM64 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Debug|aa64.Build.0 = Debug|ARM64 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Debug|arm.ActiveCfg = Debug|ARM {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Debug|arm.Build.0 = Debug|ARM {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Debug|ia32.ActiveCfg = Debug|Win32 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Debug|ia32.Build.0 = Debug|Win32 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Debug|x64.ActiveCfg = Debug|x64 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Debug|x64.Build.0 = Debug|x64 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Release|aa64.ActiveCfg = Release|ARM64 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Release|aa64.Build.0 = Release|ARM64 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Release|arm.ActiveCfg = Release|ARM {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Release|arm.Build.0 = Release|ARM {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Release|ia32.ActiveCfg = Release|Win32 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Release|ia32.Build.0 = Release|Win32 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Release|x64.ActiveCfg = Release|x64 {5AD238D9-79AA-4166-BC86-EF759EA45BAB}.Release|x64.Build.0 = Release|x64 {731CD95E-7CCD-495F-9456-E2D71357C807}.Debug|aa64.ActiveCfg = Debug|ARM64 {731CD95E-7CCD-495F-9456-E2D71357C807}.Debug|aa64.Build.0 = Debug|ARM64 {731CD95E-7CCD-495F-9456-E2D71357C807}.Debug|arm.ActiveCfg = Debug|ARM {731CD95E-7CCD-495F-9456-E2D71357C807}.Debug|arm.Build.0 = Debug|ARM {731CD95E-7CCD-495F-9456-E2D71357C807}.Debug|ia32.ActiveCfg = Debug|Win32 {731CD95E-7CCD-495F-9456-E2D71357C807}.Debug|ia32.Build.0 = Debug|Win32 {731CD95E-7CCD-495F-9456-E2D71357C807}.Debug|x64.ActiveCfg = Debug|x64 {731CD95E-7CCD-495F-9456-E2D71357C807}.Debug|x64.Build.0 = Debug|x64 {731CD95E-7CCD-495F-9456-E2D71357C807}.Release|aa64.ActiveCfg = Release|ARM64 {731CD95E-7CCD-495F-9456-E2D71357C807}.Release|aa64.Build.0 = Release|ARM64 {731CD95E-7CCD-495F-9456-E2D71357C807}.Release|arm.ActiveCfg = Release|ARM {731CD95E-7CCD-495F-9456-E2D71357C807}.Release|arm.Build.0 = Release|ARM {731CD95E-7CCD-495F-9456-E2D71357C807}.Release|ia32.ActiveCfg = Release|Win32 {731CD95E-7CCD-495F-9456-E2D71357C807}.Release|ia32.Build.0 = Release|Win32 {731CD95E-7CCD-495F-9456-E2D71357C807}.Release|x64.ActiveCfg = Release|x64 {731CD95E-7CCD-495F-9456-E2D71357C807}.Release|x64.Build.0 = Release|x64 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Debug|aa64.ActiveCfg = Debug|ARM64 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Debug|aa64.Build.0 = Debug|ARM64 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Debug|arm.ActiveCfg = Debug|ARM {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Debug|arm.Build.0 = Debug|ARM {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Debug|ia32.ActiveCfg = Debug|Win32 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Debug|ia32.Build.0 = Debug|Win32 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Debug|x64.ActiveCfg = Debug|x64 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Debug|x64.Build.0 = Debug|x64 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Release|aa64.ActiveCfg = Release|ARM64 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Release|aa64.Build.0 = Release|ARM64 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Release|arm.ActiveCfg = Release|ARM {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Release|arm.Build.0 = Release|ARM {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Release|ia32.ActiveCfg = Release|Win32 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Release|ia32.Build.0 = Release|Win32 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Release|x64.ActiveCfg = Release|x64 {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1}.Release|x64.Build.0 = Release|x64 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Debug|aa64.ActiveCfg = Debug|ARM64 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Debug|aa64.Build.0 = Debug|ARM64 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Debug|arm.ActiveCfg = Debug|ARM {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Debug|arm.Build.0 = Debug|ARM {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Debug|ia32.ActiveCfg = Debug|Win32 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Debug|ia32.Build.0 = Debug|Win32 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Debug|x64.ActiveCfg = Debug|x64 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Debug|x64.Build.0 = Debug|x64 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Release|aa64.ActiveCfg = Release|ARM64 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Release|aa64.Build.0 = Release|ARM64 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Release|arm.ActiveCfg = Release|ARM {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Release|arm.Build.0 = Release|ARM {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Release|ia32.ActiveCfg = Release|Win32 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Release|ia32.Build.0 = Release|Win32 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Release|x64.ActiveCfg = Release|x64 {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5}.Release|x64.Build.0 = Release|x64 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Debug|aa64.ActiveCfg = Debug|ARM64 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Debug|aa64.Build.0 = Debug|ARM64 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Debug|arm.ActiveCfg = Debug|ARM {9BA1F692-0824-442E-B700-69C3D85D64EE}.Debug|arm.Build.0 = Debug|ARM {9BA1F692-0824-442E-B700-69C3D85D64EE}.Debug|ia32.ActiveCfg = Debug|Win32 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Debug|ia32.Build.0 = Debug|Win32 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Debug|x64.ActiveCfg = Debug|x64 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Debug|x64.Build.0 = Debug|x64 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Release|aa64.ActiveCfg = Release|ARM64 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Release|aa64.Build.0 = Release|ARM64 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Release|arm.ActiveCfg = Release|ARM {9BA1F692-0824-442E-B700-69C3D85D64EE}.Release|arm.Build.0 = Release|ARM {9BA1F692-0824-442E-B700-69C3D85D64EE}.Release|ia32.ActiveCfg = Release|Win32 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Release|ia32.Build.0 = Release|Win32 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Release|x64.ActiveCfg = Release|x64 {9BA1F692-0824-442E-B700-69C3D85D64EE}.Release|x64.Build.0 = Release|x64 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Debug|aa64.ActiveCfg = Debug|ARM64 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Debug|aa64.Build.0 = Debug|ARM64 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Debug|arm.ActiveCfg = Debug|ARM {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Debug|arm.Build.0 = Debug|ARM {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Debug|ia32.ActiveCfg = Debug|Win32 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Debug|ia32.Build.0 = Debug|Win32 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Debug|x64.ActiveCfg = Debug|x64 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Debug|x64.Build.0 = Debug|x64 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Release|aa64.ActiveCfg = Release|ARM64 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Release|aa64.Build.0 = Release|ARM64 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Release|arm.ActiveCfg = Release|ARM {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Release|arm.Build.0 = Release|ARM {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Release|ia32.ActiveCfg = Release|Win32 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Release|ia32.Build.0 = Release|Win32 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Release|x64.ActiveCfg = Release|x64 {DCB81D4D-15B8-440D-A757-5B0036C0F4F6}.Release|x64.Build.0 = Release|x64 {AFF91400-F772-419A-9463-D9900B43C666}.Debug|aa64.ActiveCfg = Debug|ARM64 {AFF91400-F772-419A-9463-D9900B43C666}.Debug|aa64.Build.0 = Debug|ARM64 {AFF91400-F772-419A-9463-D9900B43C666}.Debug|arm.ActiveCfg = Debug|ARM {AFF91400-F772-419A-9463-D9900B43C666}.Debug|arm.Build.0 = Debug|ARM {AFF91400-F772-419A-9463-D9900B43C666}.Debug|ia32.ActiveCfg = Debug|Win32 {AFF91400-F772-419A-9463-D9900B43C666}.Debug|ia32.Build.0 = Debug|Win32 {AFF91400-F772-419A-9463-D9900B43C666}.Debug|x64.ActiveCfg = Debug|x64 {AFF91400-F772-419A-9463-D9900B43C666}.Debug|x64.Build.0 = Debug|x64 {AFF91400-F772-419A-9463-D9900B43C666}.Release|aa64.ActiveCfg = Release|ARM64 {AFF91400-F772-419A-9463-D9900B43C666}.Release|aa64.Build.0 = Release|ARM64 {AFF91400-F772-419A-9463-D9900B43C666}.Release|arm.ActiveCfg = Release|ARM {AFF91400-F772-419A-9463-D9900B43C666}.Release|arm.Build.0 = Release|ARM {AFF91400-F772-419A-9463-D9900B43C666}.Release|ia32.ActiveCfg = Release|Win32 {AFF91400-F772-419A-9463-D9900B43C666}.Release|ia32.Build.0 = Release|Win32 {AFF91400-F772-419A-9463-D9900B43C666}.Release|x64.ActiveCfg = Release|x64 {AFF91400-F772-419A-9463-D9900B43C666}.Release|x64.Build.0 = Release|x64 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Debug|aa64.ActiveCfg = Debug|ARM64 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Debug|aa64.Build.0 = Debug|ARM64 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Debug|arm.ActiveCfg = Debug|ARM {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Debug|arm.Build.0 = Debug|ARM {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Debug|ia32.ActiveCfg = Debug|Win32 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Debug|ia32.Build.0 = Debug|Win32 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Debug|x64.ActiveCfg = Debug|x64 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Debug|x64.Build.0 = Debug|x64 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Release|aa64.ActiveCfg = Release|ARM64 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Release|aa64.Build.0 = Release|ARM64 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Release|arm.ActiveCfg = Release|ARM {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Release|arm.Build.0 = Release|ARM {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Release|ia32.ActiveCfg = Release|Win32 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Release|ia32.Build.0 = Release|Win32 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Release|x64.ActiveCfg = Release|x64 {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E}.Release|x64.Build.0 = Release|x64 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Debug|aa64.ActiveCfg = Debug|ARM64 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Debug|aa64.Build.0 = Debug|ARM64 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Debug|arm.ActiveCfg = Debug|ARM {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Debug|arm.Build.0 = Debug|ARM {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Debug|ia32.ActiveCfg = Debug|Win32 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Debug|ia32.Build.0 = Debug|Win32 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Debug|x64.ActiveCfg = Debug|x64 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Debug|x64.Build.0 = Debug|x64 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Release|aa64.ActiveCfg = Release|ARM64 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Release|aa64.Build.0 = Release|ARM64 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Release|arm.ActiveCfg = Release|ARM {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Release|arm.Build.0 = Release|ARM {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Release|ia32.ActiveCfg = Release|Win32 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Release|ia32.Build.0 = Release|Win32 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Release|x64.ActiveCfg = Release|x64 {7F52AAA4-2071-49D6-A783-529D3CB5AF61}.Release|x64.Build.0 = Release|x64 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Debug|aa64.ActiveCfg = Debug|ARM64 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Debug|aa64.Build.0 = Debug|ARM64 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Debug|arm.ActiveCfg = Debug|ARM {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Debug|arm.Build.0 = Debug|ARM {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Debug|ia32.ActiveCfg = Debug|Win32 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Debug|ia32.Build.0 = Debug|Win32 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Debug|x64.ActiveCfg = Debug|x64 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Debug|x64.Build.0 = Debug|x64 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Release|aa64.ActiveCfg = Release|ARM64 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Release|aa64.Build.0 = Release|ARM64 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Release|arm.ActiveCfg = Release|ARM {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Release|arm.Build.0 = Release|ARM {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Release|ia32.ActiveCfg = Release|Win32 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Release|ia32.Build.0 = Release|Win32 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Release|x64.ActiveCfg = Release|x64 {0AE45092-20C3-4999-BFDC-77F2D0FDFF60}.Release|x64.Build.0 = Release|x64 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Debug|aa64.ActiveCfg = Debug|ARM64 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Debug|aa64.Build.0 = Debug|ARM64 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Debug|arm.ActiveCfg = Debug|ARM {04D2685F-8150-47E0-BC10-338D2D6B804C}.Debug|arm.Build.0 = Debug|ARM {04D2685F-8150-47E0-BC10-338D2D6B804C}.Debug|ia32.ActiveCfg = Debug|Win32 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Debug|ia32.Build.0 = Debug|Win32 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Debug|x64.ActiveCfg = Debug|x64 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Debug|x64.Build.0 = Debug|x64 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Release|aa64.ActiveCfg = Release|ARM64 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Release|aa64.Build.0 = Release|ARM64 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Release|arm.ActiveCfg = Release|ARM {04D2685F-8150-47E0-BC10-338D2D6B804C}.Release|arm.Build.0 = Release|ARM {04D2685F-8150-47E0-BC10-338D2D6B804C}.Release|ia32.ActiveCfg = Release|Win32 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Release|ia32.Build.0 = Release|Win32 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Release|x64.ActiveCfg = Release|x64 {04D2685F-8150-47E0-BC10-338D2D6B804C}.Release|x64.Build.0 = Release|x64 {6C664A44-BC53-4225-A14B-D969D4EED647}.Debug|aa64.ActiveCfg = Debug|ARM64 {6C664A44-BC53-4225-A14B-D969D4EED647}.Debug|aa64.Build.0 = Debug|ARM64 {6C664A44-BC53-4225-A14B-D969D4EED647}.Debug|arm.ActiveCfg = Debug|ARM {6C664A44-BC53-4225-A14B-D969D4EED647}.Debug|arm.Build.0 = Debug|ARM {6C664A44-BC53-4225-A14B-D969D4EED647}.Debug|ia32.ActiveCfg = Debug|Win32 {6C664A44-BC53-4225-A14B-D969D4EED647}.Debug|ia32.Build.0 = Debug|Win32 {6C664A44-BC53-4225-A14B-D969D4EED647}.Debug|x64.ActiveCfg = Debug|x64 {6C664A44-BC53-4225-A14B-D969D4EED647}.Debug|x64.Build.0 = Debug|x64 {6C664A44-BC53-4225-A14B-D969D4EED647}.Release|aa64.ActiveCfg = Release|ARM64 {6C664A44-BC53-4225-A14B-D969D4EED647}.Release|aa64.Build.0 = Release|ARM64 {6C664A44-BC53-4225-A14B-D969D4EED647}.Release|arm.ActiveCfg = Release|ARM {6C664A44-BC53-4225-A14B-D969D4EED647}.Release|arm.Build.0 = Release|ARM {6C664A44-BC53-4225-A14B-D969D4EED647}.Release|ia32.ActiveCfg = Release|Win32 {6C664A44-BC53-4225-A14B-D969D4EED647}.Release|ia32.Build.0 = Release|Win32 {6C664A44-BC53-4225-A14B-D969D4EED647}.Release|x64.ActiveCfg = Release|x64 {6C664A44-BC53-4225-A14B-D969D4EED647}.Release|x64.Build.0 = Release|x64 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Debug|aa64.ActiveCfg = Debug|ARM64 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Debug|aa64.Build.0 = Debug|ARM64 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Debug|arm.ActiveCfg = Debug|ARM {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Debug|arm.Build.0 = Debug|ARM {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Debug|ia32.ActiveCfg = Debug|Win32 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Debug|ia32.Build.0 = Debug|Win32 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Debug|x64.ActiveCfg = Debug|x64 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Debug|x64.Build.0 = Debug|x64 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Release|aa64.ActiveCfg = Release|ARM64 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Release|aa64.Build.0 = Release|ARM64 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Release|arm.ActiveCfg = Release|ARM {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Release|arm.Build.0 = Release|ARM {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Release|ia32.ActiveCfg = Release|Win32 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Release|ia32.Build.0 = Release|Win32 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Release|x64.ActiveCfg = Release|x64 {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA}.Release|x64.Build.0 = Release|x64 {06089797-265A-4FF5-838E-25374C1F0159}.Debug|aa64.ActiveCfg = Debug|ARM64 {06089797-265A-4FF5-838E-25374C1F0159}.Debug|aa64.Build.0 = Debug|ARM64 {06089797-265A-4FF5-838E-25374C1F0159}.Debug|arm.ActiveCfg = Debug|ARM {06089797-265A-4FF5-838E-25374C1F0159}.Debug|arm.Build.0 = Debug|ARM {06089797-265A-4FF5-838E-25374C1F0159}.Debug|ia32.ActiveCfg = Debug|Win32 {06089797-265A-4FF5-838E-25374C1F0159}.Debug|ia32.Build.0 = Debug|Win32 {06089797-265A-4FF5-838E-25374C1F0159}.Debug|x64.ActiveCfg = Debug|x64 {06089797-265A-4FF5-838E-25374C1F0159}.Debug|x64.Build.0 = Debug|x64 {06089797-265A-4FF5-838E-25374C1F0159}.Release|aa64.ActiveCfg = Release|ARM64 {06089797-265A-4FF5-838E-25374C1F0159}.Release|aa64.Build.0 = Release|ARM64 {06089797-265A-4FF5-838E-25374C1F0159}.Release|arm.ActiveCfg = Release|ARM {06089797-265A-4FF5-838E-25374C1F0159}.Release|arm.Build.0 = Release|ARM {06089797-265A-4FF5-838E-25374C1F0159}.Release|ia32.ActiveCfg = Release|Win32 {06089797-265A-4FF5-838E-25374C1F0159}.Release|ia32.Build.0 = Release|Win32 {06089797-265A-4FF5-838E-25374C1F0159}.Release|x64.ActiveCfg = Release|x64 {06089797-265A-4FF5-838E-25374C1F0159}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {7FD7832D-F7C7-4B3F-9B6D-8A48BDC74E6C} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {ED1B23FB-FCCA-4ED7-9E99-EEAAD9F2FB7F} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {3947DB96-3A01-4F8C-B7C1-2C4D6C00D640} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {80BD2830-EF30-4110-97BA-1B9A7B855996} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {627A0AFB-B9A9-4FC9-9D6B-4D9E227A0666} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {7C059723-3CD2-484B-8064-238CE7A437BD} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {5AD238D9-79AA-4166-BC86-EF759EA45BAB} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {731CD95E-7CCD-495F-9456-E2D71357C807} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {6F1EB89D-8968-4C3B-9F77-B23788F2D8C1} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {5D8EA8B2-C75F-4E3A-B0BC-E6B77AC77FF5} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {9BA1F692-0824-442E-B700-69C3D85D64EE} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {DCB81D4D-15B8-440D-A757-5B0036C0F4F6} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {AFF91400-F772-419A-9463-D9900B43C666} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {3428718B-4B7E-48F5-8D15-B9F3E3CFF38E} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {7F52AAA4-2071-49D6-A783-529D3CB5AF61} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {0AE45092-20C3-4999-BFDC-77F2D0FDFF60} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {04D2685F-8150-47E0-BC10-338D2D6B804C} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {6C664A44-BC53-4225-A14B-D969D4EED647} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {6E45A33B-E4A0-48D4-81AE-ACFD46FDB1CA} = {DF105116-5A3A-4D48-AB1D-7221690ED545} {06089797-265A-4FF5-838E-25374C1F0159} = {DF105116-5A3A-4D48-AB1D-7221690ED545} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {376E6530-5878-4CF4-AFB7-123F799056A2} EndGlobalSection EndGlobal ncroxon-gnu-efi-157d47c/gnuefi/000077500000000000000000000000001471215650600163545ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/gnuefi/Makefile000066400000000000000000000077131471215650600200240ustar00rootroot00000000000000# # Copyright (C) 1999-2001 Hewlett-Packard Co. # Contributed by David Mosberger # Contributed by Stephane Eranian # # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * 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. # * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS # BE LIABLE FOR ANYDIRECT, 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. # SRCDIR = . VPATH = $(SRCDIR) TOPDIR = $(SRCDIR)/.. include $(SRCDIR)/../Make.defaults PKGCONFIGDIR ?= $(LIBDIR)/pkgconfig FILES = reloc_$(ARCH) OBJS = $(FILES:%=%.o) ifneq ($(HAVE_EFI_OBJCOPY),) gnu_efi_default_is_objcopy=true else gnu_efi_default_is_objcopy=false endif # https://uefi.org/specs/UEFI/2.10/03_Boot_Manager.html#uefi-image-types ifeq ($(ARCH),x86_64) efi_machine_type_name=x64 endif ifeq ($(ARCH),ia32) efi_machine_type_name=ia32 endif ifeq ($(ARCH),arm) efi_machine_type_name=arm endif ifeq ($(ARCH),aarch64) efi_machine_type_name=aa64 endif ifeq ($(ARCH),ia64) efi_machine_type_name=ia64 endif ifeq ($(ARCH),riscv64) efi_machine_type_name=riscv64 endif ifeq ($(ARCH),loongarch64) efi_machine_type_name=loongarch64 endif ifeq ($(ARCH),mips64el) efi_machine_type_name=mips64 endif # on aarch64, avoid jump tables before all relocations have been processed reloc_aarch64.o: CFLAGS += -fno-jump-tables ifneq (,$(filter $(ARCH),aarch64 riscv64 ia32)) CRT0_LOCAL_TARGET = crt0-efi-$(ARCH)-local.o endif TARGETS = crt0-efi-$(ARCH).o libgnuefi.a $(CRT0_LOCAL_TARGET) all: $(TARGETS) gnu-efi.pc libgnuefi.a: $(OBJS) @$(ECHO) " AR $(notdir $@)" $(HIDE)$(AR) $(ARFLAGS) $@ $^ gnu-efi.pc: @$(ECHO) " GEN $(notdir $@)" $(HIDE)sed \ -e 's:@PREFIX@:$(PREFIX):g' \ -e 's:@EXEC_PREFIX@:$(EXEC_PREFIX):g' \ -e 's:@INCLUDEDIR@:$(INCLUDEDIR):g' \ -e 's:@LIBDIR@:$(LIBDIR):g' \ -e 's:@VERSION@:$(VERSION):g' \ -e 's:@efi_machine_type_name@:$(efi_machine_type_name):g' \ -e 's:@gnu_efi_arch@:$(ARCH):g' \ -e 's:@gnu_efi_default_is_objcopy@:$(gnu_efi_default_is_objcopy):g' \ $(SRCDIR)/gnu-efi.pc.in > gnu-efi.pc clean: @rm -vf $(TARGETS) *~ *.o $(OBJS) gnu-efi.pc install: mkdir -p $(INSTALLROOT)$(LIBDIR) $(INSTALL) -m 644 $(TARGETS) $(INSTALLROOT)$(LIBDIR) ifneq (,$(filter $(ARCH),x86_64 ia32)) $(INSTALL) -m 644 $(SRCDIR)/elf_$(ARCH)_fbsd_efi.lds $(INSTALLROOT)$(LIBDIR) endif ifneq (,$(filter $(ARCH),aarch64 riscv64 ia32)) $(INSTALL) -m 644 $(SRCDIR)/elf_$(ARCH)_efi_local.lds $(INSTALLROOT)$(LIBDIR) endif $(INSTALL) -m 644 $(SRCDIR)/elf_$(ARCH)_efi.lds $(INSTALLROOT)$(LIBDIR) $(INSTALL) -d $(INSTALLROOT)$(PKGCONFIGDIR) $(INSTALL) -m 644 gnu-efi.pc $(INSTALLROOT)$(PKGCONFIGDIR) include $(SRCDIR)/../Make.rules ncroxon-gnu-efi-157d47c/gnuefi/crt0-efi-aarch64-local.S000066400000000000000000000136641471215650600224410ustar00rootroot00000000000000/* * crt0-efi-aarch64-local.S - PE/COFF header for AArch64 EFI applications (without suitable objcopy) * * Copyright (C) 2014 Linaro Ltd. * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ .section .text.head /* * Magic "MZ" signature for PE/COFF */ .globl ImageBase ImageBase: .ascii "MZ" .skip 58 // 'MZ' + pad + offset == 64 .4byte pe_header - ImageBase // Offset to the PE header. pe_header: .ascii "PE" .2byte 0 coff_header: .2byte 0xaa64 // AArch64 .2byte 4 // nr_sections .4byte 0 // TimeDateStamp .4byte 0 // PointerToSymbolTable .4byte 0 // NumberOfSymbols .2byte section_table - optional_header // SizeOfOptionalHeader .2byte 0x206 // Characteristics. // IMAGE_FILE_DEBUG_STRIPPED | // IMAGE_FILE_EXECUTABLE_IMAGE | // IMAGE_FILE_LINE_NUMS_STRIPPED optional_header: .2byte 0x20b // PE32+ format .byte 0x02 // MajorLinkerVersion .byte 0x14 // MinorLinkerVersion .4byte _text_size - ImageBase // SizeOfCode .4byte _alldata_size - ImageBase // SizeOfInitializedData .4byte 0 // SizeOfUninitializedData .4byte _start - ImageBase // AddressOfEntryPoint .4byte _text - ImageBase // BaseOfCode extra_header_fields: .8byte 0 // ImageBase .4byte 0x1000 // SectionAlignment .4byte 0x1000 // FileAlignment .2byte 0 // MajorOperatingSystemVersion .2byte 0 // MinorOperatingSystemVersion .2byte 0 // MajorImageVersion .2byte 0 // MinorImageVersion .2byte 0 // MajorSubsystemVersion .2byte 0 // MinorSubsystemVersion .4byte 0 // Win32VersionValue .4byte _image_end - ImageBase // SizeOfImage // Everything before the kernel image is considered part of the header .4byte _text - ImageBase // SizeOfHeaders .4byte 0 // CheckSum .2byte EFI_SUBSYSTEM // Subsystem .2byte 0 // DllCharacteristics .8byte 0 // SizeOfStackReserve .8byte 0 // SizeOfStackCommit .8byte 0 // SizeOfHeapReserve .8byte 0 // SizeOfHeapCommit .4byte 0 // LoaderFlags .4byte 0x10 // NumberOfRvaAndSizes .8byte 0 // ExportTable .8byte 0 // ImportTable .8byte 0 // ResourceTable .8byte 0 // ExceptionTable .8byte 0 // CertificationTable .4byte _reloc - ImageBase // BaseRelocationTable (VirtualAddress) .4byte _reloc_vsize - ImageBase // BaseRelocationTable (Size) .8byte 0 // Debug .8byte 0 // Architecture .8byte 0 // Global Ptr .8byte 0 // TLS Table .8byte 0 // Load Config Table .8byte 0 // Bound Import .8byte 0 // IAT .8byte 0 // Delay Import Descriptor .8byte 0 // CLR Runtime Header .8byte 0 // Reserved, must be zero // Section table section_table: .ascii ".text\0\0\0" .4byte _text_vsize - ImageBase // VirtualSize .4byte _text - ImageBase // VirtualAddress .4byte _text_size - ImageBase // SizeOfRawData .4byte _text - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations (0 for executables) .4byte 0 // PointerToLineNumbers (0 for executables) .2byte 0 // NumberOfRelocations (0 for executables) .2byte 0 // NumberOfLineNumbers (0 for executables) .4byte 0x60000020 // Characteristics (section flags) .ascii ".data\0\0\0" .4byte _data_vsize - ImageBase // VirtualSize .4byte _data - ImageBase // VirtualAddress .4byte _data_size - ImageBase // SizeOfRawData .4byte _data - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0xC0000040 // Characteristics (section flags) /* * The EFI application loader requires a relocation section * because EFI applications must be relocatable. This is a * dummy section as far as we are concerned. */ .ascii ".reloc\0\0" .4byte _reloc_vsize - ImageBase // VirtualSize .4byte _reloc - ImageBase // VirtualAddress .4byte _reloc_size - ImageBase // SizeOfRawData .4byte _reloc - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0x42000040 // Characteristics (section flags) .ascii ".rodata\0" .4byte _rodata_vsize - ImageBase // VirtualSize .4byte _rodata - ImageBase // VirtualAddress .4byte _rodata_size - ImageBase // SizeOfRawData .4byte _rodata - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0x40000040 // Characteristics (section flags) .text .globl _start .type _start,%function _start: stp x29, x30, [sp, #-32]! mov x29, sp stp x0, x1, [sp, #16] mov x2, x0 mov x3, x1 adr x0, ImageBase adrp x1, _DYNAMIC add x1, x1, #:lo12:_DYNAMIC bl _relocate cbnz x0, .L_exit ldp x0, x1, [sp, #16] bl _entry .L_exit: ldp x29, x30, [sp], #32 ret // hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: .data dummy0: .4byte 0 dummy1: .4byte 0 #define IMAGE_REL_ABSOLUTE 0 .section .reloc, "a", %progbits .4byte dummy1 - dummy0 // Page RVA .4byte 12 // Block Size (2*4+2*2), must be aligned by 32 Bits .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/crt0-efi-aarch64.S000066400000000000000000000031651471215650600213440ustar00rootroot00000000000000/* * crt0-efi-aarch64.S - PE/COFF header for AArch64 EFI applications * * Copyright (C) 2014 Linaro Ltd. * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ .text .align 12 .globl _start .type _start,%function _start: stp x29, x30, [sp, #-32]! mov x29, sp stp x0, x1, [sp, #16] mov x2, x0 mov x3, x1 adr x0, ImageBase adrp x1, _DYNAMIC add x1, x1, #:lo12:_DYNAMIC bl _relocate cbnz x0, .L_exit ldp x0, x1, [sp, #16] bl _entry .L_exit: ldp x29, x30, [sp], #32 ret // hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: .data dummy0: .4byte 0 dummy1: .4byte 0 #define IMAGE_REL_ABSOLUTE 0 .section .reloc, "a", %progbits .4byte dummy1 - dummy0 // Page RVA .4byte 12 // Block Size (2*4+2*2), must be aligned by 32 Bits .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/crt0-efi-arm.S000066400000000000000000000137501471215650600206740ustar00rootroot00000000000000/* * crt0-efi-arm.S - PE/COFF header for ARM EFI applications * * Copyright (C) 2014 Linaro Ltd. * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ .section .text.head /* * Magic "MZ" signature for PE/COFF */ .globl ImageBase ImageBase: .ascii "MZ" .skip 58 // 'MZ' + pad + offset == 64 .4byte pe_header - ImageBase // Offset to the PE header. pe_header: .ascii "PE" .2byte 0 coff_header: .2byte 0x1c2 // Mixed ARM/Thumb .2byte 4 // nr_sections .4byte 0 // TimeDateStamp .4byte 0 // PointerToSymbolTable .4byte 0 // NumberOfSymbols .2byte section_table - optional_header // SizeOfOptionalHeader .2byte 0x306 // Characteristics. // IMAGE_FILE_32BIT_MACHINE | // IMAGE_FILE_DEBUG_STRIPPED | // IMAGE_FILE_EXECUTABLE_IMAGE | // IMAGE_FILE_LINE_NUMS_STRIPPED optional_header: .2byte 0x10b // PE32+ format .byte 0x02 // MajorLinkerVersion .byte 0x14 // MinorLinkerVersion .4byte _text_size - ImageBase // SizeOfCode .4byte _alldata_size - ImageBase // SizeOfInitializedData .4byte 0 // SizeOfUninitializedData .4byte _text - ImageBase // AddressOfEntryPoint .4byte _text - ImageBase // BaseOfCode .4byte _data - ImageBase // BaseOfData extra_header_fields: .4byte 0 // ImageBase .4byte 0x1000 // SectionAlignment .4byte 0x1000 // FileAlignment .2byte 0 // MajorOperatingSystemVersion .2byte 0 // MinorOperatingSystemVersion .2byte 0 // MajorImageVersion .2byte 0 // MinorImageVersion .2byte 0 // MajorSubsystemVersion .2byte 0 // MinorSubsystemVersion .4byte 0 // Win32VersionValue .4byte _image_end - ImageBase // SizeOfImage // Everything before the kernel image is considered part of the header .4byte _text - ImageBase // SizeOfHeaders .4byte 0 // CheckSum .2byte EFI_SUBSYSTEM // Subsystem .2byte 0 // DllCharacteristics .4byte 0 // SizeOfStackReserve .4byte 0 // SizeOfStackCommit .4byte 0 // SizeOfHeapReserve .4byte 0 // SizeOfHeapCommit .4byte 0 // LoaderFlags .4byte 0x10 // NumberOfRvaAndSizes .8byte 0 // ExportTable .8byte 0 // ImportTable .8byte 0 // ResourceTable .8byte 0 // ExceptionTable .8byte 0 // CertificationTable .4byte _reloc - ImageBase // BaseRelocationTable (VirtualAddress) .4byte _reloc_vsize - ImageBase // BaseRelocationTable (Size) .8byte 0 // Debug .8byte 0 // Architecture .8byte 0 // Global Ptr .8byte 0 // TLS Table .8byte 0 // Load Config Table .8byte 0 // Bound Import .8byte 0 // IAT .8byte 0 // Delay Import Descriptor .8byte 0 // CLR Runtime Header .8byte 0 // Reserved, must be zero // Section table section_table: .ascii ".text\0\0\0" .4byte _text_vsize - ImageBase // VirtualSize .4byte _text - ImageBase // VirtualAddress .4byte _text_size - ImageBase // SizeOfRawData .4byte _text - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations (0 for executables) .4byte 0 // PointerToLineNumbers (0 for executables) .2byte 0 // NumberOfRelocations (0 for executables) .2byte 0 // NumberOfLineNumbers (0 for executables) .4byte 0x60000020 // Characteristics (section flags) .ascii ".data\0\0\0" .4byte _data_vsize - ImageBase // VirtualSize .4byte _data - ImageBase // VirtualAddress .4byte _data_size - ImageBase // SizeOfRawData .4byte _data - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0xC0000040 // Characteristics (section flags) /* * The EFI application loader requires a relocation section * because EFI applications must be relocatable. This is a * dummy section as far as we are concerned. */ .ascii ".reloc\0\0" .4byte _reloc_vsize - ImageBase // VirtualSize .4byte _reloc - ImageBase // VirtualAddress .4byte _reloc_size - ImageBase // SizeOfRawData .4byte _reloc - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0x42000040 // Characteristics (section flags) .ascii ".rodata\0" .4byte _rodata_vsize - ImageBase // VirtualSize .4byte _rodata - ImageBase // VirtualAddress .4byte _rodata_size - ImageBase // SizeOfRawData .4byte _rodata - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0x40000040 // Characteristics (section flags) .text .globl _start .type _start,%function _start: stmfd sp!, {r0-r2, lr} mov r2, r0 mov r3, r1 adr r1, .L_DYNAMIC ldr r0, [r1] add r1, r0, r1 adr r0, _start sub r0, r0, #0x1000 bl _relocate teq r0, #0 bne .L_exit ldmfd sp, {r0-r1} bl _entry .L_exit: add sp, sp, #12 ldr pc, [sp], #4 .L_DYNAMIC: .4byte _DYNAMIC - . // hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: .data dummy0: .4byte 0 dummy1: .4byte 0 #define IMAGE_REL_ABSOLUTE 0 .section .areloc, "a", %progbits .4byte dummy1 - dummy0 // Page RVA .4byte 12 // Block Size (2*4+2*2), must be aligned by 32 Bits .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/crt0-efi-ia32-local.S000066400000000000000000000125731471215650600217450ustar00rootroot00000000000000.section .text.head /* * Magic "MZ" signature for PE/COFF */ .globl ImageBase ImageBase: .ascii "MZ" .skip 58 // 'MZ' + pad + offset == 64 .4byte pe_header - ImageBase // Offset to the PE header. pe_header: .ascii "PE" .2byte 0 coff_header: .2byte 0x14c // i386+ .2byte 4 // nr_sections .4byte 0 // TimeDateStamp .4byte 0 // PointerToSymbolTable .4byte 0 // NumberOfSymbols .2byte section_table - optional_header // SizeOfOptionalHeader .2byte 0x306 // Characteristics. // IMAGE_FILE_32BIT_MACHINE | // IMAGE_FILE_DEBUG_STRIPPED | // IMAGE_FILE_EXECUTABLE_IMAGE | // IMAGE_FILE_LINE_NUMS_STRIPPED optional_header: .2byte 0x10b // PE32+ format .byte 0x02 // MajorLinkerVersion .byte 0x14 // MinorLinkerVersion .4byte _text_size - ImageBase // SizeOfCode .4byte _alldata_size - ImageBase // SizeOfInitializedData .4byte 0 // SizeOfUninitializedData .4byte _start - ImageBase // AddressOfEntryPoint .4byte _start - ImageBase // BaseOfCode .4byte _data - ImageBase // BaseOfData extra_header_fields: .4byte 0 // ImageBase .4byte 0x1000 // SectionAlignment .4byte 0x1000 // FileAlignment .2byte 0 // MajorOperatingSystemVersion .2byte 0 // MinorOperatingSystemVersion .2byte 0 // MajorImageVersion .2byte 0 // MinorImageVersion .2byte 0 // MajorSubsystemVersion .2byte 0 // MinorSubsystemVersion .4byte 0 // Win32VersionValue .4byte _image_end - ImageBase // SizeOfImage // Everything before the kernel image is considered part of the header .4byte _start - ImageBase // SizeOfHeaders .4byte 0 // CheckSum .2byte EFI_SUBSYSTEM // Subsystem .2byte 0 // DllCharacteristics .4byte 0 // SizeOfStackReserve .4byte 0 // SizeOfStackCommit .4byte 0 // SizeOfHeapReserve .4byte 0 // SizeOfHeapCommit .4byte 0 // LoaderFlags .4byte 0x10 // NumberOfRvaAndSizes .8byte 0 // ExportTable .8byte 0 // ImportTable .8byte 0 // ResourceTable .8byte 0 // ExceptionTable .8byte 0 // CertificationTable .4byte _reloc - ImageBase // BaseRelocationTable (VirtualAddress) .4byte _reloc_vsize - ImageBase // BaseRelocationTable (Size) .8byte 0 // Debug .8byte 0 // Architecture .8byte 0 // Global Ptr .8byte 0 // TLS Table .8byte 0 // Load Config Table .8byte 0 // Bound Import .8byte 0 // IAT .8byte 0 // Delay Import Descriptor .8byte 0 // CLR Runtime Header .8byte 0 // Reserved, must be zero // Section table section_table: .ascii ".text\0\0\0" .4byte _text_vsize - ImageBase // VirtualSize .4byte _text - ImageBase // VirtualAddress .4byte _text_size - ImageBase // SizeOfRawData .4byte _text - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations (0 for executables) .4byte 0 // PointerToLineNumbers (0 for executables) .2byte 0 // NumberOfRelocations (0 for executables) .2byte 0 // NumberOfLineNumbers (0 for executables) .4byte 0x60000020 // Characteristics (section flags) .ascii ".data\0\0\0" .4byte _data_vsize - ImageBase // VirtualSize .4byte _data - ImageBase // VirtualAddress .4byte _data_size - ImageBase // SizeOfRawData .4byte _data - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0xC0000040 // Characteristics (section flags) /* * The EFI application loader requires a relocation section * because EFI applications must be relocatable. This is a * dummy section as far as we are concerned. */ .ascii ".reloc\0\0" .4byte _reloc_vsize - ImageBase // VirtualSize .4byte _reloc - ImageBase // VirtualAddress .4byte _reloc_size - ImageBase // SizeOfRawData .4byte _reloc - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0x42000040 // Characteristics (section flags) .ascii ".rodata\0" .4byte _rodata_vsize - ImageBase // VirtualSize .4byte _rodata - ImageBase // VirtualAddress .4byte _rodata_size - ImageBase // SizeOfRawData .4byte _rodata - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0x40000040 // Characteristics (section flags) .text .globl _start .type _start,%function _start: pushl %ebp movl %esp,%ebp pushl 12(%ebp) # copy "image" argument pushl 8(%ebp) # copy "systab" argument call 0f 0: popl %eax movl %eax,%ebx addl $ImageBase-0b,%eax # %eax = ldbase addl $_DYNAMIC-0b,%ebx # %ebx = _DYNAMIC pushl %ebx # pass _DYNAMIC as second argument pushl %eax # pass ldbase as first argument call _relocate popl %ebx popl %ebx testl %eax,%eax jne .L_exit call _entry # call app with "image" and "systab" argument .L_exit: leave ret // hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: .data dummy0: .4byte 0 dummy1: .4byte 0 #define IMAGE_REL_ABSOLUTE 0 .section .areloc, "a", %progbits .4byte dummy1 - dummy0 // Page RVA .4byte 12 // Block Size (2*4+2*2), must be aligned by 32 Bits .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/crt0-efi-ia32.S000066400000000000000000000052721471215650600206530ustar00rootroot00000000000000/* crt0-efi-ia32.S - x86 EFI startup code. Copyright (C) 1999 Hewlett-Packard Co. Contributed by David Mosberger . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, 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. */ .text .align 4 .globl _start .type _start,%function _start: pushl %ebp movl %esp,%ebp pushl 12(%ebp) # copy "image" argument pushl 8(%ebp) # copy "systab" argument call 0f 0: popl %eax movl %eax,%ebx addl $ImageBase-0b,%eax # %eax = ldbase addl $_DYNAMIC-0b,%ebx # %ebx = _DYNAMIC pushl %ebx # pass _DYNAMIC as second argument pushl %eax # pass ldbase as first argument call _relocate popl %ebx popl %ebx testl %eax,%eax jne .L_exit call _entry # call app with "image" and "systab" argument .L_exit: leave ret // hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: .data dummy0: .4byte 0 dummy1: .4byte 0 #define IMAGE_REL_ABSOLUTE 0 .section .reloc .4byte dummy1 - dummy0 // Page RVA .4byte 12 // Block Size (2*4+2*2), must be aligned by 32 Bits .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/crt0-efi-ia64.S000066400000000000000000000055251471215650600206610ustar00rootroot00000000000000/* crt0-efi-ia64.S - IA-64 EFI startup code. Copyright (C) 1999 Hewlett-Packard Co. Contributed by David Mosberger . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, 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. */ .text .psr abi64 .psr lsb .lsb .proc _start _start: alloc loc0=ar.pfs,2,2,2,0 mov loc1=rp movl out0=@gprel(ImageBase) // out0 <- ImageBase (ldbase) ;; add out0=out0,gp movl out1=@gprel(_DYNAMIC) // out1 <- _DYNAMIC ;; // avoid WAW on CFM add out1=out1,gp br.call.sptk.few rp=_relocate .Lret0: cmp.ne p6,p0=r0,r8 // r8 == EFI_SUCCESS? (p6) br.cond.sptk.few .exit // no -> .Lret1: mov out0=in0 // image handle mov out1=in1 // systab br.call.sptk.few rp=_entry .Lret2: .exit: mov ar.pfs=loc0 mov rp=loc1 ;; br.ret.sptk.few rp .endp _start // PE32+ wants a PLABEL, not the code address of the entry point: .align 16 .global _start_plabel .section .plabel, "a" _start_plabel: data8 _start data8 __gp // hand-craft a .reloc section for the plabel: #define IMAGE_REL_BASED_DIR64 10 .section .reloc, "a", %progbits data4 _start_plabel // Page RVA data4 12 // Block Size (2*4+2*2), must be aligned by 32 Bits data2 (IMAGE_REL_BASED_DIR64<<12) + 0 // reloc for plabel's entry point data2 (IMAGE_REL_BASED_DIR64<<12) + 8 // reloc for plabel's global pointer #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/crt0-efi-loongarch64.S000066400000000000000000000035501471215650600222400ustar00rootroot00000000000000/* * crt0-efi-loongarch64.S - PE/COFF header for LoongArch64 EFI applications * * Copyright (C) 2021 Loongson Technology Corporation Limited. * Copyright (C) 2014 Linaro Ltd. * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ .text .align 12 .globl _start .type _start, @function _start: addi.d $sp, $sp, -24 st.d $ra, $sp, 0 st.d $a0, $sp, 8 st.d $a1, $sp, 16 move $a2, $a0 // a2: ImageHandle move $a3, $a1 // a3: SystemTable la.local $a0, ImageBase // a0: ImageBase la.local $a1, _DYNAMIC // a1: DynamicSection bl _relocate bnez $a0, .L_exit ld.d $a0, $sp, 8 ld.d $a1, $sp, 16 bl _entry .L_exit: ld.d $ra, $sp, 0 addi.d $sp, $sp, 24 jr $ra // hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: .data dummy0: .4byte 0 dummy1: .4byte 0 #define IMAGE_REL_ABSOLUTE 0 .section .reloc, "a", %progbits .4byte dummy1 - dummy0 // Page RVA .4byte 12 // Block Size (2*4+2*2), must be aligned by 32 Bits .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/crt0-efi-mips64el.S000066400000000000000000000122121471215650600215500ustar00rootroot00000000000000/* * crt0-efi-mips64el.S - PE/COFF header for MIPS64 EFI applications * * Copyright (C) 2014 Linaro Ltd. * Copyright (C) 2017 Heiher * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ .section .text.head /* * Magic "MZ" signature for PE/COFF */ .globl ImageBase ImageBase: .ascii "MZ" .skip 58 // 'MZ' + pad + offset == 64 .4byte pe_header - ImageBase // Offset to the PE header. pe_header: .ascii "PE" .2byte 0 coff_header: .2byte 0x166 // MIPS little endian .2byte 2 // nr_sections .4byte 0 // TimeDateStamp .4byte 0 // PointerToSymbolTable .4byte 0 // NumberOfSymbols .2byte section_table - optional_header // SizeOfOptionalHeader .2byte 0x206 // Characteristics. // IMAGE_FILE_DEBUG_STRIPPED | // IMAGE_FILE_EXECUTABLE_IMAGE | // IMAGE_FILE_LINE_NUMS_STRIPPED optional_header: .2byte 0x20b // PE32+ format .byte 0x02 // MajorLinkerVersion .byte 0x14 // MinorLinkerVersion .4byte _edata - _start // SizeOfCode .4byte 0 // SizeOfInitializedData .4byte 0 // SizeOfUninitializedData .4byte _start - ImageBase // AddressOfEntryPoint .4byte _start - ImageBase // BaseOfCode extra_header_fields: .8byte 0 // ImageBase .4byte 0x20 // SectionAlignment .4byte 0x8 // FileAlignment .2byte 0 // MajorOperatingSystemVersion .2byte 0 // MinorOperatingSystemVersion .2byte 0 // MajorImageVersion .2byte 0 // MinorImageVersion .2byte 0 // MajorSubsystemVersion .2byte 0 // MinorSubsystemVersion .4byte 0 // Win32VersionValue .4byte _edata - ImageBase // SizeOfImage // Everything before the kernel image is considered part of the header .4byte _start - ImageBase // SizeOfHeaders .4byte 0 // CheckSum .2byte EFI_SUBSYSTEM // Subsystem .2byte 0 // DllCharacteristics .8byte 0 // SizeOfStackReserve .8byte 0 // SizeOfStackCommit .8byte 0 // SizeOfHeapReserve .8byte 0 // SizeOfHeapCommit .4byte 0 // LoaderFlags .4byte 0x10 // NumberOfRvaAndSizes .8byte 0 // ExportTable .8byte 0 // ImportTable .8byte 0 // ResourceTable .8byte 0 // ExceptionTable .8byte 0 // CertificationTable .8byte 0 // BaseRelocationTable .8byte 0 // Debug .8byte 0 // Architecture .8byte 0 // Global Ptr .8byte 0 // TLS Table .8byte 0 // Load Config Table .8byte 0 // Bound Import .8byte 0 // IAT .8byte 0 // Delay Import Descriptor .8byte 0 // CLR Runtime Header .8byte 0 // Reserved, must be zero // Section table section_table: /* * The EFI application loader requires a relocation section * because EFI applications must be relocatable. This is a * dummy section as far as we are concerned. */ .ascii ".reloc" .byte 0 .byte 0 // end of 0 padding of section name .4byte 0 .4byte 0 .4byte 0 // SizeOfRawData .4byte 0 // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0x42100040 // Characteristics (section flags) .ascii ".text" .byte 0 .byte 0 .byte 0 // end of 0 padding of section name .4byte _edata - _start // VirtualSize .4byte _start - ImageBase // VirtualAddress .4byte _edata - _start // SizeOfRawData .4byte _start - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations (0 for executables) .4byte 0 // PointerToLineNumbers (0 for executables) .2byte 0 // NumberOfRelocations (0 for executables) .2byte 0 // NumberOfLineNumbers (0 for executables) .4byte 0xe0500020 // Characteristics (section flags) .set push .set noreorder .align 4 .globl _start .ent _start .type _start, @function _start: daddiu $sp, -32 sd $ra, ($sp) // Get pc & gp .align 3 bal 1f sd $gp, 8($sp) _pc: .dword _gp .dword _DYNAMIC .dword _relocate 1: // pc in ra ld $gp, ($ra) dli $t0, _pc dsubu $gp, $t0 daddu $gp, $ra sd $a0, 16($sp) sd $a1, 24($sp) // a2: ImageHandle move $a2, $a0 // a3: SystemTable move $a3, $a1 // a0: ImageBase dli $t1, ImageBase - _pc daddu $a0, $ra, $t1 // a1: DynamicSection ld $t1, 8($ra) dsubu $t1, $t0 daddu $a1, $ra, $t1 // call _relocate ld $t1, 16($ra) dsubu $t1, $t0 daddu $t9, $ra, $t1 jalr $t9 nop bnez $v0, 1b nop // a0: ImageHandle ld $a0, 16($sp) // call _start dla $t9, _entry jalr $t9 // a1: SystemTable ld $a1, 24($sp) 1: ld $gp, 8($sp) ld $ra, ($sp) jr $ra daddiu $sp, 32 .end _start .set pop #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/crt0-efi-riscv64-local.S000066400000000000000000000137531471215650600225100ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause */ /* * crt0-efi-riscv64-local.S - PE/COFF header for RISC-V 64 EFI applications (without suitable objcopy) * * Copyright (C) 2014 Linaro Ltd. * Copyright (C) 2018 Alexander Graf * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ .section .text.head /* * Magic "MZ" signature for PE/COFF */ .globl ImageBase ImageBase: .ascii "MZ" .skip 58 // 'MZ' + pad + offset == 64 .4byte pe_header - ImageBase // Offset to the PE header. pe_header: .ascii "PE" .2byte 0 coff_header: .2byte 0x5064 // riscv64 .2byte 4 // nr_sections .4byte 0 // TimeDateStamp .4byte 0 // PointerToSymbolTable .4byte 0 // NumberOfSymbols .2byte section_table - optional_header // SizeOfOptionalHeader .2byte 0x206 // Characteristics. // IMAGE_FILE_DEBUG_STRIPPED | // IMAGE_FILE_EXECUTABLE_IMAGE | // IMAGE_FILE_LINE_NUMS_STRIPPED optional_header: .2byte 0x20b // PE32+ format .byte 0x02 // MajorLinkerVersion .byte 0x14 // MinorLinkerVersion .4byte _text_size - ImageBase // SizeOfCode .4byte _alldata_size - ImageBase // SizeOfInitializedData .4byte 0 // SizeOfUninitializedData .4byte _start - ImageBase // AddressOfEntryPoint .4byte _text - ImageBase // BaseOfCode extra_header_fields: .8byte 0 // ImageBase .4byte 0x1000 // SectionAlignment .4byte 0x1000 // FileAlignment .2byte 0 // MajorOperatingSystemVersion .2byte 0 // MinorOperatingSystemVersion .2byte 0 // MajorImageVersion .2byte 0 // MinorImageVersion .2byte 0 // MajorSubsystemVersion .2byte 0 // MinorSubsystemVersion .4byte 0 // Win32VersionValue .4byte _image_end - ImageBase // SizeOfImage // Everything before the kernel image is considered part of the header .4byte _text - ImageBase // SizeOfHeaders .4byte 0 // CheckSum .2byte 0 // Subsystem .2byte 0 // DllCharacteristics .8byte 0 // SizeOfStackReserve .8byte 0 // SizeOfStackCommit .8byte 0 // SizeOfHeapReserve .8byte 0 // SizeOfHeapCommit .4byte 0 // LoaderFlags .4byte 0x10 // NumberOfRvaAndSizes .8byte 0 // ExportTable .8byte 0 // ImportTable .8byte 0 // ResourceTable .8byte 0 // ExceptionTable .8byte 0 // CertificationTable .4byte _reloc - ImageBase // BaseRelocationTable (VirtualAddress) .4byte _reloc_vsize - ImageBase // BaseRelocationTable (Size) .8byte 0 // Debug .8byte 0 // Architecture .8byte 0 // Global Ptr .8byte 0 // TLS Table .8byte 0 // Load Config Table .8byte 0 // Bound Import .8byte 0 // IAT .8byte 0 // Delay Import Descriptor .8byte 0 // CLR Runtime Header .8byte 0 // Reserved, must be zero // Section table section_table: .ascii ".text\0\0\0" .4byte _text_vsize - ImageBase // VirtualSize .4byte _text - ImageBase // VirtualAddress .4byte _text_size - ImageBase // SizeOfRawData .4byte _text - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations (0 for executables) .4byte 0 // PointerToLineNumbers (0 for executables) .2byte 0 // NumberOfRelocations (0 for executables) .2byte 0 // NumberOfLineNumbers (0 for executables) .4byte 0x60000020 // Characteristics (section flags) .ascii ".data\0\0\0" .4byte _data_vsize - ImageBase // VirtualSize .4byte _data - ImageBase // VirtualAddress .4byte _data_size - ImageBase // SizeOfRawData .4byte _data - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0xC0000040 // Characteristics (section flags) /* * The EFI application loader requires a relocation section * because EFI applications must be relocatable. This is a * dummy section as far as we are concerned. */ .ascii ".reloc\0\0" .4byte _reloc_vsize - ImageBase // VirtualSize .4byte _reloc - ImageBase // VirtualAddress .4byte _reloc_size - ImageBase // SizeOfRawData .4byte _reloc - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0x42000040 // Characteristics (section flags) .ascii ".rodata\0" .4byte _rodata_vsize - ImageBase // VirtualSize .4byte _rodata - ImageBase // VirtualAddress .4byte _rodata_size - ImageBase // SizeOfRawData .4byte _rodata - ImageBase // PointerToRawData .4byte 0 // PointerToRelocations .4byte 0 // PointerToLineNumbers .2byte 0 // NumberOfRelocations .2byte 0 // NumberOfLineNumbers .4byte 0x40000040 // Characteristics (section flags) .text .globl _start .type _start,%function _start: addi sp, sp, -24 sd a0, 0(sp) sd a1, 8(sp) sd ra, 16(sp) lla a0, ImageBase lla a1, _DYNAMIC call _relocate bne a0, zero, .L_exit ld a1, 8(sp) ld a0, 0(sp) call _entry ld ra, 16(sp) .L_exit: addi sp, sp, 24 ret // hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: .data dummy0: .4byte 0 dummy1: .4byte 0 #define IMAGE_REL_ABSOLUTE 0 .section .reloc, "a", %progbits .4byte dummy1 - dummy0 // Page RVA .4byte 12 // Block Size (2*4+2*2), must be aligned by 32 Bits .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/crt0-efi-riscv64.S000066400000000000000000000031601471215650600214070ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause */ /* * Copyright (C) 2014 Linaro Ltd. * Copyright (C) 2018 Alexander Graf * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ .text .globl _start .type _start,%function _start: addi sp, sp, -24 sd a0, 0(sp) sd a1, 8(sp) sd ra, 16(sp) lla a0, ImageBase lla a1, _DYNAMIC call _relocate bne a0, zero, .L_exit ld a1, 8(sp) ld a0, 0(sp) call _entry ld ra, 16(sp) .L_exit: addi sp, sp, 24 ret // hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: .data dummy0: .4byte 0 dummy1: .4byte 0 #define IMAGE_REL_ABSOLUTE 0 .section .reloc, "a", %progbits .4byte dummy1 - dummy0 // Page RVA .4byte 12 // Block Size (2*4+2*2), must be aligned by 32 Bits .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/crt0-efi-x86_64.S000066400000000000000000000050321471215650600210450ustar00rootroot00000000000000/* crt0-efi-x86_64.S - x86_64 EFI startup code. Copyright (C) 1999 Hewlett-Packard Co. Contributed by David Mosberger . Copyright (C) 2005 Intel Co. Contributed by Fenghua Yu . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, 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. */ .text .align 4 .globl _start .type _start,%function _start: subq $8, %rsp pushq %rcx pushq %rdx 0: lea ImageBase(%rip), %rdi lea _DYNAMIC(%rip), %rsi popq %rcx popq %rdx pushq %rcx pushq %rdx call _relocate popq %rdi popq %rsi call _entry addq $8, %rsp .L_exit: ret // hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: .data dummy0: .4byte 0 dummy1: .4byte 0 #define IMAGE_REL_ABSOLUTE 0 .section .reloc, "a", %progbits .4byte dummy1 - dummy0 // Page RVA .4byte 12 // Block Size (2*4+2*2), must be aligned by 32 Bits .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/elf_aarch64_efi.lds000066400000000000000000000046101471215650600217620ustar00rootroot00000000000000OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64") OUTPUT_ARCH(aarch64) ENTRY(_start) SECTIONS { . = 0; ImageBase = .; /* .hash and/or .gnu.hash MUST come first! */ .hash : { *(.hash) } .gnu.hash : { *(.gnu.hash) } . = ALIGN(4096); .eh_frame : { *(.eh_frame) } .eh_frame_hdr : { *(.eh_frame_hdr) } .gcc_except_table : { *(.gcc_except_table*) } . = ALIGN(4096); .text : { _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); } _etext = .; _text_size = _etext - _text; . = ALIGN(65536); .data : { _data = .; *(.sdata) *(.data) *(.data1) *(.data.*) *(.got.plt) *(.got) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ . = ALIGN(16); _bss = .; *(.sbss) *(.scommon) *(.dynbss) *(.bss*) *(COMMON) *(.rel.local) . = ALIGN(16); _bss_end = .; } . = ALIGN(4096); .reloc : { KEEP (*(.reloc)) } . = ALIGN(4096); _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .rela : { *(.rela.text*) *(.rela.data*) *(.rela.got) *(.rela.dyn) *(.rela.stab) *(.rela.init_array*) *(.rela.fini_array*) *(.rela.ctors*) *(.rela.dtors*) } . = ALIGN(4096); .rela.plt : { *(.rela.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) } . = ALIGN(512); _edata = .; _data_size = _edata - _data; . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); .note.gnu.build-id : { *(.note.gnu.build-id) } .ignored.reloc : { *(.rela.reloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } } ncroxon-gnu-efi-157d47c/gnuefi/elf_aarch64_efi_local.lds000066400000000000000000000055421471215650600231410ustar00rootroot00000000000000OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64") OUTPUT_ARCH(aarch64) ENTRY(_start) SECTIONS { .text 0 : { *(.text.head) . = ALIGN(4096); _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); _evtext = .; . = ALIGN(4096); _etext = .; } =0 _text_vsize = _evtext - _text; _text_size = _etext - _text; . = ALIGN(65536); _data = .; _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : { *(.sdata) *(.data) *(.data1) *(.data.*) *(.got.plt) *(.got) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ . = ALIGN(16); _bss = .; *(.sbss) *(.scommon) *(.dynbss) *(.bss) *(.bss.*) *(COMMON) . = ALIGN(16); _bss_end = .; _evdata = .; . = ALIGN(4096); _edata = .; } =0 _data_vsize = _evdata - _data; _data_size = _edata - _data; . = ALIGN(4096); _reloc = .; .reloc : { *(.reloc) _evreloc = .; . = ALIGN(4096); _ereloc = .; } =0 _reloc_vsize = _evreloc - _reloc; _reloc_size = _ereloc - _reloc; . = ALIGN(4096); _rodata = .; .rela : { *(.rela.text*) *(.rela.data*) *(.rela.got) *(.rela.dyn) *(.rela.stab) *(.rela.init_array*) *(.rela.fini_array*) *(.rela.ctors*) *(.rela.dtors*) } . = ALIGN(4096); .rela.plt : { *(.rela.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) _evrodata = .; . = ALIGN(4096); _erodata = .; } =0 _rodata_vsize = _evrodata - _rodata; _rodata_size = _erodata - _rodata; _image_end = .; _alldata_size = _image_end - _data; . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); .note.gnu.build-id : { *(.note.gnu.build-id) } . = ALIGN(4096); .hash : { *(.hash) } . = ALIGN(4096); .gnu.hash : { *(.gnu.hash) } . = ALIGN(4096); .eh_frame : { *(.eh_frame) } .eh_frame_hdr : { *(.eh_frame_hdr) } . = ALIGN(4096); .gcc_except_table : { *(.gcc_except_table*) } /DISCARD/ : { *(.rela.reloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } }ncroxon-gnu-efi-157d47c/gnuefi/elf_arm_efi.lds000066400000000000000000000053741471215650600213210ustar00rootroot00000000000000OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { .text 0 : { *(.text.head) . = 0x1000; _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); _evtext = .; . = ALIGN(4096); _etext = .; } =0 _text_vsize = _evtext - _text; _text_size = _etext - _text; . = ALIGN(4096); _data = .; _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : { *(.sdata) *(.data) *(.data1) *(.data.*) *(.got.plt) *(.got) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ . = ALIGN(16); _bss = .; *(.sbss) *(.scommon) *(.dynbss) *(.bss) *(.bss.*) *(COMMON) . = ALIGN(16); _bss_end = .; _evdata = .; . = ALIGN(4096); _edata = .; } =0 _data_vsize = _evdata - _data; _data_size = _edata - _data; . = ALIGN(4096); _reloc = .; .areloc : { *(.areloc) _evreloc = .; . = ALIGN(4096); _ereloc = .; } =0 _reloc_vsize = _evreloc - _reloc; _reloc_size = _ereloc - _reloc; . = ALIGN(4096); _rodata = .; .rel : { *(.rel.text*) *(.rel.data*) *(.rel.got) *(.rel.dyn) *(.rel.stab) *(.rel.init_array*) *(.rel.fini_array*) *(.rel.ctors*) *(.rel.dtors*) } . = ALIGN(4096); .rel.plt : { *(.rel.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) _evrodata = .; . = ALIGN(4096); _erodata = .; } =0 _rodata_vsize = _evrodata - _rodata; _rodata_size = _erodata - _rodata; _image_end = .; _alldata_size = _image_end - _data; . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); .note.gnu.build-id : { *(.note.gnu.build-id) } . = ALIGN(4096); .hash : { *(.hash) } . = ALIGN(4096); .gnu.hash : { *(.gnu.hash) } . = ALIGN(4096); .ARM.exidx : { *(.ARM.exidx*) } .ARM.extab : { *(.ARM.extab*) } /DISCARD/ : { *(.rel.areloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } } ncroxon-gnu-efi-157d47c/gnuefi/elf_ia32_efi.lds000066400000000000000000000046121471215650600212720ustar00rootroot00000000000000OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) ENTRY(_start) SECTIONS { . = 0; ImageBase = .; /* .hash and/or .gnu.hash MUST come first! */ .hash : { *(.hash) } .gnu.hash : { *(.gnu.hash) } .eh_frame : { *(.eh_frame) } .eh_frame_hdr : { *(.eh_frame_hdr) } .gcc_except_table : { *(.gcc_except_table*) } . = ALIGN(4096); .text : { _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); } _etext = .; _text_size = _etext - _text; . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); .data : { _data = .; *(.got.plt) *(.got) *(.data) *(.data1) *(.data.*) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ *(.dynbss) *(.bss*) *(COMMON) } .note.gnu.build-id : { *(.note.gnu.build-id) } . = ALIGN(4096); _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .rel : { *(.rel.text*) *(.rel.data*) *(.rel.got) *(.rel.dyn) *(.rel.stab) *(.rel.init_array*) *(.rel.fini_array*) *(.rel.ctors*) *(.rel.dtors*) *(.data.rel.ro.local) *(.data.rel.local) *(.data.rel.ro) *(.data.rel*) } . = ALIGN(4096); .rel.plt : { *(.rel.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) } _edata = .; _data_size = _edata - _etext; . = ALIGN(4096); .reloc : /* This is the PECOFF .reloc section! */ { KEEP (*(.reloc)) } . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); . = DATA_SEGMENT_END (.); /DISCARD/ : { *(.rel.reloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } } ncroxon-gnu-efi-157d47c/gnuefi/elf_ia32_efi_local.lds000066400000000000000000000054721471215650600224510ustar00rootroot00000000000000OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) ENTRY(_start) SECTIONS { .text 0 : { *(.text.head) . = ALIGN(4096); _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); _evtext = .; . = ALIGN(4096); _etext = .; } =0 _text_vsize = _evtext - _text; _text_size = _etext - _text; . = ALIGN(4096); _data = .; _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : { *(.sdata) *(.data) *(.data1) *(.data.*) *(.got.plt) *(.got) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ . = ALIGN(16); _bss = .; *(.sbss) *(.scommon) *(.dynbss) *(.bss) *(.bss.*) *(COMMON) . = ALIGN(16); _bss_end = .; _evdata = .; . = ALIGN(4096); _edata = .; } =0 _data_vsize = _evdata - _data; _data_size = _edata - _data; . = ALIGN(4096); _reloc = .; .areloc : { *(.areloc) _evreloc = .; . = ALIGN(4096); _ereloc = .; } =0 _reloc_vsize = _evreloc - _reloc; _reloc_size = _ereloc - _reloc; . = ALIGN(4096); _rodata = .; .rel : { *(.rel.text*) *(.rel.data*) *(.rel.got) *(.rel.dyn) *(.rel.stab) *(.rel.init_array*) *(.rel.fini_array*) *(.rel.ctors*) *(.rel.dtors*) } . = ALIGN(4096); .rel.plt : { *(.rel.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) _evrodata = .; . = ALIGN(4096); _erodata = .; } =0 _rodata_vsize = _evrodata - _rodata; _rodata_size = _erodata - _rodata; _image_end = .; _alldata_size = _image_end - _data; . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); .note.gnu.build-id : { *(.note.gnu.build-id) } . = ALIGN(4096); .hash : { *(.hash) } . = ALIGN(4096); .gnu.hash : { *(.gnu.hash) } . = ALIGN(4096); .eh_frame : { *(.eh_frame) } .eh_frame_hdr : { *(.eh_frame_hdr) } . = ALIGN(4096); .gcc_except_table : { *(.gcc_except_table*) } /DISCARD/ : { *(.rela.reloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } }ncroxon-gnu-efi-157d47c/gnuefi/elf_ia32_fbsd_efi.lds000066400000000000000000000046421471215650600222730ustar00rootroot00000000000000OUTPUT_FORMAT("elf32-i386-freebsd", "elf32-i386-freebsd", "elf32-i386-freebsd") OUTPUT_ARCH(i386) ENTRY(_start) SECTIONS { . = 0; ImageBase = .; /* .hash and/or .gnu.hash MUST come first! */ .hash : { *(.hash) } .gnu.hash : { *(.gnu.hash) } .eh_frame : { *(.eh_frame) } .eh_frame_hdr : { *(.eh_frame_hdr) } .gcc_except_table : { *(.gcc_except_table*) } . = ALIGN(4096); .text : { _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); } _etext = .; _text_size = _etext - _text; . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); .data : { _data = .; *(.got.plt) *(.got) *(.data) *(.data1) *(.data.*) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ *(.dynbss) *(.bss*) *(COMMON) } .note.gnu.build-id : { *(.note.gnu.build-id) } . = ALIGN(4096); _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .rel : { *(.rel.text*) *(.rel.data*) *(.rel.got) *(.rel.dyn) *(.rel.stab) *(.rel.init_array*) *(.rel.fini_array*) *(.rel.ctors*) *(.rel.dtors*) *(.data.rel.ro.local) *(.data.rel.local) *(.data.rel.ro) *(.data.rel*) } . = ALIGN(4096); .rel.plt : { *(.rel.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) } _edata = .; _data_size = _edata - _etext; . = ALIGN(4096); .reloc : /* This is the PECOFF .reloc section! */ { KEEP (*(.reloc)) } . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); . = DATA_SEGMENT_END (.); /DISCARD/ : { *(.rel.reloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } } ncroxon-gnu-efi-157d47c/gnuefi/elf_ia64_efi.lds000066400000000000000000000047671471215650600213120ustar00rootroot00000000000000OUTPUT_FORMAT("elf64-ia64-little") OUTPUT_ARCH(ia64) ENTRY(_start_plabel) SECTIONS { . = 0; ImageBase = .; /* .hash and/or .gnu.hash MUST come first! */ .hash : { *(.hash) } .gnu.hash : { *(.gnu.hash) } .eh_frame : { *(.eh_frame) } .eh_frame_hdr : { *(.eh_frame_hdr) } .gcc_except_table : { *(.gcc_except_table*) } . = ALIGN(4096); .text : { _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); } _etext = .; _text_size = _etext - _text; . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); __gp = ALIGN (8) + 0x200000; .sdata : { _data = .; *(.got.plt) *(.got) *(.srodata) *(.sdata) *(.sbss) *(.scommon) } . = ALIGN(4096); .data : { *(.rodata*) *(.ctors) *(.data*) *(.gnu.linkonce.d*) *(.plabel) /* data whose relocs we want to ignore */ /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ *(.dynbss) *(.bss*) *(COMMON) } .note.gnu.build-id : { *(.note.gnu.build-id) } . = ALIGN(4096); _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .rela : { *(.rela.text*) *(.rela.sdata*) *(.rela.data*) *(.rela.got) *(.rela.dyn) *(.rela.gnu.linkonce.d*) *(.rela.stab) *(.rela.init_array*) *(.rela.fini_array*) *(.rela.ctors*) *(.rela.dtors*) } . = ALIGN(4096); .rela.plt : { *(.rela.plt) } _edata = .; _data_size = _edata - _etext; . = ALIGN(4096); .reloc : /* This is the PECOFF .reloc section! */ { KEEP (*(.reloc)) } . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = DATA_SEGMENT_END (.); /DISCARD/ : { *(.rela.plabel) *(.rela.reloc) *(.IA_64.unwind*) *(.IA64.unwind*) } } ncroxon-gnu-efi-157d47c/gnuefi/elf_loongarch64_efi.lds000066400000000000000000000045771471215650600226740ustar00rootroot00000000000000OUTPUT_FORMAT("elf64-loongarch", "elf64-loongarch", "elf64-loongarch") OUTPUT_ARCH(loongarch) ENTRY(_start) SECTIONS { . = 0; ImageBase = .; /* .hash and/or .gnu.hash MUST come first! */ .hash : { *(.hash) } .gnu.hash : { *(.gnu.hash) } . = ALIGN(4096); .eh_frame : { *(.eh_frame) } .eh_frame_hdr : { *(.eh_frame_hdr) } .gcc_except_table : { *(.gcc_except_table*) } . = ALIGN(4096); .text : { _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); } _etext = .; _text_size = _etext - _text; . = ALIGN(65536); _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : { _data = .; *(.sdata) *(.data) *(.data1) *(.data.*) *(.got.plt) *(.got) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ . = ALIGN(16); _bss = .; *(.sbss) *(.scommon) *(.dynbss) *(.bss*) *(COMMON) *(.rel.local) . = ALIGN(16); _bss_end = .; } . = ALIGN(4096); .reloc : { KEEP (*(.reloc)) } . = ALIGN(4096); .rela : { *(.rela.text*) *(.rela.data*) *(.rela.got) *(.rela.dyn) *(.rela.stab) *(.rela.init_array*) *(.rela.fini_array*) *(.rela.ctors*) *(.rela.dtors*) } . = ALIGN(4096); .rela.plt : { *(.rela.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) } . = ALIGN(512); _edata = .; _data_size = _edata - _data; . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); .note.gnu.build-id : { *(.note.gnu.build-id) } .ignored.reloc : { *(.rela.reloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } } ncroxon-gnu-efi-157d47c/gnuefi/elf_mips64el_efi.lds000066400000000000000000000042631471215650600222010ustar00rootroot00000000000000OUTPUT_FORMAT("elf64-tradlittlemips", "elf64-tradbigmips", "elf64-tradlittlemips") OUTPUT_ARCH(mips) ENTRY(_start) SECTIONS { .text 0x0 : { _text = .; *(.text.head) *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); } _etext = .; _text_size = _etext - _text; . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : { _data = .; *(.sdata) *(.data) *(.data1) *(.data.*) *(.got.plt) HIDDEN (_gp = ALIGN (16) + 0x7ff0); *(.got) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ . = ALIGN(16); _bss = .; *(.sbss) *(.scommon) *(.dynbss) *(.bss*) *(COMMON) . = ALIGN(16); _bss_end = .; } . = ALIGN(4096); .rel : { *(.rel.text*) *(.rel.data*) *(.rel.got) *(.rel.dyn) *(.rel.stab) *(.rel.init_array*) *(.rel.fini_array*) *(.rel.ctors*) *(.rel.dtors*) } . = ALIGN(4096); .rel.plt : { *(.rel.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) } _edata = .; _data_size = _edata - _etext; . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); .note.gnu.build-id : { *(.note.gnu.build-id) } . = DATA_SEGMENT_END (.); /DISCARD/ : { *(.rel.reloc) *(.eh_frame) *(.MIPS.abiflags) *(.note.GNU-stack) } .comment 0 : { *(.comment) } } ncroxon-gnu-efi-157d47c/gnuefi/elf_riscv64_efi.lds000066400000000000000000000047021471215650600220340ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause */ OUTPUT_FORMAT("elf64-littleriscv", "elf64-littleriscv", "elf64-littleriscv") OUTPUT_ARCH(riscv) ENTRY(_start) SECTIONS { . = 0; ImageBase = .; /* .hash and/or .gnu.hash MUST come first! */ .hash : { *(.hash) } .gnu.hash : { *(.gnu.hash) } . = ALIGN(4096); .eh_frame : { *(.eh_frame) } .eh_frame_hdr : { *(.eh_frame_hdr) } .gcc_except_table : { *(.gcc_except_table*) } . = ALIGN(4096); .text : { _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); } _etext = .; _text_size = _etext - _text; . = ALIGN(65536); _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : { _data = .; *(.sdata) *(.data) *(.data1) *(.data.*) *(.got.plt) *(.got) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ . = ALIGN(16); _bss = .; *(.sbss) *(.scommon) *(.dynbss) *(.bss*) *(COMMON) *(.rel.local) . = ALIGN(16); _bss_end = .; } . = ALIGN(4096); .reloc : { KEEP (*(.reloc)) } . = ALIGN(4096); .rela : { *(.rela.text*) *(.rela.data*) *(.rela.got) *(.rela.dyn) *(.rela.stab) *(.rela.init_array*) *(.rela.fini_array*) *(.rela.ctors*) *(.rela.dtors*) } . = ALIGN(4096); .rela.plt : { *(.rela.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) } . = ALIGN(512); _edata = .; _data_size = _edata - _data; . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); .note.gnu.build-id : { *(.note.gnu.build-id) } .ignored.reloc : { *(.rela.reloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } } ncroxon-gnu-efi-157d47c/gnuefi/elf_riscv64_efi_local.lds000066400000000000000000000056221471215650600232100ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause */ OUTPUT_FORMAT("elf64-littleriscv", "elf64-littleriscv", "elf64-littleriscv") OUTPUT_ARCH(riscv) ENTRY(_start) SECTIONS { .text 0 : { *(.text.head) . = ALIGN(4096); _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); _evtext = .; . = ALIGN(4096); _etext = .; } =0 _text_vsize = _evtext - _text; _text_size = _etext - _text; . = ALIGN(4096); _data = .; _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : { *(.sdata) *(.data) *(.data1) *(.data.*) *(.got.plt) *(.got) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ . = ALIGN(16); _bss = .; *(.sbss) *(.scommon) *(.dynbss) *(.bss) *(.bss.*) *(COMMON) . = ALIGN(16); _bss_end = .; _evdata = .; . = ALIGN(4096); _edata = .; } =0 _data_vsize = _evdata - _data; _data_size = _edata - _data; . = ALIGN(4096); _reloc = .; .reloc : { *(.reloc) _evreloc = .; . = ALIGN(4096); _ereloc = .; } =0 _reloc_vsize = _evreloc - _reloc; _reloc_size = _ereloc - _reloc; . = ALIGN(4096); _rodata = .; .rela : { *(.rela.text*) *(.rela.data*) *(.rela.got) *(.rela.dyn) *(.rela.stab) *(.rela.init_array*) *(.rela.fini_array*) *(.rela.ctors*) *(.rela.dtors*) } . = ALIGN(4096); .rela.plt : { *(.rela.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) _evrodata = .; . = ALIGN(4096); _erodata = .; } =0 _rodata_vsize = _evrodata - _rodata; _rodata_size = _erodata - _rodata; _image_end = .; _alldata_size = _image_end - _data; . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); .note.gnu.build-id : { *(.note.gnu.build-id) } . = ALIGN(4096); .hash : { *(.hash) } . = ALIGN(4096); .gnu.hash : { *(.gnu.hash) } . = ALIGN(4096); .eh_frame : { *(.eh_frame) } .eh_frame_hdr : { *(.eh_frame_hdr) } . = ALIGN(4096); .gcc_except_table : { *(.gcc_except_table*) } /DISCARD/ : { *(.rela.reloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } } ncroxon-gnu-efi-157d47c/gnuefi/elf_x86_64_efi.lds000066400000000000000000000045301471215650600214710ustar00rootroot00000000000000/* Same as elf_x86_64_fbsd_efi.lds, except for OUTPUT_FORMAT below - KEEP IN SYNC */ OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") OUTPUT_ARCH(i386:x86-64) ENTRY(_start) SECTIONS { . = 0; ImageBase = .; /* .hash and/or .gnu.hash MUST come first! */ .hash : { *(.hash) } .gnu.hash : { *(.gnu.hash) } . = ALIGN(4096); .eh_frame : { *(.eh_frame) } .eh_frame_hdr : { *(.eh_frame_hdr) } .gcc_except_table : { *(.gcc_except_table*) } . = ALIGN(4096); .text : { _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); } _etext = .; _text_size = _etext - _text; . = ALIGN(4096); .data : { _data = .; *(.got.plt) *(.got) *(.data*) *(.sdata) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ *(.sbss) *(.scommon) *(.dynbss) *(.bss*) *(COMMON) *(.rel.local) } .note.gnu.build-id : { *(.note.gnu.build-id) } _edata = .; _data_size = _edata - _etext; . = ALIGN(4096); .reloc : { KEEP (*(.reloc)) } . = ALIGN(4096); _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .rela : { *(.rela.text*) *(.rela.data*) *(.rela.got) *(.rela.dyn) *(.rela.stab) *(.rela.init_array*) *(.rela.fini_array*) *(.rela.ctors*) *(.rela.dtors*) } . = ALIGN(4096); .rela.plt : { *(.rela.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) } . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); .ignored.reloc : { *(.rela.reloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } } ncroxon-gnu-efi-157d47c/gnuefi/elf_x86_64_fbsd_efi.lds000066400000000000000000000044331471215650600224710ustar00rootroot00000000000000OUTPUT_FORMAT("elf64-x86-64-freebsd", "elf64-x86-64-freebsd", "elf64-x86-64-freebsd") OUTPUT_ARCH(i386:x86-64) ENTRY(_start) SECTIONS { . = 0; ImageBase = .; /* .hash and/or .gnu.hash MUST come first! */ .hash : { *(.hash) } .gnu.hash : { *(.gnu.hash) } . = ALIGN(4096); .eh_frame : { *(.eh_frame) } .eh_frame_hdr : { *(.eh_frame_hdr) } .gcc_except_table : { *(.gcc_except_table*) } . = ALIGN(4096); .text : { _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); } _etext = .; _text_size = _etext - _text; . = ALIGN(4096); .data : { _data = .; *(.got.plt) *(.got) *(.data*) *(.sdata) /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ . = ALIGN(16); __init_array_start = .; *(SORT(.init_array.*)) *(.init_array) __init_array_end = .; . = ALIGN(16); __CTOR_LIST__ = .; *(SORT(.ctors.*)) *(.ctors) __CTOR_END__ = .; . = ALIGN(16); __DTOR_LIST__ = .; *(SORT(.dtors.*)) *(.dtors) __DTOR_END__ = .; . = ALIGN(16); __fini_array_start = .; *(SORT(.fini_array.*)) *(.fini_array) __fini_array_end = .; /* the EFI loader doesn't seem to like a .bss section, so we stick it all into .data: */ *(.sbss) *(.scommon) *(.dynbss) *(.bss*) *(COMMON) *(.rel.local) } .note.gnu.build-id : { *(.note.gnu.build-id) } _edata = .; _data_size = _edata - _etext; . = ALIGN(4096); .reloc : { KEEP (*(.reloc)) } . = ALIGN(4096); _DYNAMIC = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .rela : { *(.rela.text*) *(.rela.data*) *(.rela.got) *(.rela.dyn) *(.rela.stab) *(.rela.init_array*) *(.rela.fini_array*) *(.rela.ctors*) *(.rela.dtors*) } . = ALIGN(4096); .rela.plt : { *(.rela.plt) } . = ALIGN(4096); .rodata : { *(.rodata*) } . = ALIGN(4096); .dynsym : { *(.dynsym) } . = ALIGN(4096); .dynstr : { *(.dynstr) } . = ALIGN(4096); .ignored.reloc : { *(.rela.reloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } } ncroxon-gnu-efi-157d47c/gnuefi/gnu-efi.pc.in000066400000000000000000000005031471215650600206350ustar00rootroot00000000000000prefix=@PREFIX@ exec_prefix=@EXEC_PREFIX@ includedir=@INCLUDEDIR@ libdir=@LIBDIR@ efi_machine_type_name=@efi_machine_type_name@ gnu_efi_arch=@gnu_efi_arch@ gnu_efi_default_is_objcopy=@gnu_efi_default_is_objcopy@ Name: gnu-efi Description: EFI development toolkit Version: @VERSION@ Cflags: -I${includedir}/efi Libs: -lefi ncroxon-gnu-efi-157d47c/gnuefi/reloc_aarch64.c000066400000000000000000000055101471215650600211350ustar00rootroot00000000000000/* reloc_aarch64.c - position independent x86 ELF shared object relocator Copyright (C) 2014 Linaro Ltd. Copyright (C) 1999 Hewlett-Packard Co. Contributed by David Mosberger . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, 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. */ #include #include #include "subst/elf.h" EFI_STATUS _relocate (long ldbase, Elf64_Dyn *dyn, EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED) { long relsz = 0, relent = 0; Elf64_Rela *rel = 0; unsigned long *addr; int i; for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { switch (dyn[i].d_tag) { case DT_RELA: rel = (Elf64_Rela*) ((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; case DT_RELASZ: relsz = dyn[i].d_un.d_val; break; case DT_RELAENT: relent = dyn[i].d_un.d_val; break; default: break; } } if (!rel && relent == 0) return EFI_SUCCESS; if (!rel || relent == 0) return EFI_LOAD_ERROR; while (relsz > 0) { /* apply the relocs */ switch (ELF64_R_TYPE (rel->r_info)) { case R_AARCH64_NONE: break; case R_AARCH64_RELATIVE: addr = (unsigned long *) (ldbase + rel->r_offset); *addr = ldbase + rel->r_addend; break; default: break; } rel = (Elf64_Rela*) ((char *) rel + relent); relsz -= relent; } return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/gnuefi/reloc_arm.c000066400000000000000000000054471471215650600204750ustar00rootroot00000000000000/* reloc_arm.c - position independent x86 ELF shared object relocator Copyright (C) 2014 Linaro Ltd. Copyright (C) 1999 Hewlett-Packard Co. Contributed by David Mosberger . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, 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. */ #include #include #include "subst/elf.h" EFI_STATUS _relocate (long ldbase, Elf32_Dyn *dyn, EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED) { long relsz = 0, relent = 0; Elf32_Rel *rel = 0; unsigned long *addr; int i; for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { switch (dyn[i].d_tag) { case DT_REL: rel = (Elf32_Rel*) ((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; case DT_RELSZ: relsz = dyn[i].d_un.d_val; break; case DT_RELENT: relent = dyn[i].d_un.d_val; break; default: break; } } if (!rel && relent == 0) return EFI_SUCCESS; if (!rel || relent == 0) return EFI_LOAD_ERROR; while (relsz > 0) { /* apply the relocs */ switch (ELF32_R_TYPE (rel->r_info)) { case R_ARM_NONE: break; case R_ARM_RELATIVE: addr = (unsigned long *) (ldbase + rel->r_offset); *addr += ldbase; break; default: break; } rel = (Elf32_Rel*) ((char *) rel + relent); relsz -= relent; } return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/gnuefi/reloc_ia32.c000066400000000000000000000054341471215650600204500ustar00rootroot00000000000000/* reloc_ia32.c - position independent x86 ELF shared object relocator Copyright (C) 1999 Hewlett-Packard Co. Contributed by David Mosberger . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, 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. */ #include #include #include "subst/elf.h" EFI_STATUS _relocate (long ldbase, Elf32_Dyn *dyn, EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED) { long relsz = 0, relent = 0; Elf32_Rel *rel = 0; unsigned long *addr; int i; for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { switch (dyn[i].d_tag) { case DT_REL: rel = (Elf32_Rel*) ((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; case DT_RELSZ: relsz = dyn[i].d_un.d_val; break; case DT_RELENT: relent = dyn[i].d_un.d_val; break; case DT_RELA: break; default: break; } } if (!rel && relent == 0) return EFI_SUCCESS; if (!rel || relent == 0) return EFI_LOAD_ERROR; while (relsz > 0) { /* apply the relocs */ switch (ELF32_R_TYPE (rel->r_info)) { case R_386_NONE: break; case R_386_RELATIVE: addr = (unsigned long *) (ldbase + rel->r_offset); *addr += ldbase; break; default: break; } rel = (Elf32_Rel*) ((char *) rel + relent); relsz -= relent; } return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/gnuefi/reloc_ia64.S000066400000000000000000000136461471215650600204410ustar00rootroot00000000000000/* reloc_ia64.S - position independent IA-64 ELF shared object relocator Copyright (C) 1999 Hewlett-Packard Co. Contributed by David Mosberger . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, 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. */ /* * This is written in assembly because the entire code needs to be position * independent. Note that the compiler does not generate code that's position * independent by itself because it relies on the global offset table being * relocated. */ .text .psr abi64 .psr lsb .lsb /* * This constant determines how many R_IA64_FPTR64LSB relocations we * can deal with. If you get EFI_BUFFER_TOO_SMALL errors, you may * need to increase this number. */ #define MAX_FUNCTION_DESCRIPTORS 750 #define ST_VALUE_OFF 8 /* offset of st_value in elf sym */ #define EFI_SUCCESS 0 #define EFI_LOAD_ERROR 1 #define EFI_BUFFER_TOO_SMALL 5 #define DT_NULL 0 /* Marks end of dynamic section */ #define DT_RELA 7 /* Address of Rela relocs */ #define DT_RELASZ 8 /* Total size of Rela relocs */ #define DT_RELAENT 9 /* Size of one Rela reloc */ #define DT_SYMTAB 6 /* Address of symbol table */ #define DT_SYMENT 11 /* Size of one symbol table entry */ #define R_IA64_NONE 0 #define R_IA64_REL64MSB 0x6e #define R_IA64_REL64LSB 0x6f #define R_IA64_DIR64MSB 0x26 #define R_IA64_DIR64LSB 0x27 #define R_IA64_FPTR64MSB 0x46 #define R_IA64_FPTR64LSB 0x47 #define ldbase in0 /* load address (address of .text) */ #define dyn in1 /* address of _DYNAMIC */ #define d_tag r16 #define d_val r17 #define rela r18 #define relasz r19 #define relaent r20 #define addr r21 #define r_info r22 #define r_offset r23 #define r_addend r24 #define r_type r25 #define r_sym r25 /* alias of r_type ! */ #define fptr r26 #define fptr_limit r27 #define symtab f8 #define syment f9 #define ftmp f10 #define target r16 #define val r17 #define NLOC 0 #define Pnull p6 #define Prela p7 #define Prelasz p8 #define Prelaent p9 #define Psymtab p10 #define Psyment p11 #define Pnone p6 #define Prel p7 #define Pfptr p8 #define Pmore p6 #define Poom p6 /* out-of-memory */ .global _relocate .proc _relocate _relocate: alloc r2=ar.pfs,2,0,0,0 movl fptr = @gprel(fptr_mem_base) ;; add fptr = fptr, gp movl fptr_limit = @gprel(fptr_mem_limit) ;; add fptr_limit = fptr_limit, gp search_dynamic: ld8 d_tag = [dyn],8 ;; ld8 d_val = [dyn],8 cmp.eq Pnull,p0 = DT_NULL,d_tag (Pnull) br.cond.sptk.few apply_relocs cmp.eq Prela,p0 = DT_RELA,d_tag cmp.eq Prelasz,p0 = DT_RELASZ,d_tag cmp.eq Psymtab,p0 = DT_SYMTAB,d_tag cmp.eq Psyment,p0 = DT_SYMENT,d_tag cmp.eq Prelaent,p0 = DT_RELAENT,d_tag ;; (Prela) add rela = d_val, ldbase (Prelasz) mov relasz = d_val (Prelaent) mov relaent = d_val (Psymtab) add val = d_val, ldbase ;; (Psyment) setf.sig syment = d_val ;; (Psymtab) setf.sig symtab = val br.sptk.few search_dynamic apply_loop: ld8 r_offset = [rela] add addr = 8,rela sub relasz = relasz,relaent ;; ld8 r_info = [addr],8 ;; ld8 r_addend = [addr] add target = ldbase, r_offset add rela = rela,relaent extr.u r_type = r_info, 0, 32 ;; cmp.eq Pnone,p0 = R_IA64_NONE,r_type cmp.eq Prel,p0 = R_IA64_REL64LSB,r_type cmp.eq Pfptr,p0 = R_IA64_FPTR64LSB,r_type (Prel) br.cond.sptk.few apply_REL64 ;; cmp.eq Prel,p0 = R_IA64_DIR64LSB,r_type // treat DIR64 just like REL64 (Pnone) br.cond.sptk.few apply_relocs (Prel) br.cond.sptk.few apply_REL64 (Pfptr) br.cond.sptk.few apply_FPTR64 mov r8 = EFI_LOAD_ERROR br.ret.sptk.few rp apply_relocs: cmp.ltu Pmore,p0=0,relasz (Pmore) br.cond.sptk.few apply_loop mov r8 = EFI_SUCCESS br.ret.sptk.few rp apply_REL64: ld8 val = [target] ;; add val = val,ldbase ;; st8 [target] = val br.cond.sptk.few apply_relocs // FPTR relocs are a bit more interesting: we need to lookup // the symbol's value in symtab, allocate 16 bytes of memory, // store the value in [target] in the first and the gp in the // second dword. apply_FPTR64: st8 [target] = fptr extr.u r_sym = r_info,32,32 add target = 8,fptr ;; setf.sig ftmp = r_sym mov r8=EFI_BUFFER_TOO_SMALL ;; cmp.geu Poom,p0 = fptr,fptr_limit xma.lu ftmp = ftmp,syment,symtab (Poom) br.ret.sptk.few rp ;; getf.sig addr = ftmp st8 [target] = gp ;; add addr = ST_VALUE_OFF, addr ;; ld8 val = [addr] ;; add val = val,ldbase ;; st8 [fptr] = val,16 br.cond.sptk.few apply_relocs .endp _relocate .data .align 16 fptr_mem_base: .space MAX_FUNCTION_DESCRIPTORS*16 fptr_mem_limit: #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/gnuefi/reloc_loongarch64.c000066400000000000000000000060521471215650600220350ustar00rootroot00000000000000/* reloc_loongarch64.c - position independent loongarch64 ELF shared object relocator Copyright (C) 2021 Loongson Technology Corporation Limited. Copyright (C) 2014 Linaro Ltd. Copyright (C) 1999 Hewlett-Packard Co. Contributed by David Mosberger . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, 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. */ #include #include #include "subst/elf.h" EFI_STATUS _relocate (long ldbase, Elf64_Dyn *dyn, EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED) { long relsz = 0, relent = 0; Elf64_Rela *rel = 0; unsigned long *addr; int i; for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { switch (dyn[i].d_tag) { case DT_RELA: rel = (Elf64_Rela*) ((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; case DT_RELASZ: relsz = dyn[i].d_un.d_val; break; case DT_RELAENT: relent = dyn[i].d_un.d_val; break; case DT_PLTGOT: addr = (unsigned long *) ((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; default: break; } } if (!rel && relent == 0) return EFI_SUCCESS; if (!rel || relent == 0) return EFI_LOAD_ERROR; while (relsz > 0) { /* apply the relocs */ switch (ELF64_R_TYPE (rel->r_info)) { case R_LARCH_NONE: break; case R_LARCH_RELATIVE: addr = (unsigned long *) (ldbase + rel->r_offset); *addr += ldbase; break; default: break; } rel = (Elf64_Rela*) ((char *) rel + relent); relsz -= relent; } return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/gnuefi/reloc_mips64el.c000066400000000000000000000063301471215650600213510ustar00rootroot00000000000000/* reloc_mips64el.c - position independent MIPS64 ELF shared object relocator Copyright (C) 2014 Linaro Ltd. Copyright (C) 1999 Hewlett-Packard Co. Contributed by David Mosberger . Copyright (C) 2017 Lemote Co. Contributed by Heiher All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, 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. */ #include #include #include "subst/elf.h" EFI_STATUS _relocate (long ldbase, Elf64_Dyn *dyn, EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED) { long relsz = 0, relent = 0, gotsz = 0; Elf64_Rel *rel = 0; unsigned long *addr = 0; int i; for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { switch (dyn[i].d_tag) { case DT_REL: rel = (Elf64_Rel*) ((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; case DT_RELSZ: relsz = dyn[i].d_un.d_val; break; case DT_RELENT: relent = dyn[i].d_un.d_val; break; case DT_PLTGOT: addr = (unsigned long *) ((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; case DT_MIPS_LOCAL_GOTNO: gotsz = dyn[i].d_un.d_val; break; default: break; } } if ((!rel && relent == 0) && (!addr && gotsz == 0)) return EFI_SUCCESS; if ((!rel && relent != 0) || (!addr && gotsz != 0)) return EFI_LOAD_ERROR; while (gotsz > 0) { *addr += ldbase; addr += 1; gotsz --; } while (relsz > 0) { /* apply the relocs */ switch (ELF64_R_TYPE (swap_uint64 (rel->r_info))) { case R_MIPS_NONE: break; case (R_MIPS_64 << 8) | R_MIPS_REL32: addr = (unsigned long *) (ldbase + rel->r_offset); *addr += ldbase; break; default: break; } rel = (Elf64_Rel*) ((char *) rel + relent); relsz -= relent; } return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/gnuefi/reloc_riscv64.c000066400000000000000000000055301471215650600212070ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause /* reloc_riscv.c - position independent ELF shared object relocator Copyright (C) 2018 Alexander Graf Copyright (C) 2014 Linaro Ltd. Copyright (C) 1999 Hewlett-Packard Co. Contributed by David Mosberger . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, 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. */ #include #include "subst/elf.h" #define Elf_Dyn Elf64_Dyn #define Elf_Rela Elf64_Rela #define ELF_R_TYPE ELF64_R_TYPE EFI_STATUS EFIAPI _relocate(long ldbase, Elf_Dyn *dyn) { long relsz = 0, relent = 0; Elf_Rela *rel = NULL; unsigned long *addr; int i; for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { switch (dyn[i].d_tag) { case DT_RELA: rel = (Elf_Rela *)((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; case DT_RELASZ: relsz = dyn[i].d_un.d_val; break; case DT_RELAENT: relent = dyn[i].d_un.d_val; break; default: break; } } if (!rel && relent == 0) return EFI_SUCCESS; if (!rel || relent == 0) return EFI_LOAD_ERROR; while (relsz > 0) { /* apply the relocs */ switch (ELF_R_TYPE(rel->r_info)) { case R_RISCV_RELATIVE: addr = (unsigned long *)(ldbase + rel->r_offset); *addr = ldbase + rel->r_addend; break; default: break; } rel = (Elf_Rela *)((char *)rel + relent); relsz -= relent; } return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/gnuefi/reloc_x86_64.c000066400000000000000000000055621471215650600206520ustar00rootroot00000000000000/* reloc_x86_64.c - position independent x86_64 ELF shared object relocator Copyright (C) 1999 Hewlett-Packard Co. Contributed by David Mosberger . Copyright (C) 2005 Intel Co. Contributed by Fenghua Yu . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, 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. */ #include #include #include "subst/elf.h" EFI_STATUS _relocate (long ldbase, Elf64_Dyn *dyn, EFI_HANDLE image EFI_UNUSED, EFI_SYSTEM_TABLE *systab EFI_UNUSED) { long relsz = 0, relent = 0; Elf64_Rela *rel = 0; unsigned long *addr; int i; for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { switch (dyn[i].d_tag) { case DT_RELA: rel = (Elf64_Rela*) ((unsigned long)dyn[i].d_un.d_ptr + ldbase); break; case DT_RELASZ: relsz = dyn[i].d_un.d_val; break; case DT_RELAENT: relent = dyn[i].d_un.d_val; break; default: break; } } if (!rel && relent == 0) return EFI_SUCCESS; if (!rel || relent == 0) return EFI_LOAD_ERROR; while (relsz > 0) { /* apply the relocs */ switch (ELF64_R_TYPE (rel->r_info)) { case R_X86_64_NONE: break; case R_X86_64_RELATIVE: addr = (unsigned long *) (ldbase + rel->r_offset); *addr = ldbase + rel->r_addend; break; default: break; } rel = (Elf64_Rela*) ((char *) rel + relent); relsz -= relent; } return EFI_SUCCESS; } ncroxon-gnu-efi-157d47c/inc/000077500000000000000000000000001471215650600156505ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/Makefile000066400000000000000000000012641471215650600173130ustar00rootroot00000000000000SRCDIR = . VPATH = $(SRCDIR) TOPDIR = $(SRCDIR)/.. include $(SRCDIR)/../Make.defaults all: clean: install: mkdir -p $(INSTALLROOT)$(INCLUDEDIR)/efi mkdir -p $(INSTALLROOT)$(INCLUDEDIR)/efi/protocol mkdir -p $(INSTALLROOT)$(INCLUDEDIR)/efi/$(ARCH) $(INSTALL) -m 644 $(SRCDIR)/*.h $(INSTALLROOT)$(INCLUDEDIR)/efi $(INSTALL) -m 644 $(SRCDIR)/protocol/*.h $(INSTALLROOT)$(INCLUDEDIR)/efi/protocol $(INSTALL) -m 644 $(SRCDIR)/$(ARCH)/*.h $(INSTALLROOT)$(INCLUDEDIR)/efi/$(ARCH) ifeq ($(ARCH),ia64) mkdir -p $(INSTALLROOT)$(INCLUDEDIR)/efi/protocol/ia64 $(INSTALL) -m 644 $(SRCDIR)/protocol/ia64/*.h $(INSTALLROOT)$(INCLUDEDIR)/efi/protocol/ia64 endif include $(SRCDIR)/../Make.rules ncroxon-gnu-efi-157d47c/inc/aarch64/000077500000000000000000000000001471215650600171005ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/aarch64/efibind.h000066400000000000000000000122551471215650600206560ustar00rootroot00000000000000/* * Copyright (C) 2014 - 2015 Linaro Ltd. * Author: Ard Biesheuvel * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #if !defined(_MSC_VER) && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L )) && !defined(__cplusplus) // ANSI C 1999/2000 stdint.h integer width declarations typedef unsigned long uint64_t; typedef long int64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef signed char int8_t; // unqualified 'char' is unsigned on ARM typedef uint64_t uintptr_t; typedef int64_t intptr_t; #else #include #endif // // Basic EFI types of various widths // #include typedef uint16_t CHAR16; #define WCHAR CHAR16 typedef uint64_t UINT64; typedef int64_t INT64; typedef uint32_t UINT32; typedef int32_t INT32; typedef uint16_t UINT16; typedef int16_t INT16; typedef uint8_t UINT8; typedef unsigned char CHAR8; typedef int8_t INT8; #undef VOID typedef void VOID; typedef int64_t INTN; typedef uint64_t UINTN; #define EFIERR(a) (0x8000000000000000 | a) #define EFI_ERROR_MASK 0x8000000000000000 #define EFIERR_OEM(a) (0xc000000000000000 | a) #define BAD_POINTER 0xFBFBFBFBFBFBFBFB #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF #define BREAKPOINT() while (TRUE); // Make it hang on Bios[Dbg]32 // // Pointers must be aligned to these address to function // #define MIN_ALIGNMENT_SIZE 8 #define ALIGN_VARIABLE(Value ,Adjustment) \ (UINTN)Adjustment = 0; \ if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ Value = (UINTN)Value + (UINTN)Adjustment // // Define macros to build data structure signatures from characters. // #define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) #define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) // // EFIAPI - prototype calling convention for EFI function pointers // BOOTSERVICE - prototype for implementation of a boot service interface // RUNTIMESERVICE - prototype for implementation of a runtime service interface // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service // RUNTIME_CODE - pragma macro for declaring runtime code // #ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options #define EFIAPI // Substitute expresion to force C calling convention #endif #define BOOTSERVICE #define RUNTIMESERVICE #define RUNTIMEFUNCTION #define RUNTIME_CODE(a) alloc_text("rtcode", a) #define BEGIN_RUNTIME_DATA() data_seg("rtdata") #define END_RUNTIME_DATA() data_seg("") #define VOLATILE volatile #define MEMORY_FENCE __sync_synchronize // // When build similiar to FW, then link everything together as // one big module. For the MSVC toolchain, we simply tell the // linker what our driver init function is using /ENTRY. // #if defined(_MSC_EXTENSIONS) #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ __pragma(comment(linker, "/ENTRY:" # InitFunction)) #else #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ UINTN \ InitializeDriver ( \ VOID *ImageHandle, \ VOID *SystemTable \ ) \ { \ return InitFunction(ImageHandle, \ SystemTable); \ } \ \ EFI_STATUS efi_main( \ EFI_HANDLE image, \ EFI_SYSTEM_TABLE *systab \ ) __attribute__((weak, \ alias ("InitializeDriver"))); #endif #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ (_if)->LoadInternal(type, name, entry) // // Some compilers don't support the forward reference construct: // typedef struct XXXXX // // The following macro provide a workaround for such cases. #define INTERFACE_DECL(x) struct x #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) #define EFI_FUNCTION ncroxon-gnu-efi-157d47c/inc/aarch64/efilibplat.h000066400000000000000000000004071471215650600213650ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: efilibplat.h Abstract: EFI to compile bindings Revision History --*/ VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); ncroxon-gnu-efi-157d47c/inc/aarch64/efisetjmp_arch.h000066400000000000000000000007641471215650600222430ustar00rootroot00000000000000#ifndef GNU_EFI_AARCH64_SETJMP_H #define GNU_EFI_AARCH64_SETJMP_H #define JMPBUF_ALIGN 8 typedef struct { /* GP regs */ UINT64 X19; UINT64 X20; UINT64 X21; UINT64 X22; UINT64 X23; UINT64 X24; UINT64 X25; UINT64 X26; UINT64 X27; UINT64 X28; UINT64 FP; UINT64 LR; UINT64 IP0; UINT64 _pad1; /* FP regs */ UINT64 D8; UINT64 D9; UINT64 D10; UINT64 D11; UINT64 D12; UINT64 D13; UINT64 D14; UINT64 D15; } EFI_ALIGN(JMPBUF_ALIGN) jmp_buf[1]; #endif /* GNU_EFI_AARCH64_SETJMP_H */ ncroxon-gnu-efi-157d47c/inc/arm/000077500000000000000000000000001471215650600164275ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/arm/efibind.h000066400000000000000000000125351471215650600202060ustar00rootroot00000000000000/* * Copyright (C) 2014 - 2015 Linaro Ltd. * Author: Ard Biesheuvel * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #if !defined(_MSC_VER) && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L )) && !defined(__cplusplus) // ANSI C 1999/2000 stdint.h integer width declarations typedef unsigned long long uint64_t; typedef long long int64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef signed char int8_t; // unqualified 'char' is unsigned on ARM typedef uint32_t uintptr_t; typedef int32_t intptr_t; #else #include #endif /* * This prevents GCC from emitting GOT based relocations, and use R_ARM_REL32 * relative relocations instead, which are more suitable for static binaries. */ #if defined(__GNUC__) && !__STDC_HOSTED__ #pragma GCC visibility push (hidden) #endif // // Basic EFI types of various widths // #include typedef uint16_t CHAR16; #define WCHAR CHAR16 typedef uint64_t UINT64; typedef int64_t INT64; typedef uint32_t UINT32; typedef int32_t INT32; typedef uint16_t UINT16; typedef int16_t INT16; typedef uint8_t UINT8; typedef unsigned char CHAR8; typedef int8_t INT8; #undef VOID typedef void VOID; typedef int32_t INTN; typedef uint32_t UINTN; #define EFIERR(a) (0x80000000 | a) #define EFI_ERROR_MASK 0x80000000 #define EFIERR_OEM(a) (0xc0000000 | a) #define BAD_POINTER 0xFBFBFBFB #define MAX_ADDRESS 0xFFFFFFFF #define BREAKPOINT() while (TRUE); // // Pointers must be aligned to these address to function // #define MIN_ALIGNMENT_SIZE 4 #define ALIGN_VARIABLE(Value ,Adjustment) \ (UINTN)Adjustment = 0; \ if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ Value = (UINTN)Value + (UINTN)Adjustment // // Define macros to build data structure signatures from characters. // #define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) #define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) // // EFIAPI - prototype calling convention for EFI function pointers // BOOTSERVICE - prototype for implementation of a boot service interface // RUNTIMESERVICE - prototype for implementation of a runtime service interface // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service // RUNTIME_CODE - pragma macro for declaring runtime code // #ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options #define EFIAPI // Substitute expresion to force C calling convention #endif #define BOOTSERVICE #define RUNTIMESERVICE #define RUNTIMEFUNCTION #define RUNTIME_CODE(a) alloc_text("rtcode", a) #define BEGIN_RUNTIME_DATA() data_seg("rtdata") #define END_RUNTIME_DATA() data_seg("") #define VOLATILE volatile #define MEMORY_FENCE __sync_synchronize // // When build similiar to FW, then link everything together as // one big module. For the MSVC toolchain, we simply tell the // linker what our driver init function is using /ENTRY. // #if defined(_MSC_EXTENSIONS) #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ __pragma(comment(linker, "/ENTRY:" # InitFunction)) #else #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ UINTN \ InitializeDriver ( \ VOID *ImageHandle, \ VOID *SystemTable \ ) \ { \ return InitFunction(ImageHandle, \ SystemTable); \ } \ \ EFI_STATUS efi_main( \ EFI_HANDLE image, \ EFI_SYSTEM_TABLE *systab \ ) __attribute__((weak, \ alias ("InitializeDriver"))); #endif #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ (_if)->LoadInternal(type, name, entry) // // Some compilers don't support the forward reference construct: // typedef struct XXXXX // // The following macro provide a workaround for such cases. #define INTERFACE_DECL(x) struct x #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) #define EFI_FUNCTION ncroxon-gnu-efi-157d47c/inc/arm/efilibplat.h000066400000000000000000000004071471215650600207140ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: efilibplat.h Abstract: EFI to compile bindings Revision History --*/ VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); ncroxon-gnu-efi-157d47c/inc/arm/efisetjmp_arch.h000066400000000000000000000005231471215650600215630ustar00rootroot00000000000000#ifndef GNU_EFI_ARM_SETJMP_H #define GNU_EFI_ARM_SETJMP_H #define JMPBUF_ALIGN 4 typedef struct { UINT32 R3; // A copy of R13 UINT32 R4; UINT32 R5; UINT32 R6; UINT32 R7; UINT32 R8; UINT32 R9; UINT32 R10; UINT32 R11; UINT32 R12; UINT32 R13; UINT32 R14; } EFI_ALIGN(JMPBUF_ALIGN) jmp_buf[1]; #endif /* GNU_EFI_ARM_SETJMP_H */ ncroxon-gnu-efi-157d47c/inc/efi.h000066400000000000000000000037521471215650600165730ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: efi.h Abstract: Public EFI header files Revision History --*/ // Add a predefined macro to detect usage of the library #ifndef _GNU_EFI #define _GNU_EFI #endif // // Build flags on input // EFI32 // EFI_DEBUG - Enable debugging code // EFI_NT_EMULATOR - Building for running under NT // #ifndef _EFI_INCLUDE_ #define _EFI_INCLUDE_ #ifdef __cplusplus extern "C" { #endif #if defined(__APPLE__) #error "Mach-O toolchain isn't supported; please compile with an ELF toolchain from Homebrew" #endif #ifndef _GNU_EFI_4_0 #define _GNU_EFI_4_0 #endif #define EFI_FIRMWARE_VENDOR L"INTEL" #define EFI_FIRMWARE_MAJOR_REVISION 12 #define EFI_FIRMWARE_MINOR_REVISION 33 #define EFI_FIRMWARE_REVISION ((EFI_FIRMWARE_MAJOR_REVISION <<16) | (EFI_FIRMWARE_MINOR_REVISION)) #if defined(_M_X64) || defined(__x86_64__) || defined(__amd64__) #include "x86_64/efibind.h" #elif defined(_M_IX86) || defined(__i386__) #include "ia32/efibind.h" #elif defined(_M_IA64) || defined(__ia64__) #include "ia64/efibind.h" #elif defined (_M_ARM64) || defined(__aarch64__) #include "aarch64/efibind.h" #elif defined (_M_ARM) || defined(__arm__) #include "arm/efibind.h" #elif defined (_M_MIPS64) || defined(__mips64__) || defined(__mips64) #include "mips64el/efibind.h" #elif defined (__riscv) && __riscv_xlen == 64 #include "riscv64/efibind.h" #elif defined (__loongarch64) #include "loongarch64/efibind.h" #else #error Usupported architecture #endif #include "eficompiler.h" #include "efidef.h" #include "legacy.h" #include "efidevp.h" #include "efipciio.h" #include "efiprot.h" #include "eficon.h" #include "eficonex.h" #include "efiser.h" #include "efi_nii.h" #include "efipxebc.h" #include "efinet.h" #include "efiapi.h" #include "efifs.h" #include "efierr.h" #include "efiui.h" #include "efimp.h" #include "efiip.h" #include "efiudp.h" #include "efitcp.h" #include "efipoint.h" #include "efishell.h" #ifdef __cplusplus } #endif #endif ncroxon-gnu-efi-157d47c/inc/efi_nii.h000066400000000000000000000051131471215650600174230ustar00rootroot00000000000000#ifndef _EFI_NII_H #define _EFI_NII_H /*++ Copyright (c) 2000 Intel Corporation Module name: efi_nii.h Abstract: Revision history: 2000-Feb-18 M(f)J GUID updated. Structure order changed for machine word alignment. Added StringId[4] to structure. 2000-Feb-14 M(f)J Genesis. --*/ #define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_GUID \ { 0xE18541CD, 0xF755, 0x4f73, {0x92, 0x8D, 0x64, 0x3C, 0x8A, 0x79, 0xB2, 0x29} } #define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION 0x00010000 #define EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE_REVISION EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION typedef enum { EfiNetworkInterfaceUndi = 1 } EFI_NETWORK_INTERFACE_TYPE; typedef struct _EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL { UINT64 Revision; // Revision of the network interface identifier protocol interface. UINT64 ID; // Address of the first byte of the identifying structure for this // network interface. This is set to zero if there is no structure. // // For PXE/UNDI this is the first byte of the !PXE structure. UINT64 ImageAddr; // Address of the UNrelocated driver/ROM image. This is set // to zero if there is no driver/ROM image. // // For 16-bit UNDI, this is the first byte of the option ROM in // upper memory. // // For 32/64-bit S/W UNDI, this is the first byte of the EFI ROM // image. // // For H/W UNDI, this is set to zero. UINT32 ImageSize; // Size of the UNrelocated driver/ROM image of this network interface. // This is set to zero if there is no driver/ROM image. CHAR8 StringId[4]; // 4 char ASCII string to go in class identifier (option 60) in DHCP // and Boot Server discover packets. // For EfiNetworkInterfaceUndi this field is "UNDI". // For EfiNetworkInterfaceSnp this field is "SNPN". UINT8 Type; UINT8 MajorVer; UINT8 MinorVer; // Information to be placed into the PXE DHCP and Discover packets. // This is the network interface type and version number that will // be placed into DHCP option 94 (client network interface identifier). BOOLEAN Ipv6Supported; UINT8 IfNum; // interface number to be used with pxeid structure } EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL, EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE; // Note: Because it conflicted with the EDK2 struct name, the // 'EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL' GUID definition, // from older versions of gnu-efi, is now obsoleted. // Use 'EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_GUID' instead. #endif // _EFI_NII_H ncroxon-gnu-efi-157d47c/inc/efi_pxe.h000066400000000000000000001350071471215650600174460ustar00rootroot00000000000000#ifndef _EFI_PXE_H #define _EFI_PXE_H /*++ Copyright (c) Intel 1999 Module name: efi_pxe.h 32/64-bit PXE specification: alpha-4, 99-Dec-17 Abstract: This header file contains all of the PXE type definitions, structure prototypes, global variables and constants that are needed for porting PXE to EFI. --*/ #pragma pack(1) #define PXE_INTEL_ORDER 1 // Intel order //#define PXE_NETWORK_ORDER 1 // network order #define PXE_UINT64_SUPPORT 1 // UINT64 supported //#define PXE_NO_UINT64_SUPPORT 1 // UINT64 not supported #define PXE_BUSTYPE(a,b,c,d) \ ((((PXE_UINT32)(d) & 0xFF) << 24) | \ (((PXE_UINT32)(c) & 0xFF) << 16) | \ (((PXE_UINT32)(b) & 0xFF) << 8) | \ ((PXE_UINT32)(a) & 0xFF)) // // UNDI ROM ID and devive ID signature // #define PXE_BUSTYPE_PXE PXE_BUSTYPE('!', 'P', 'X', 'E') // // BUS ROM ID signatures // #define PXE_BUSTYPE_PCI PXE_BUSTYPE('P', 'C', 'I', 'R') #define PXE_BUSTYPE_PC_CARD PXE_BUSTYPE('P', 'C', 'C', 'R') #define PXE_BUSTYPE_USB PXE_BUSTYPE('U', 'S', 'B', 'R') #define PXE_BUSTYPE_1394 PXE_BUSTYPE('1', '3', '9', '4') #define PXE_SWAP_UINT16(n) \ ((((PXE_UINT16)(n) & 0x00FF) << 8) | \ (((PXE_UINT16)(n) & 0xFF00) >> 8)) #define PXE_SWAP_UINT32(n) \ ((((PXE_UINT32)(n) & 0x000000FF) << 24) | \ (((PXE_UINT32)(n) & 0x0000FF00) << 8) | \ (((PXE_UINT32)(n) & 0x00FF0000) >> 8) | \ (((PXE_UINT32)(n) & 0xFF000000) >> 24)) #if PXE_UINT64_SUPPORT != 0 #define PXE_SWAP_UINT64(n) \ ((((PXE_UINT64)(n) & 0x00000000000000FF) << 56) | \ (((PXE_UINT64)(n) & 0x000000000000FF00) << 40) | \ (((PXE_UINT64)(n) & 0x0000000000FF0000) << 24) | \ (((PXE_UINT64)(n) & 0x00000000FF000000) << 8) | \ (((PXE_UINT64)(n) & 0x000000FF00000000) >> 8) | \ (((PXE_UINT64)(n) & 0x0000FF0000000000) >> 24) | \ (((PXE_UINT64)(n) & 0x00FF000000000000) >> 40) | \ (((PXE_UINT64)(n) & 0xFF00000000000000) >> 56)) #endif // PXE_UINT64_SUPPORT #if PXE_NO_UINT64_SUPPORT != 0 #define PXE_SWAP_UINT64(n) \ { \ PXE_UINT32 tmp = (PXE_UINT64)(n)[1]; \ (PXE_UINT64)(n)[1] = PXE_SWAP_UINT32((PXE_UINT64)(n)[0]); \ (PXE_UINT64)(n)[0] = tmp; \ } #endif // PXE_NO_UINT64_SUPPORT #define PXE_CPBSIZE_NOT_USED 0 // zero #define PXE_DBSIZE_NOT_USED 0 // zero #define PXE_CPBADDR_NOT_USED (PXE_UINT64)0 // zero #define PXE_DBADDR_NOT_USED (PXE_UINT64)0 // zero #define PXE_CONST const #define PXE_VOLATILE volatile typedef void PXE_VOID; typedef unsigned char PXE_UINT8; typedef unsigned short PXE_UINT16; typedef unsigned PXE_UINT32; #if PXE_UINT64_SUPPORT != 0 // typedef unsigned long PXE_UINT64; typedef UINT64 PXE_UINT64; #endif // PXE_UINT64_SUPPORT #if PXE_NO_UINT64_SUPPORT != 0 typedef PXE_UINT32 PXE_UINT64[2]; #endif // PXE_NO_UINT64_SUPPORT typedef unsigned PXE_UINTN; typedef PXE_UINT8 PXE_BOOL; #define PXE_FALSE 0 // zero #define PXE_TRUE (!PXE_FALSE) typedef PXE_UINT16 PXE_OPCODE; // // Return UNDI operational state. // #define PXE_OPCODE_GET_STATE 0x0000 // // Change UNDI operational state from Stopped to Started. // #define PXE_OPCODE_START 0x0001 // // Change UNDI operational state from Started to Stopped. // #define PXE_OPCODE_STOP 0x0002 // // Get UNDI initialization information. // #define PXE_OPCODE_GET_INIT_INFO 0x0003 // // Get NIC configuration information. // #define PXE_OPCODE_GET_CONFIG_INFO 0x0004 // // Changed UNDI operational state from Started to Initialized. // #define PXE_OPCODE_INITIALIZE 0x0005 // // Re-initialize the NIC H/W. // #define PXE_OPCODE_RESET 0x0006 // // Change the UNDI operational state from Initialized to Started. // #define PXE_OPCODE_SHUTDOWN 0x0007 // // Read & change state of external interrupt enables. // #define PXE_OPCODE_INTERRUPT_ENABLES 0x0008 // // Read & change state of packet receive filters. // #define PXE_OPCODE_RECEIVE_FILTERS 0x0009 // // Read & change station MAC address. // #define PXE_OPCODE_STATION_ADDRESS 0x000A // // Read traffic statistics. // #define PXE_OPCODE_STATISTICS 0x000B // // Convert multicast IP address to multicast MAC address. // #define PXE_OPCODE_MCAST_IP_TO_MAC 0x000C // // Read or change non-volatile storage on the NIC. // #define PXE_OPCODE_NVDATA 0x000D // // Get & clear interrupt status. // #define PXE_OPCODE_GET_STATUS 0x000E // // Fill media header in packet for transmit. // #define PXE_OPCODE_FILL_HEADER 0x000F // // Transmit packet(s). // #define PXE_OPCODE_TRANSMIT 0x0010 // // Receive packet. // #define PXE_OPCODE_RECEIVE 0x0011 // last valid opcode: #define PXE_OPCODE_VALID_MAX 0x0011 // // Last valid PXE UNDI OpCode number. // #define PXE_OPCODE_LAST_VALID 0x0011 typedef PXE_UINT16 PXE_OPFLAGS; #define PXE_OPFLAGS_NOT_USED 0x0000 //////////////////////////////////////// // UNDI Get State // // No OpFlags //////////////////////////////////////// // UNDI Start // // No OpFlags //////////////////////////////////////// // UNDI Stop // // No OpFlags //////////////////////////////////////// // UNDI Get Init Info // // No Opflags //////////////////////////////////////// // UNDI Get Config Info // // No Opflags //////////////////////////////////////// // UNDI Initialize // #define PXE_OPFLAGS_INITIALIZE_CABLE_DETECT_MASK 0x0001 #define PXE_OPFLAGS_INITIALIZE_DETECT_CABLE 0x0000 #define PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE 0x0001 //////////////////////////////////////// // UNDI Reset // #define PXE_OPFLAGS_RESET_DISABLE_INTERRUPTS 0x0001 #define PXE_OPFLAGS_RESET_DISABLE_FILTERS 0x0002 //////////////////////////////////////// // UNDI Shutdown // // No OpFlags //////////////////////////////////////// // UNDI Interrupt Enables // // // Select whether to enable or disable external interrupt signals. // Setting both enable and disable will return PXE_STATCODE_INVALID_OPFLAGS. // #define PXE_OPFLAGS_INTERRUPT_OPMASK 0xC000 #define PXE_OPFLAGS_INTERRUPT_ENABLE 0x8000 #define PXE_OPFLAGS_INTERRUPT_DISABLE 0x4000 #define PXE_OPFLAGS_INTERRUPT_READ 0x0000 // // Enable receive interrupts. An external interrupt will be generated // after a complete non-error packet has been received. // #define PXE_OPFLAGS_INTERRUPT_RECEIVE 0x0001 // // Enable transmit interrupts. An external interrupt will be generated // after a complete non-error packet has been transmitted. // #define PXE_OPFLAGS_INTERRUPT_TRANSMIT 0x0002 // // Enable command interrupts. An external interrupt will be generated // when command execution stops. // #define PXE_OPFLAGS_INTERRUPT_COMMAND 0x0004 // // Generate software interrupt. Setting this bit generates an external // interrupt, if it is supported by the hardware. // #define PXE_OPFLAGS_INTERRUPT_SOFTWARE 0x0008 //////////////////////////////////////// // UNDI Receive Filters // // // Select whether to enable or disable receive filters. // Setting both enable and disable will return PXE_STATCODE_INVALID_OPCODE. // #define PXE_OPFLAGS_RECEIVE_FILTER_OPMASK 0xC000 #define PXE_OPFLAGS_RECEIVE_FILTER_ENABLE 0x8000 #define PXE_OPFLAGS_RECEIVE_FILTER_DISABLE 0x4000 #define PXE_OPFLAGS_RECEIVE_FILTER_READ 0x0000 // // To reset the contents of the multicast MAC address filter list, // set this OpFlag: // #define PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST 0x2000 // // Enable unicast packet receiving. Packets sent to the current station // MAC address will be received. // #define PXE_OPFLAGS_RECEIVE_FILTER_UNICAST 0x0001 // // Enable broadcast packet receiving. Packets sent to the broadcast // MAC address will be received. // #define PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST 0x0002 // // Enable filtered multicast packet receiving. Packets sent to any // of the multicast MAC addresses in the multicast MAC address filter // list will be received. If the filter list is empty, no multicast // #define PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST 0x0004 // // Enable promiscuous packet receiving. All packets will be received. // #define PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS 0x0008 // // Enable promiscuous multicast packet receiving. All multicast // packets will be received. // #define PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST 0x0010 //////////////////////////////////////// // UNDI Station Address // #define PXE_OPFLAGS_STATION_ADDRESS_READ 0x0000 #define PXE_OPFLAGS_STATION_ADDRESS_RESET 0x0001 //////////////////////////////////////// // UNDI Statistics // #define PXE_OPFLAGS_STATISTICS_READ 0x0000 #define PXE_OPFLAGS_STATISTICS_RESET 0x0001 //////////////////////////////////////// // UNDI MCast IP to MAC // // // Identify the type of IP address in the CPB. // #define PXE_OPFLAGS_MCAST_IP_TO_MAC_OPMASK 0x0003 #define PXE_OPFLAGS_MCAST_IPV4_TO_MAC 0x0000 #define PXE_OPFLAGS_MCAST_IPV6_TO_MAC 0x0001 //////////////////////////////////////// // UNDI NvData // // // Select the type of non-volatile data operation. // #define PXE_OPFLAGS_NVDATA_OPMASK 0x0001 #define PXE_OPFLAGS_NVDATA_READ 0x0000 #define PXE_OPFLAGS_NVDATA_WRITE 0x0001 //////////////////////////////////////// // UNDI Get Status // // // Return current interrupt status. This will also clear any interrupts // that are currently set. This can be used in a polling routine. The // interrupt flags are still set and cleared even when the interrupts // are disabled. // #define PXE_OPFLAGS_GET_INTERRUPT_STATUS 0x0001 // // Return list of transmitted buffers for recycling. Transmit buffers // must not be changed or unallocated until they have recycled. After // issuing a transmit command, wait for a transmit complete interrupt. // When a transmit complete interrupt is received, read the transmitted // buffers. Do not plan on getting one buffer per interrupt. Some // NICs and UNDIs may transmit multiple buffers per interrupt. // #define PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS 0x0002 //////////////////////////////////////// // UNDI Fill Header // #define PXE_OPFLAGS_FILL_HEADER_OPMASK 0x0001 #define PXE_OPFLAGS_FILL_HEADER_FRAGMENTED 0x0001 #define PXE_OPFLAGS_FILL_HEADER_WHOLE 0x0000 //////////////////////////////////////// // UNDI Transmit // // // S/W UNDI only. Return after the packet has been transmitted. A // transmit complete interrupt will still be generated and the transmit // buffer will have to be recycled. // #define PXE_OPFLAGS_SWUNDI_TRANSMIT_OPMASK 0x0001 #define PXE_OPFLAGS_TRANSMIT_BLOCK 0x0001 #define PXE_OPFLAGS_TRANSMIT_DONT_BLOCK 0x0000 // // // #define PXE_OPFLAGS_TRANSMIT_OPMASK 0x0002 #define PXE_OPFLAGS_TRANSMIT_FRAGMENTED 0x0002 #define PXE_OPFLAGS_TRANSMIT_WHOLE 0x0000 //////////////////////////////////////// // UNDI Receive // // No OpFlags typedef PXE_UINT16 PXE_STATFLAGS; #define PXE_STATFLAGS_INITIALIZE 0x0000 //////////////////////////////////////// // Common StatFlags that can be returned by all commands. // // // The COMMAND_COMPLETE and COMMAND_FAILED status flags must be // implemented by all UNDIs. COMMAND_QUEUED is only needed by UNDIs // that support command queuing. // #define PXE_STATFLAGS_STATUS_MASK 0xC000 #define PXE_STATFLAGS_COMMAND_COMPLETE 0xC000 #define PXE_STATFLAGS_COMMAND_FAILED 0x8000 #define PXE_STATFLAGS_COMMAND_QUEUED 0x4000 //#define PXE_STATFLAGS_INITIALIZE 0x0000 #define PXE_STATFLAGS_DB_WRITE_TRUNCATED 0x2000 //////////////////////////////////////// // UNDI Get State // #define PXE_STATFLAGS_GET_STATE_MASK 0x0003 #define PXE_STATFLAGS_GET_STATE_INITIALIZED 0x0002 #define PXE_STATFLAGS_GET_STATE_STARTED 0x0001 #define PXE_STATFLAGS_GET_STATE_STOPPED 0x0000 //////////////////////////////////////// // UNDI Start // // No additional StatFlags //////////////////////////////////////// // UNDI Get Init Info // #define PXE_STATFLAGS_CABLE_DETECT_MASK 0x0001 #define PXE_STATFLAGS_CABLE_DETECT_NOT_SUPPORTED 0x0000 #define PXE_STATFLAGS_CABLE_DETECT_SUPPORTED 0x0001 //////////////////////////////////////// // UNDI Initialize // #define PXE_STATFLAGS_INITIALIZED_NO_MEDIA 0x0001 //////////////////////////////////////// // UNDI Reset // #define PXE_STATFLAGS_RESET_NO_MEDIA 0x0001 //////////////////////////////////////// // UNDI Shutdown // // No additional StatFlags //////////////////////////////////////// // UNDI Interrupt Enables // // // If set, receive interrupts are enabled. // #define PXE_STATFLAGS_INTERRUPT_RECEIVE 0x0001 // // If set, transmit interrupts are enabled. // #define PXE_STATFLAGS_INTERRUPT_TRANSMIT 0x0002 // // If set, command interrupts are enabled. // #define PXE_STATFLAGS_INTERRUPT_COMMAND 0x0004 //////////////////////////////////////// // UNDI Receive Filters // // // If set, unicast packets will be received. // #define PXE_STATFLAGS_RECEIVE_FILTER_UNICAST 0x0001 // // If set, broadcast packets will be received. // #define PXE_STATFLAGS_RECEIVE_FILTER_BROADCAST 0x0002 // // If set, multicast packets that match up with the multicast address // filter list will be received. // #define PXE_STATFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST 0x0004 // // If set, all packets will be received. // #define PXE_STATFLAGS_RECEIVE_FILTER_PROMISCUOUS 0x0008 // // If set, all multicast packets will be received. // #define PXE_STATFLAGS_RECEIVE_FILTER_ALL_MULTICAST 0x0010 //////////////////////////////////////// // UNDI Station Address // // No additional StatFlags //////////////////////////////////////// // UNDI Statistics // // No additional StatFlags //////////////////////////////////////// // UNDI MCast IP to MAC // // No additional StatFlags //////////////////////////////////////// // UNDI NvData // // No additional StatFlags //////////////////////////////////////// // UNDI Get Status // // // Use to determine if an interrupt has occurred. // #define PXE_STATFLAGS_GET_STATUS_INTERRUPT_MASK 0x000F #define PXE_STATFLAGS_GET_STATUS_NO_INTERRUPTS 0x0000 // // If set, at least one receive interrupt occurred. // #define PXE_STATFLAGS_GET_STATUS_RECEIVE 0x0001 // // If set, at least one transmit interrupt occurred. // #define PXE_STATFLAGS_GET_STATUS_TRANSMIT 0x0002 // // If set, at least one command interrupt occurred. // #define PXE_STATFLAGS_GET_STATUS_COMMAND 0x0004 // // If set, at least one software interrupt occurred. // #define PXE_STATFLAGS_GET_STATUS_SOFTWARE 0x0008 // // This flag is set if the transmitted buffer queue is empty. This flag // will be set if all transmitted buffer addresses get written into the DB. // #define PXE_STATFLAGS_GET_STATUS_TXBUF_QUEUE_EMPTY 0x0010 // // This flag is set if no transmitted buffer addresses were written // into the DB. (This could be because DBsize was too small.) // #define PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN 0x0020 //////////////////////////////////////// // UNDI Fill Header // // No additional StatFlags //////////////////////////////////////// // UNDI Transmit // // No additional StatFlags. //////////////////////////////////////// // UNDI Receive // // No additional StatFlags. typedef PXE_UINT16 PXE_STATCODE; #define PXE_STATCODE_INITIALIZE 0x0000 //////////////////////////////////////// // Common StatCodes returned by all UNDI commands, UNDI protocol functions // and BC protocol functions. // #define PXE_STATCODE_SUCCESS 0x0000 #define PXE_STATCODE_INVALID_CDB 0x0001 #define PXE_STATCODE_INVALID_CPB 0x0002 #define PXE_STATCODE_BUSY 0x0003 #define PXE_STATCODE_QUEUE_FULL 0x0004 #define PXE_STATCODE_ALREADY_STARTED 0x0005 #define PXE_STATCODE_NOT_STARTED 0x0006 #define PXE_STATCODE_NOT_SHUTDOWN 0x0007 #define PXE_STATCODE_ALREADY_INITIALIZED 0x0008 #define PXE_STATCODE_NOT_INITIALIZED 0x0009 #define PXE_STATCODE_DEVICE_FAILURE 0x000A #define PXE_STATCODE_NVDATA_FAILURE 0x000B #define PXE_STATCODE_UNSUPPORTED 0x000C #define PXE_STATCODE_BUFFER_FULL 0x000D #define PXE_STATCODE_INVALID_PARAMETER 0x000E #define PXE_STATCODE_INVALID_UNDI 0x000F #define PXE_STATCODE_IPV4_NOT_SUPPORTED 0x0010 #define PXE_STATCODE_IPV6_NOT_SUPPORTED 0x0011 #define PXE_STATCODE_NOT_ENOUGH_MEMORY 0x0012 #define PXE_STATCODE_NO_DATA 0x0013 typedef PXE_UINT16 PXE_IFNUM; // // This interface number must be passed to the S/W UNDI Start command. // #define PXE_IFNUM_START 0x0000 // // This interface number is returned by the S/W UNDI Get State and // Start commands if information in the CDB, CPB or DB is invalid. // #define PXE_IFNUM_INVALID 0x0000 typedef PXE_UINT16 PXE_CONTROL; // // Setting this flag directs the UNDI to queue this command for later // execution if the UNDI is busy and it supports command queuing. // If queuing is not supported, a PXE_STATCODE_INVALID_CONTROL error // is returned. If the queue is full, a PXE_STATCODE_CDB_QUEUE_FULL // error is returned. // #define PXE_CONTROL_QUEUE_IF_BUSY 0x0002 // // These two bit values are used to determine if there are more UNDI // CDB structures following this one. If the link bit is set, there // must be a CDB structure following this one. Execution will start // on the next CDB structure as soon as this one completes successfully. // If an error is generated by this command, execution will stop. // #define PXE_CONTROL_LINK 0x0001 #define PXE_CONTROL_LAST_CDB_IN_LIST 0x0000 typedef PXE_UINT8 PXE_FRAME_TYPE; #define PXE_FRAME_TYPE_NONE 0x00 #define PXE_FRAME_TYPE_UNICAST 0x01 #define PXE_FRAME_TYPE_BROADCAST 0x02 #define PXE_FRAME_TYPE_MULTICAST 0x03 #define PXE_FRAME_TYPE_PROMISCUOUS 0x04 typedef PXE_UINT32 PXE_IPV4; typedef PXE_UINT32 PXE_IPV6[4]; #define PXE_MAC_LENGTH 32 typedef PXE_UINT8 PXE_MAC_ADDR[PXE_MAC_LENGTH]; typedef PXE_UINT8 PXE_IFTYPE; typedef PXE_UINT16 PXE_MEDIA_PROTOCOL; // // This information is from the ARP section of RFC 1700. // // 1 Ethernet (10Mb) [JBP] // 2 Experimental Ethernet (3Mb) [JBP] // 3 Amateur Radio AX.25 [PXK] // 4 Proteon ProNET Token Ring [JBP] // 5 Chaos [GXP] // 6 IEEE 802 Networks [JBP] // 7 ARCNET [JBP] // 8 Hyperchannel [JBP] // 9 Lanstar [TU] // 10 Autonet Short Address [MXB1] // 11 LocalTalk [JKR1] // 12 LocalNet (IBM PCNet or SYTEK LocalNET) [JXM] // 13 Ultra link [RXD2] // 14 SMDS [GXC1] // 15 Frame Relay [AGM] // 16 Asynchronous Transmission Mode (ATM) [JXB2] // 17 HDLC [JBP] // 18 Fibre Channel [Yakov Rekhter] // 19 Asynchronous Transmission Mode (ATM) [Mark Laubach] // 20 Serial Line [JBP] // 21 Asynchronous Transmission Mode (ATM) [MXB1] // #define PXE_IFTYPE_ETHERNET 0x01 #define PXE_IFTYPE_TOKENRING 0x04 #define PXE_IFTYPE_FIBRE_CHANNEL 0x12 typedef struct s_pxe_hw_undi { PXE_UINT32 Signature; // PXE_ROMID_SIGNATURE PXE_UINT8 Len; // sizeof(PXE_HW_UNDI) PXE_UINT8 Fudge; // makes 8-bit cksum equal zero PXE_UINT8 Rev; // PXE_ROMID_REV PXE_UINT8 IFcnt; // physical connector count PXE_UINT8 MajorVer; // PXE_ROMID_MAJORVER PXE_UINT8 MinorVer; // PXE_ROMID_MINORVER PXE_UINT16 reserved; // zero, not used PXE_UINT32 Implementation; // implementation flags // reserved // vendor use // PXE_UINT32 Status; // status port // PXE_UINT32 Command; // command port // PXE_UINT64 CDBaddr; // CDB address port } PXE_HW_UNDI; // // Status port bit definitions // // // UNDI operation state // #define PXE_HWSTAT_STATE_MASK 0xC0000000 #define PXE_HWSTAT_BUSY 0xC0000000 #define PXE_HWSTAT_INITIALIZED 0x80000000 #define PXE_HWSTAT_STARTED 0x40000000 #define PXE_HWSTAT_STOPPED 0x00000000 // // If set, last command failed // #define PXE_HWSTAT_COMMAND_FAILED 0x20000000 // // If set, identifies enabled receive filters // #define PXE_HWSTAT_PROMISCUOUS_MULTICAST_RX_ENABLED 0x00001000 #define PXE_HWSTAT_PROMISCUOUS_RX_ENABLED 0x00000800 #define PXE_HWSTAT_BROADCAST_RX_ENABLED 0x00000400 #define PXE_HWSTAT_MULTICAST_RX_ENABLED 0x00000200 #define PXE_HWSTAT_UNICAST_RX_ENABLED 0x00000100 // // If set, identifies enabled external interrupts // #define PXE_HWSTAT_SOFTWARE_INT_ENABLED 0x00000080 #define PXE_HWSTAT_TX_COMPLETE_INT_ENABLED 0x00000040 #define PXE_HWSTAT_PACKET_RX_INT_ENABLED 0x00000020 #define PXE_HWSTAT_CMD_COMPLETE_INT_ENABLED 0x00000010 // // If set, identifies pending interrupts // #define PXE_HWSTAT_SOFTWARE_INT_PENDING 0x00000008 #define PXE_HWSTAT_TX_COMPLETE_INT_PENDING 0x00000004 #define PXE_HWSTAT_PACKET_RX_INT_PENDING 0x00000002 #define PXE_HWSTAT_CMD_COMPLETE_INT_PENDING 0x00000001 // // Command port definitions // // // If set, CDB identified in CDBaddr port is given to UNDI. // If not set, other bits in this word will be processed. // #define PXE_HWCMD_ISSUE_COMMAND 0x80000000 #define PXE_HWCMD_INTS_AND_FILTS 0x00000000 // // Use these to enable/disable receive filters. // #define PXE_HWCMD_PROMISCUOUS_MULTICAST_RX_ENABLE 0x00001000 #define PXE_HWCMD_PROMISCUOUS_RX_ENABLE 0x00000800 #define PXE_HWCMD_BROADCAST_RX_ENABLE 0x00000400 #define PXE_HWCMD_MULTICAST_RX_ENABLE 0x00000200 #define PXE_HWCMD_UNICAST_RX_ENABLE 0x00000100 // // Use these to enable/disable external interrupts // #define PXE_HWCMD_SOFTWARE_INT_ENABLE 0x00000080 #define PXE_HWCMD_TX_COMPLETE_INT_ENABLE 0x00000040 #define PXE_HWCMD_PACKET_RX_INT_ENABLE 0x00000020 #define PXE_HWCMD_CMD_COMPLETE_INT_ENABLE 0x00000010 // // Use these to clear pending external interrupts // #define PXE_HWCMD_CLEAR_SOFTWARE_INT 0x00000008 #define PXE_HWCMD_CLEAR_TX_COMPLETE_INT 0x00000004 #define PXE_HWCMD_CLEAR_PACKET_RX_INT 0x00000002 #define PXE_HWCMD_CLEAR_CMD_COMPLETE_INT 0x00000001 typedef struct s_pxe_sw_undi { PXE_UINT32 Signature; // PXE_ROMID_SIGNATURE PXE_UINT8 Len; // sizeof(PXE_SW_UNDI) PXE_UINT8 Fudge; // makes 8-bit cksum zero PXE_UINT8 Rev; // PXE_ROMID_REV PXE_UINT8 IFcnt; // physical connector count PXE_UINT8 MajorVer; // PXE_ROMID_MAJORVER PXE_UINT8 MinorVer; // PXE_ROMID_MINORVER PXE_UINT16 reserved1; // zero, not used PXE_UINT32 Implementation; // Implementation flags PXE_UINT64 EntryPoint; // API entry point PXE_UINT8 reserved2[3]; // zero, not used PXE_UINT8 BusCnt; // number of bustypes supported PXE_UINT32 BusType[1]; // list of supported bustypes } PXE_SW_UNDI; typedef union u_pxe_undi { PXE_HW_UNDI hw; PXE_SW_UNDI sw; } PXE_UNDI; // // Signature of !PXE structure // #define PXE_ROMID_SIGNATURE PXE_BUSTYPE('!', 'P', 'X', 'E') // // !PXE structure format revision // #define PXE_ROMID_REV 0x02 // // UNDI command interface revision. These are the values that get sent // in option 94 (Client Network Interface Identifier) in the DHCP Discover // and PXE Boot Server Request packets. // #define PXE_ROMID_MAJORVER 0x03 #define PXE_ROMID_MINORVER 0x00 // // Implementation flags // #define PXE_ROMID_IMP_HW_UNDI 0x80000000 #define PXE_ROMID_IMP_SW_VIRT_ADDR 0x40000000 #define PXE_ROMID_IMP_64BIT_DEVICE 0x00010000 #define PXE_ROMID_IMP_FRAG_SUPPORTED 0x00008000 #define PXE_ROMID_IMP_CMD_LINK_SUPPORTED 0x00004000 #define PXE_ROMID_IMP_CMD_QUEUE_SUPPORTED 0x00002000 #define PXE_ROMID_IMP_MULTI_FRAME_SUPPORTED 0x00001000 #define PXE_ROMID_IMP_NVDATA_SUPPORT_MASK 0x00000C00 #define PXE_ROMID_IMP_NVDATA_BULK_WRITABLE 0x00000C00 #define PXE_ROMID_IMP_NVDATA_SPARSE_WRITABLE 0x00000800 #define PXE_ROMID_IMP_NVDATA_READ_ONLY 0x00000400 #define PXE_ROMID_IMP_NVDATA_NOT_AVAILABLE 0x00000000 #define PXE_ROMID_IMP_STATISTICS_SUPPORTED 0x00000200 #define PXE_ROMID_IMP_STATION_ADDR_SETTABLE 0x00000100 #define PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED 0x00000080 #define PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED 0x00000040 #define PXE_ROMID_IMP_BROADCAST_RX_SUPPORTED 0x00000020 #define PXE_ROMID_IMP_FILTERED_MULTICAST_RX_SUPPORTED 0x00000010 #define PXE_ROMID_IMP_SOFTWARE_INT_SUPPORTED 0x00000008 #define PXE_ROMID_IMP_TX_COMPLETE_INT_SUPPORTED 0x00000004 #define PXE_ROMID_IMP_PACKET_RX_INT_SUPPORTED 0x00000002 #define PXE_ROMID_IMP_CMD_COMPLETE_INT_SUPPORTED 0x00000001 typedef struct s_pxe_cdb { PXE_OPCODE OpCode; PXE_OPFLAGS OpFlags; PXE_UINT16 CPBsize; PXE_UINT16 DBsize; UINT64 CPBaddr; UINT64 DBaddr; PXE_STATCODE StatCode; PXE_STATFLAGS StatFlags; PXE_UINT16 IFnum; PXE_CONTROL Control; } PXE_CDB; typedef union u_pxe_ip_addr { PXE_IPV6 IPv6; PXE_IPV4 IPv4; } PXE_IP_ADDR; typedef union pxe_device { // // PCI and PC Card NICs are both identified using bus, device // and function numbers. For PC Card, this may require PC // Card services to be loaded in the BIOS or preboot // environment. // struct { // // See S/W UNDI ROMID structure definition for PCI and // PCC BusType definitions. // PXE_UINT32 BusType; // // Bus, device & function numbers that locate this device. // PXE_UINT16 Bus; PXE_UINT8 Device; PXE_UINT8 Function; } PCI, PCC; // // %%TBD - More information is needed about enumerating // USB and 1394 devices. // struct { PXE_UINT32 BusType; PXE_UINT32 tdb; } USB, _1394; } PXE_DEVICE; // cpb and db definitions #define MAX_PCI_CONFIG_LEN 64 // # of dwords #define MAX_EEPROM_LEN 128 // #of dwords #define MAX_XMIT_BUFFERS 32 // recycling Q length for xmit_done #define MAX_MCAST_ADDRESS_CNT 8 typedef struct s_pxe_cpb_start { // // PXE_VOID Delay(PXE_UINT64 microseconds); // // UNDI will never request a delay smaller than 10 microseconds // and will always request delays in increments of 10 microseconds. // The Delay() CallBack routine must delay between n and n + 10 // microseconds before returning control to the UNDI. // // This field cannot be set to zero. // PXE_UINT64 Delay; // // PXE_VOID Block(PXE_UINT32 enable); // // UNDI may need to block multi-threaded/multi-processor access to // critical code sections when programming or accessing the network // device. To this end, a blocking service is needed by the UNDI. // When UNDI needs a block, it will call Block() passing a non-zero // value. When UNDI no longer needs a block, it will call Block() // with a zero value. When called, if the Block() is already enabled, // do not return control to the UNDI until the previous Block() is // disabled. // // This field cannot be set to zero. // PXE_UINT64 Block; // // PXE_VOID Virt2Phys(PXE_UINT64 virtual, PXE_UINT64 physical_ptr); // // UNDI will pass the virtual address of a buffer and the virtual // address of a 64-bit physical buffer. Convert the virtual address // to a physical address and write the result to the physical address // buffer. If virtual and physical addresses are the same, just // copy the virtual address to the physical address buffer. // // This field can be set to zero if virtual and physical addresses // are equal. // PXE_UINT64 Virt2Phys; // // PXE_VOID Mem_IO(PXE_UINT8 read_write, PXE_UINT8 len, PXE_UINT64 port, // PXE_UINT64 buf_addr); // // UNDI will read or write the device io space using this call back // function. It passes the number of bytes as the len parameter and it // will be either 1,2,4 or 8. // // This field can not be set to zero. // PXE_UINT64 Mem_IO; } PXE_CPB_START; #define PXE_DELAY_MILLISECOND 1000 #define PXE_DELAY_SECOND 1000000 #define PXE_IO_READ 0 #define PXE_IO_WRITE 1 #define PXE_MEM_READ 2 #define PXE_MEM_WRITE 4 typedef struct s_pxe_db_get_init_info { // // Minimum length of locked memory buffer that must be given to // the Initialize command. Giving UNDI more memory will generally // give better performance. // // If MemoryRequired is zero, the UNDI does not need and will not // use system memory to receive and transmit packets. // PXE_UINT32 MemoryRequired; // // Maximum frame data length for Tx/Rx excluding the media header. // PXE_UINT32 FrameDataLen; // // Supported link speeds are in units of mega bits. Common ethernet // values are 10, 100 and 1000. Unused LinkSpeeds[] entries are zero // filled. // PXE_UINT32 LinkSpeeds[4]; // // Number of non-volatile storage items. // PXE_UINT32 NvCount; // // Width of non-volatile storage item in bytes. 0, 1, 2 or 4 // PXE_UINT16 NvWidth; // // Media header length. This is the typical media header length for // this UNDI. This information is needed when allocating receive // and transmit buffers. // PXE_UINT16 MediaHeaderLen; // // Number of bytes in the NIC hardware (MAC) address. // PXE_UINT16 HWaddrLen; // // Maximum number of multicast MAC addresses in the multicast // MAC address filter list. // PXE_UINT16 MCastFilterCnt; // // Default number and size of transmit and receive buffers that will // be allocated by the UNDI. If MemoryRequired is non-zero, this // allocation will come out of the memory buffer given to the Initialize // command. If MemoryRequired is zero, this allocation will come out of // memory on the NIC. // PXE_UINT16 TxBufCnt; PXE_UINT16 TxBufSize; PXE_UINT16 RxBufCnt; PXE_UINT16 RxBufSize; // // Hardware interface types defined in the Assigned Numbers RFC // and used in DHCP and ARP packets. // See the PXE_IFTYPE typedef and PXE_IFTYPE_xxx macros. // PXE_UINT8 IFtype; // // Supported duplex. See PXE_DUPLEX_xxxxx #defines below. // PXE_UINT8 Duplex; // // Supported loopback options. See PXE_LOOPBACK_xxxxx #defines below. // PXE_UINT8 LoopBack; } PXE_DB_GET_INIT_INFO; #define PXE_MAX_TXRX_UNIT_ETHER 1500 #define PXE_HWADDR_LEN_ETHER 0x0006 #define PXE_MAC_HEADER_LEN_ETHER 0x000E #define PXE_DUPLEX_ENABLE_FULL_SUPPORTED 1 #define PXE_DUPLEX_FORCE_FULL_SUPPORTED 2 #define PXE_LOOPBACK_INTERNAL_SUPPORTED 1 #define PXE_LOOPBACK_EXTERNAL_SUPPORTED 2 typedef struct s_pxe_pci_config_info { // // This is the flag field for the PXE_DB_GET_CONFIG_INFO union. // For PCI bus devices, this field is set to PXE_BUSTYPE_PCI. // PXE_UINT32 BusType; // // This identifies the PCI network device that this UNDI interface // is bound to. // PXE_UINT16 Bus; PXE_UINT8 Device; PXE_UINT8 Function; // // This is a copy of the PCI configuration space for this // network device. // union { PXE_UINT8 Byte[256]; PXE_UINT16 Word[128]; PXE_UINT32 Dword[64]; } Config; } PXE_PCI_CONFIG_INFO; typedef struct s_pxe_pcc_config_info { // // This is the flag field for the PXE_DB_GET_CONFIG_INFO union. // For PCC bus devices, this field is set to PXE_BUSTYPE_PCC. // PXE_UINT32 BusType; // // This identifies the PCC network device that this UNDI interface // is bound to. // PXE_UINT16 Bus; PXE_UINT8 Device; PXE_UINT8 Function; // // This is a copy of the PCC configuration space for this // network device. // union { PXE_UINT8 Byte[256]; PXE_UINT16 Word[128]; PXE_UINT32 Dword[64]; } Config; } PXE_PCC_CONFIG_INFO; typedef struct s_pxe_usb_config_info { PXE_UINT32 BusType; // %%TBD What should we return here... } PXE_USB_CONFIG_INFO; typedef struct s_pxe_1394_config_info { PXE_UINT32 BusType; // %%TBD What should we return here... } PXE_1394_CONFIG_INFO; typedef union u_pxe_db_get_config_info { PXE_PCI_CONFIG_INFO pci; PXE_PCC_CONFIG_INFO pcc; PXE_USB_CONFIG_INFO usb; PXE_1394_CONFIG_INFO _1394; } PXE_DB_GET_CONFIG_INFO; typedef struct s_pxe_cpb_initialize { // // Address of first (lowest) byte of the memory buffer. This buffer must // be in contiguous physical memory and cannot be swapped out. The UNDI // will be using this for transmit and receive buffering. // PXE_UINT64 MemoryAddr; // // MemoryLength must be greater than or equal to MemoryRequired // returned by the Get Init Info command. // PXE_UINT32 MemoryLength; // // Desired link speed in Mbit/sec. Common ethernet values are 10, 100 // and 1000. Setting a value of zero will auto-detect and/or use the // default link speed (operation depends on UNDI/NIC functionality). // PXE_UINT32 LinkSpeed; // // Suggested number and size of receive and transmit buffers to // allocate. If MemoryAddr and MemoryLength are non-zero, this // allocation comes out of the supplied memory buffer. If MemoryAddr // and MemoryLength are zero, this allocation comes out of memory // on the NIC. // // If these fields are set to zero, the UNDI will allocate buffer // counts and sizes as it sees fit. // PXE_UINT16 TxBufCnt; PXE_UINT16 TxBufSize; PXE_UINT16 RxBufCnt; PXE_UINT16 RxBufSize; // // The following configuration parameters are optional and must be zero // to use the default values. // PXE_UINT8 Duplex; PXE_UINT8 LoopBack; } PXE_CPB_INITIALIZE; #define PXE_DUPLEX_DEFAULT 0x00 #define PXE_FORCE_FULL_DUPLEX 0x01 #define PXE_ENABLE_FULL_DUPLEX 0x02 #define LOOPBACK_NORMAL 0 #define LOOPBACK_INTERNAL 1 #define LOOPBACK_EXTERNAL 2 typedef struct s_pxe_db_initialize { // // Actual amount of memory used from the supplied memory buffer. This // may be less that the amount of memory suppllied and may be zero if // the UNDI and network device do not use external memory buffers. // // Memory used by the UNDI and network device is allocated from the // lowest memory buffer address. // PXE_UINT32 MemoryUsed; // // Actual number and size of receive and transmit buffers that were // allocated. // PXE_UINT16 TxBufCnt; PXE_UINT16 TxBufSize; PXE_UINT16 RxBufCnt; PXE_UINT16 RxBufSize; } PXE_DB_INITIALIZE; typedef struct s_pxe_cpb_receive_filters { // // List of multicast MAC addresses. This list, if present, will // replace the existing multicast MAC address filter list. // PXE_MAC_ADDR MCastList[MAX_MCAST_ADDRESS_CNT]; } PXE_CPB_RECEIVE_FILTERS; typedef struct s_pxe_db_receive_filters { // // Filtered multicast MAC address list. // PXE_MAC_ADDR MCastList[MAX_MCAST_ADDRESS_CNT]; } PXE_DB_RECEIVE_FILTERS; typedef struct s_pxe_cpb_station_address { // // If supplied and supported, the current station MAC address // will be changed. // PXE_MAC_ADDR StationAddr; } PXE_CPB_STATION_ADDRESS; typedef struct s_pxe_dpb_station_address { // // Current station MAC address. // PXE_MAC_ADDR StationAddr; // // Station broadcast MAC address. // PXE_MAC_ADDR BroadcastAddr; // // Permanent station MAC address. // PXE_MAC_ADDR PermanentAddr; } PXE_DB_STATION_ADDRESS; typedef struct s_pxe_db_statistics { // // Bit field identifying what statistic data is collected by the // UNDI/NIC. // If bit 0x00 is set, Data[0x00] is collected. // If bit 0x01 is set, Data[0x01] is collected. // If bit 0x20 is set, Data[0x20] is collected. // If bit 0x21 is set, Data[0x21] is collected. // Etc. // PXE_UINT64 Supported; // // Statistic data. // PXE_UINT64 Data[64]; } PXE_DB_STATISTICS; // // Total number of frames received. Includes frames with errors and // dropped frames. // #define PXE_STATISTICS_RX_TOTAL_FRAMES 0x00 // // Number of valid frames received and copied into receive buffers. // #define PXE_STATISTICS_RX_GOOD_FRAMES 0x01 // // Number of frames below the minimum length for the media. // This would be <64 for ethernet. // #define PXE_STATISTICS_RX_UNDERSIZE_FRAMES 0x02 // // Number of frames longer than the maxminum length for the // media. This would be >1500 for ethernet. // #define PXE_STATISTICS_RX_OVERSIZE_FRAMES 0x03 // // Valid frames that were dropped because receive buffers were full. // #define PXE_STATISTICS_RX_DROPPED_FRAMES 0x04 // // Number of valid unicast frames received and not dropped. // #define PXE_STATISTICS_RX_UNICAST_FRAMES 0x05 // // Number of valid broadcast frames received and not dropped. // #define PXE_STATISTICS_RX_BROADCAST_FRAMES 0x06 // // Number of valid mutlicast frames received and not dropped. // #define PXE_STATISTICS_RX_MULTICAST_FRAMES 0x07 // // Number of frames w/ CRC or alignment errors. // #define PXE_STATISTICS_RX_CRC_ERROR_FRAMES 0x08 // // Total number of bytes received. Includes frames with errors // and dropped frames. // #define PXE_STATISTICS_RX_TOTAL_BYTES 0x09 // // Transmit statistics. // #define PXE_STATISTICS_TX_TOTAL_FRAMES 0x0A #define PXE_STATISTICS_TX_GOOD_FRAMES 0x0B #define PXE_STATISTICS_TX_UNDERSIZE_FRAMES 0x0C #define PXE_STATISTICS_TX_OVERSIZE_FRAMES 0x0D #define PXE_STATISTICS_TX_DROPPED_FRAMES 0x0E #define PXE_STATISTICS_TX_UNICAST_FRAMES 0x0F #define PXE_STATISTICS_TX_BROADCAST_FRAMES 0x10 #define PXE_STATISTICS_TX_MULTICAST_FRAMES 0x11 #define PXE_STATISTICS_TX_CRC_ERROR_FRAMES 0x12 #define PXE_STATISTICS_TX_TOTAL_BYTES 0x13 // // Number of collisions detection on this subnet. // #define PXE_STATISTICS_COLLISIONS 0x14 // // Number of frames destined for unsupported protocol. // #define PXE_STATISTICS_UNSUPPORTED_PROTOCOL 0x15 typedef struct s_pxe_cpb_mcast_ip_to_mac { // // Multicast IP address to be converted to multicast MAC address. // PXE_IP_ADDR IP; } PXE_CPB_MCAST_IP_TO_MAC; typedef struct s_pxe_db_mcast_ip_to_mac { // // Multicast MAC address. // PXE_MAC_ADDR MAC; } PXE_DB_MCAST_IP_TO_MAC; typedef struct s_pxe_cpb_nvdata_sparse { // // NvData item list. Only items in this list will be updated. // struct { // Non-volatile storage address to be changed. PXE_UINT32 Addr; // Data item to write into above storage address. union { PXE_UINT8 Byte; PXE_UINT16 Word; PXE_UINT32 Dword; } Data; } Item[MAX_EEPROM_LEN]; } PXE_CPB_NVDATA_SPARSE; // // When using bulk update, the size of the CPB structure must be // the same size as the non-volatile NIC storage. // typedef union u_pxe_cpb_nvdata_bulk { // // Array of byte-wide data items. // PXE_UINT8 Byte[MAX_EEPROM_LEN << 2]; // // Array of word-wide data items. // PXE_UINT16 Word[MAX_EEPROM_LEN << 1]; // // Array of dword-wide data items. // PXE_UINT32 Dword[MAX_EEPROM_LEN]; } PXE_CPB_NVDATA_BULK; typedef struct s_pxe_db_nvdata { // Arrays of data items from non-volatile storage. union { // // Array of byte-wide data items. // PXE_UINT8 Byte[MAX_EEPROM_LEN << 2]; // // Array of word-wide data items. // PXE_UINT16 Word[MAX_EEPROM_LEN << 1]; // Array of dword-wide data items. PXE_UINT32 Dword[MAX_EEPROM_LEN]; } Data; } PXE_DB_NVDATA; typedef struct s_pxe_db_get_status { // // Length of next receive frame (header + data). If this is zero, // there is no next receive frame available. // PXE_UINT32 RxFrameLen; // // Reserved, set to zero. // PXE_UINT32 reserved; // // Addresses of transmitted buffers that need to be recycled. // PXE_UINT64 TxBuffer[MAX_XMIT_BUFFERS]; } PXE_DB_GET_STATUS; typedef struct s_pxe_cpb_fill_header { // // Source and destination MAC addresses. These will be copied into // the media header without doing byte swapping. // PXE_MAC_ADDR SrcAddr; PXE_MAC_ADDR DestAddr; // // Address of first byte of media header. The first byte of packet data // follows the last byte of the media header. // PXE_UINT64 MediaHeader; // // Length of packet data in bytes (not including the media header). // PXE_UINT32 PacketLen; // // Protocol type. This will be copied into the media header without // doing byte swapping. Protocol type numbers can be obtained from // the Assigned Numbers RFC 1700. // PXE_UINT16 Protocol; // // Length of the media header in bytes. // PXE_UINT16 MediaHeaderLen; } PXE_CPB_FILL_HEADER; #define PXE_PROTOCOL_ETHERNET_IP 0x0800 #define PXE_PROTOCOL_ETHERNET_ARP 0x0806 #define MAX_XMIT_FRAGMENTS 16 typedef struct s_pxe_cpb_fill_header_fragmented { // // Source and destination MAC addresses. These will be copied into // the media header without doing byte swapping. // PXE_MAC_ADDR SrcAddr; PXE_MAC_ADDR DestAddr; // // Length of packet data in bytes (not including the media header). // PXE_UINT32 PacketLen; // // Protocol type. This will be copied into the media header without // doing byte swapping. Protocol type numbers can be obtained from // the Assigned Numbers RFC 1700. // PXE_MEDIA_PROTOCOL Protocol; // // Length of the media header in bytes. // PXE_UINT16 MediaHeaderLen; // // Number of packet fragment descriptors. // PXE_UINT16 FragCnt; // // Reserved, must be set to zero. // PXE_UINT16 reserved; // // Array of packet fragment descriptors. The first byte of the media // header is the first byte of the first fragment. // struct { // // Address of this packet fragment. // PXE_UINT64 FragAddr; // // Length of this packet fragment. // PXE_UINT32 FragLen; // // Reserved, must be set to zero. // PXE_UINT32 reserved; } FragDesc[MAX_XMIT_FRAGMENTS]; } PXE_CPB_FILL_HEADER_FRAGMENTED; typedef struct s_pxe_cpb_transmit { // // Address of first byte of frame buffer. This is also the first byte // of the media header. // PXE_UINT64 FrameAddr; // // Length of the data portion of the frame buffer in bytes. Do not // include the length of the media header. // PXE_UINT32 DataLen; // // Length of the media header in bytes. // PXE_UINT16 MediaheaderLen; // // Reserved, must be zero. // PXE_UINT16 reserved; } PXE_CPB_TRANSMIT; typedef struct s_pxe_cpb_transmit_fragments { // // Length of packet data in bytes (not including the media header). // PXE_UINT32 FrameLen; // // Length of the media header in bytes. // PXE_UINT16 MediaheaderLen; // // Number of packet fragment descriptors. // PXE_UINT16 FragCnt; // // Array of frame fragment descriptors. The first byte of the first // fragment is also the first byte of the media header. // struct { // // Address of this frame fragment. // PXE_UINT64 FragAddr; // // Length of this frame fragment. // PXE_UINT32 FragLen; // // Reserved, must be set to zero. // PXE_UINT32 reserved; } FragDesc[MAX_XMIT_FRAGMENTS]; } PXE_CPB_TRANSMIT_FRAGMENTS; typedef struct s_pxe_cpb_receive { // // Address of first byte of receive buffer. This is also the first byte // of the frame header. // PXE_UINT64 BufferAddr; // // Length of receive buffer. This must be large enough to hold the // received frame (media header + data). If the length of smaller than // the received frame, data will be lost. // PXE_UINT32 BufferLen; // // Reserved, must be set to zero. // PXE_UINT32 reserved; } PXE_CPB_RECEIVE; typedef struct s_pxe_db_receive { // // Source and destination MAC addresses from media header. // PXE_MAC_ADDR SrcAddr; PXE_MAC_ADDR DestAddr; // // Length of received frame. May be larger than receive buffer size. // The receive buffer will not be overwritten. This is how to tell // if data was lost because the receive buffer was too small. // PXE_UINT32 FrameLen; // // Protocol type from media header. // PXE_MEDIA_PROTOCOL Protocol; // // Length of media header in received frame. // PXE_UINT16 MediaHeaderLen; // // Type of receive frame. // PXE_FRAME_TYPE Type; // // Reserved, must be zero. // PXE_UINT8 reserved[7]; } PXE_DB_RECEIVE; #pragma pack() /* EOF - efi_pxe.h */ #endif /* _EFI_PXE_H */ ncroxon-gnu-efi-157d47c/inc/efiapi.h000066400000000000000000000711661471215650600172710ustar00rootroot00000000000000#ifndef _EFI_API_H #define _EFI_API_H /*++ Copyright (c) 1998 Intel Corporation Module Name: efiapi.h Abstract: Global EFI runtime & boot service interfaces Revision History --*/ // // EFI Specification Revision // #define EFI_SPECIFICATION_REVISION_MAJORMINOR(major, minor) ((major<<16) | (minor)) #define EFI_SPECIFICATION_MAJOR_REVISION 1 #define EFI_SPECIFICATION_MINOR_REVISION 02 #define EFI_SPECIFICATION_VERSION EFI_SPECIFICATION_REVISION_MAJORMINOR(EFI_SPECIFICATION_MAJOR_REVISION, EFI_SPECIFICATION_MINOR_REVISION) // // Declare forward referenced data structures // INTERFACE_DECL(_EFI_SYSTEM_TABLE); // // EFI Memory // typedef EFI_STATUS (EFIAPI *EFI_ALLOCATE_PAGES) ( IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN NoPages, OUT EFI_PHYSICAL_ADDRESS *Memory ); typedef EFI_STATUS (EFIAPI *EFI_FREE_PAGES) ( IN EFI_PHYSICAL_ADDRESS Memory, IN UINTN NoPages ); typedef EFI_STATUS (EFIAPI *EFI_GET_MEMORY_MAP) ( IN OUT UINTN *MemoryMapSize, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, OUT UINTN *MapKey, OUT UINTN *DescriptorSize, OUT UINT32 *DescriptorVersion ); #define NextMemoryDescriptor(Ptr,Size) ((EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size)) typedef EFI_STATUS (EFIAPI *EFI_ALLOCATE_POOL) ( IN EFI_MEMORY_TYPE PoolType, IN UINTN Size, OUT VOID **Buffer ); typedef EFI_STATUS (EFIAPI *EFI_FREE_POOL) ( IN VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP) ( IN UINTN MemoryMapSize, IN UINTN DescriptorSize, IN UINT32 DescriptorVersion, IN EFI_MEMORY_DESCRIPTOR *VirtualMap ); #define EFI_OPTIONAL_PTR 0x00000001 #define EFI_INTERNAL_FNC 0x00000002 // Pointer to internal runtime fnc #define EFI_INTERNAL_PTR 0x00000004 // Pointer to internal runtime data typedef EFI_STATUS (EFIAPI *EFI_CONVERT_POINTER) ( IN UINTN DebugDisposition, IN OUT VOID **Address ); // // EFI Events // #define EVT_TIMER 0x80000000 #define EVT_RUNTIME 0x40000000 #define EVT_RUNTIME_CONTEXT 0x20000000 #define EVT_NOTIFY_WAIT 0x00000100 #define EVT_NOTIFY_SIGNAL 0x00000200 #define EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201 #define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202 #define EVT_EFI_SIGNAL_MASK 0x000000FF #define EVT_EFI_SIGNAL_MAX 4 #define EFI_EVENT_TIMER EVT_TIMER #define EFI_EVENT_RUNTIME EVT_RUNTIME #define EFI_EVENT_RUNTIME_CONTEXT EVT_RUNTIME_CONTEXT #define EFI_EVENT_NOTIFY_WAIT EVT_NOTIFY_WAIT #define EFI_EVENT_NOTIFY_SIGNAL EVT_NOTIFY_SIGNAL #define EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES EVT_SIGNAL_EXIT_BOOT_SERVICES #define EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE #define EFI_EVENT_EFI_SIGNAL_MASK EVT_EFI_SIGNAL_MASK #define EFI_EVENT_EFI_SIGNAL_MAX EVT_EFI_SIGNAL_MAX typedef VOID (EFIAPI *EFI_EVENT_NOTIFY) ( IN EFI_EVENT Event, IN VOID *Context ); typedef EFI_STATUS (EFIAPI *EFI_CREATE_EVENT) ( IN UINT32 Type, IN EFI_TPL NotifyTpl, IN EFI_EVENT_NOTIFY NotifyFunction, IN VOID *NotifyContext, OUT EFI_EVENT *Event ); typedef enum { TimerCancel, TimerPeriodic, TimerRelative, TimerTypeMax } EFI_TIMER_DELAY; typedef EFI_STATUS (EFIAPI *EFI_SET_TIMER) ( IN EFI_EVENT Event, IN EFI_TIMER_DELAY Type, IN UINT64 TriggerTime ); typedef EFI_STATUS (EFIAPI *EFI_SIGNAL_EVENT) ( IN EFI_EVENT Event ); typedef EFI_STATUS (EFIAPI *EFI_WAIT_FOR_EVENT) ( IN UINTN NumberOfEvents, IN EFI_EVENT *Event, OUT UINTN *Index ); typedef EFI_STATUS (EFIAPI *EFI_CLOSE_EVENT) ( IN EFI_EVENT Event ); typedef EFI_STATUS (EFIAPI *EFI_CHECK_EVENT) ( IN EFI_EVENT Event ); // // Task priority level // #define TPL_APPLICATION 4 #define TPL_CALLBACK 8 #define TPL_NOTIFY 16 #define TPL_HIGH_LEVEL 31 #define EFI_TPL_APPLICATION TPL_APPLICATION #define EFI_TPL_CALLBACK TPL_CALLBACK #define EFI_TPL_NOTIFY TPL_NOTIFY #define EFI_TPL_HIGH_LEVEL TPL_HIGH_LEVEL typedef EFI_TPL (EFIAPI *EFI_RAISE_TPL) ( IN EFI_TPL NewTpl ); typedef VOID (EFIAPI *EFI_RESTORE_TPL) ( IN EFI_TPL OldTpl ); // // EFI platform varibles // #define EFI_GLOBAL_VARIABLE \ { 0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C} } // Variable attributes #define EFI_VARIABLE_NON_VOLATILE 0x00000001 #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002 #define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004 #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x00000008 #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010 #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x00000020 #define EFI_VARIABLE_APPEND_WRITE 0x00000040 #define EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS 0x00000080 // Variable size limitation #define EFI_MAXIMUM_VARIABLE_SIZE 1024 typedef EFI_STATUS (EFIAPI *EFI_GET_VARIABLE) ( IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, OUT UINT32 *Attributes OPTIONAL, IN OUT UINTN *DataSize, OUT VOID *Data ); typedef EFI_STATUS (EFIAPI *EFI_GET_NEXT_VARIABLE_NAME) ( IN OUT UINTN *VariableNameSize, IN OUT CHAR16 *VariableName, IN OUT EFI_GUID *VendorGuid ); typedef EFI_STATUS (EFIAPI *EFI_SET_VARIABLE) ( IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid, IN UINT32 Attributes, IN UINTN DataSize, IN VOID *Data ); // // EFI Time // typedef struct { UINT32 Resolution; // 1e-6 parts per million UINT32 Accuracy; // hertz BOOLEAN SetsToZero; // Set clears sub-second time } EFI_TIME_CAPABILITIES; typedef EFI_STATUS (EFIAPI *EFI_GET_TIME) ( OUT EFI_TIME *Time, OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_SET_TIME) ( IN EFI_TIME *Time ); typedef EFI_STATUS (EFIAPI *EFI_GET_WAKEUP_TIME) ( OUT BOOLEAN *Enabled, OUT BOOLEAN *Pending, OUT EFI_TIME *Time ); typedef EFI_STATUS (EFIAPI *EFI_SET_WAKEUP_TIME) ( IN BOOLEAN Enable, IN EFI_TIME *Time OPTIONAL ); // // Image functions // // PE32+ Subsystem type for EFI images #if !defined(IMAGE_SUBSYSTEM_EFI_APPLICATION) #define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 #endif // PE32+ Machine type for EFI images #if !defined(EFI_IMAGE_MACHINE_IA32) #define EFI_IMAGE_MACHINE_IA32 0x014c #endif #if !defined(EFI_IMAGE_MACHINE_IA64) #define EFI_IMAGE_MACHINE_IA64 0x0200 #endif #if !defined(EFI_IMAGE_MACHINE_EBC) #define EFI_IMAGE_MACHINE_EBC 0x0EBC #endif #if !defined(EFI_IMAGE_MACHINE_X64) #define EFI_IMAGE_MACHINE_X64 0x8664 #endif #if !defined(EFI_IMAGE_MACHINE_ARMTHUMB_MIXED) #define EFI_IMAGE_MACHINE_ARMTHUMB_MIXED 0x01C2 #endif #if !defined(EFI_IMAGE_MACHINE_AARCH64) #define EFI_IMAGE_MACHINE_AARCH64 0xAA64 #endif #if !defined(EFI_IMAGE_MACHINE_RISCV32) #define EFI_IMAGE_MACHINE_RISCV32 0x5032 #endif #if !defined(EFI_IMAGE_MACHINE_RISCV64) #define EFI_IMAGE_MACHINE_RISCV64 0x5064 #endif #if !defined(EFI_IMAGE_MACHINE_RISCV128) #define EFI_IMAGE_MACHINE_RISCV128 0x5128 #endif #if !defined(EFI_IMAGE_MACHINE_LOONGARCH32) #define EFI_IMAGE_MACHINE_LOONGARCH32 0x6232 #endif #if !defined(EFI_IMAGE_MACHINE_LOONGARCH64) #define EFI_IMAGE_MACHINE_LOONGARCH64 0x6264 #endif // Image Entry prototype typedef EFI_STATUS (EFIAPI *EFI_IMAGE_ENTRY_POINT) ( IN EFI_HANDLE ImageHandle, IN struct _EFI_SYSTEM_TABLE *SystemTable ); typedef EFI_STATUS (EFIAPI *EFI_IMAGE_LOAD) ( IN BOOLEAN BootPolicy, IN EFI_HANDLE ParentImageHandle, IN EFI_DEVICE_PATH *FilePath, IN VOID *SourceBuffer OPTIONAL, IN UINTN SourceSize, OUT EFI_HANDLE *ImageHandle ); typedef EFI_STATUS (EFIAPI *EFI_IMAGE_START) ( IN EFI_HANDLE ImageHandle, OUT UINTN *ExitDataSize, OUT CHAR16 **ExitData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_EXIT) ( IN EFI_HANDLE ImageHandle, IN EFI_STATUS ExitStatus, IN UINTN ExitDataSize, IN CHAR16 *ExitData OPTIONAL ); // Image handle /*#define LOADED_IMAGE_PROTOCOL \ { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} } #define EFI_IMAGE_INFORMATION_REVISION 0x1000 typedef struct { UINT32 Revision; EFI_HANDLE ParentHandle; struct _EFI_SYSTEM_TABLE *SystemTable; // Source location of image EFI_HANDLE DeviceHandle; EFI_DEVICE_PATH *FilePath; VOID *Reserved; // Images load options UINT32 LoadOptionsSize; VOID *LoadOptions; // Location of where image was loaded VOID *ImageBase; UINT64 ImageSize; EFI_MEMORY_TYPE ImageCodeType; EFI_MEMORY_TYPE ImageDataType; // If the driver image supports a dynamic unload request EFI_IMAGE_UNLOAD Unload; } EFI_LOADED_IMAGE;*/ typedef EFI_STATUS (EFIAPI *EFI_EXIT_BOOT_SERVICES) ( IN EFI_HANDLE ImageHandle, IN UINTN MapKey ); // // Misc // typedef EFI_STATUS (EFIAPI *EFI_STALL) ( IN UINTN Microseconds ); typedef EFI_STATUS (EFIAPI *EFI_SET_WATCHDOG_TIMER) ( IN UINTN Timeout, IN UINT64 WatchdogCode, IN UINTN DataSize, IN CHAR16 *WatchdogData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_CONNECT_CONTROLLER) ( IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE *DriverImageHandle OPTIONAL, IN EFI_DEVICE_PATH *RemainingDevicePath OPTIONAL, IN BOOLEAN Recursive ); typedef EFI_STATUS (EFIAPI *EFI_DISCONNECT_CONTROLLER) ( IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE DriverImageHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL ); #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001 #define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002 #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004 #define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008 #define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010 #define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020 typedef EFI_STATUS (EFIAPI *EFI_OPEN_PROTOCOL) ( IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, OUT VOID **Interface OPTIONAL, IN EFI_HANDLE AgentHandle, IN EFI_HANDLE ControllerHandle, IN UINT32 Attributes ); typedef EFI_STATUS (EFIAPI *EFI_CLOSE_PROTOCOL) ( IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, IN EFI_HANDLE AgentHandle, IN EFI_HANDLE ControllerHandle ); typedef struct { EFI_HANDLE AgentHandle; EFI_HANDLE ControllerHandle; UINT32 Attributes; UINT32 OpenCount; } EFI_OPEN_PROTOCOL_INFORMATION_ENTRY; typedef EFI_STATUS (EFIAPI *EFI_OPEN_PROTOCOL_INFORMATION) ( IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, OUT EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer, OUT UINTN *EntryCount ); typedef EFI_STATUS (EFIAPI *EFI_PROTOCOLS_PER_HANDLE) ( IN EFI_HANDLE Handle, OUT EFI_GUID ***ProtocolBuffer, OUT UINTN *ProtocolBufferCount ); typedef enum { AllHandles, ByRegisterNotify, ByProtocol } EFI_LOCATE_SEARCH_TYPE; typedef EFI_STATUS (EFIAPI *EFI_LOCATE_HANDLE_BUFFER) ( IN EFI_LOCATE_SEARCH_TYPE SearchType, IN EFI_GUID *Protocol OPTIONAL, IN VOID *SearchKey OPTIONAL, IN OUT UINTN *NoHandles, OUT EFI_HANDLE **Buffer ); typedef EFI_STATUS (EFIAPI *EFI_LOCATE_PROTOCOL) ( IN EFI_GUID *Protocol, IN VOID *Registration OPTIONAL, OUT VOID **Interface ); typedef EFI_STATUS (EFIAPI *EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) ( IN OUT EFI_HANDLE *Handle, ... ); typedef EFI_STATUS (EFIAPI *EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) ( IN OUT EFI_HANDLE Handle, ... ); typedef EFI_STATUS (EFIAPI *EFI_CALCULATE_CRC32) ( IN VOID *Data, IN UINTN DataSize, OUT UINT32 *Crc32 ); typedef VOID (EFIAPI *EFI_COPY_MEM) ( IN VOID *Destination, IN VOID *Source, IN UINTN Length ); typedef VOID (EFIAPI *EFI_SET_MEM) ( IN VOID *Buffer, IN UINTN Size, IN UINT8 Value ); typedef EFI_STATUS (EFIAPI *EFI_CREATE_EVENT_EX) ( IN UINT32 Type, IN EFI_TPL NotifyTpl, IN EFI_EVENT_NOTIFY NotifyFunction OPTIONAL, IN const VOID *NotifyContext OPTIONAL, IN const EFI_GUID *EventGroup OPTIONAL, OUT EFI_EVENT *Event ); typedef enum { EfiResetCold, EfiResetWarm, EfiResetShutdown } EFI_RESET_TYPE; typedef EFI_STATUS (EFIAPI *EFI_RESET_SYSTEM) ( IN EFI_RESET_TYPE ResetType, IN EFI_STATUS ResetStatus, IN UINTN DataSize, IN CHAR16 *ResetData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT) ( OUT UINT64 *Count ); typedef EFI_STATUS (EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT) ( OUT UINT32 *HighCount ); typedef struct { UINT64 Length; union { EFI_PHYSICAL_ADDRESS DataBlock; EFI_PHYSICAL_ADDRESS ContinuationPointer; } Union; } EFI_CAPSULE_BLOCK_DESCRIPTOR; typedef struct { EFI_GUID CapsuleGuid; UINT32 HeaderSize; UINT32 Flags; UINT32 CapsuleImageSize; } EFI_CAPSULE_HEADER; #define CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000 #define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000 #define CAPSULE_FLAGS_INITIATE_RESET 0x00040000 typedef EFI_STATUS (EFIAPI *EFI_UPDATE_CAPSULE) ( IN EFI_CAPSULE_HEADER **CapsuleHeaderArray, IN UINTN CapsuleCount, IN EFI_PHYSICAL_ADDRESS ScatterGatherList OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_QUERY_CAPSULE_CAPABILITIES) ( IN EFI_CAPSULE_HEADER **CapsuleHeaderArray, IN UINTN CapsuleCount, OUT UINT64 *MaximumCapsuleSize, OUT EFI_RESET_TYPE *ResetType ); typedef EFI_STATUS (EFIAPI *EFI_QUERY_VARIABLE_INFO) ( IN UINT32 Attributes, OUT UINT64 *MaximumVariableStorageSize, OUT UINT64 *RemainingVariableStorageSize, OUT UINT64 *MaximumVariableSize ); // // Protocol handler functions // typedef enum { EFI_NATIVE_INTERFACE, EFI_PCODE_INTERFACE } EFI_INTERFACE_TYPE; typedef EFI_STATUS (EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE) ( IN OUT EFI_HANDLE *Handle, IN EFI_GUID *Protocol, IN EFI_INTERFACE_TYPE InterfaceType, IN VOID *Interface ); typedef EFI_STATUS (EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE) ( IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, IN VOID *OldInterface, IN VOID *NewInterface ); typedef EFI_STATUS (EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE) ( IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, IN VOID *Interface ); typedef EFI_STATUS (EFIAPI *EFI_HANDLE_PROTOCOL) ( IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, OUT VOID **Interface ); typedef EFI_STATUS (EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) ( IN EFI_GUID *Protocol, IN EFI_EVENT Event, OUT VOID **Registration ); typedef EFI_STATUS (EFIAPI *EFI_LOCATE_HANDLE) ( IN EFI_LOCATE_SEARCH_TYPE SearchType, IN EFI_GUID *Protocol OPTIONAL, IN VOID *SearchKey OPTIONAL, IN OUT UINTN *BufferSize, OUT EFI_HANDLE *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_LOCATE_DEVICE_PATH) ( IN EFI_GUID *Protocol, IN OUT EFI_DEVICE_PATH **DevicePath, OUT EFI_HANDLE *Device ); typedef EFI_STATUS (EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE) ( IN EFI_GUID *Guid, IN VOID *Table ); typedef EFI_STATUS (EFIAPI *EFI_RESERVED_SERVICE) ( ); // // Standard EFI table header // typedef struct _EFI_TABLE_HEADER { UINT64 Signature; UINT32 Revision; UINT32 HeaderSize; UINT32 CRC32; UINT32 Reserved; } EFI_TABLE_HEADER; // // EFI Runtime Serivces Table // #define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552 #define EFI_1_02_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(1, 02) #define EFI_1_10_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(1, 10) #define EFI_2_00_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 00) #define EFI_2_10_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 10) #define EFI_2_20_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 20) #define EFI_2_30_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 30) #define EFI_2_31_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 31) #define EFI_2_40_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 40) #define EFI_2_50_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 50) #define EFI_2_60_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 60) #define EFI_2_70_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 70) #define EFI_2_80_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 80) #define EFI_2_90_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 90) #define EFI_2_100_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 100) #define EFI_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_VERSION typedef struct { EFI_TABLE_HEADER Hdr; // // Time services // EFI_GET_TIME GetTime; EFI_SET_TIME SetTime; EFI_GET_WAKEUP_TIME GetWakeupTime; EFI_SET_WAKEUP_TIME SetWakeupTime; // // Virtual memory services // EFI_SET_VIRTUAL_ADDRESS_MAP SetVirtualAddressMap; EFI_CONVERT_POINTER ConvertPointer; // // Variable serviers // EFI_GET_VARIABLE GetVariable; EFI_GET_NEXT_VARIABLE_NAME GetNextVariableName; EFI_SET_VARIABLE SetVariable; // // Misc // EFI_GET_NEXT_HIGH_MONO_COUNT GetNextHighMonotonicCount; EFI_RESET_SYSTEM ResetSystem; EFI_UPDATE_CAPSULE UpdateCapsule; EFI_QUERY_CAPSULE_CAPABILITIES QueryCapsuleCapabilities; EFI_QUERY_VARIABLE_INFO QueryVariableInfo; } EFI_RUNTIME_SERVICES; // // EFI Boot Services Table // #define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42 #define EFI_1_02_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(1, 02) #define EFI_1_10_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(1, 10) #define EFI_2_00_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 00) #define EFI_2_10_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 10) #define EFI_2_20_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 20) #define EFI_2_30_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 30) #define EFI_2_31_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 31) #define EFI_2_40_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 40) #define EFI_2_50_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 50) #define EFI_2_60_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 60) #define EFI_2_70_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 70) #define EFI_2_80_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 80) #define EFI_2_90_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 90) #define EFI_2_100_BOOT_SERVICES_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 100) #define EFI_BOOT_SERVICES_REVISION EFI_SPECIFICATION_VERSION typedef struct _EFI_BOOT_SERVICES { EFI_TABLE_HEADER Hdr; // // Task priority functions // EFI_RAISE_TPL RaiseTPL; EFI_RESTORE_TPL RestoreTPL; // // Memory functions // EFI_ALLOCATE_PAGES AllocatePages; EFI_FREE_PAGES FreePages; EFI_GET_MEMORY_MAP GetMemoryMap; EFI_ALLOCATE_POOL AllocatePool; EFI_FREE_POOL FreePool; // // Event & timer functions // EFI_CREATE_EVENT CreateEvent; EFI_SET_TIMER SetTimer; EFI_WAIT_FOR_EVENT WaitForEvent; EFI_SIGNAL_EVENT SignalEvent; EFI_CLOSE_EVENT CloseEvent; EFI_CHECK_EVENT CheckEvent; // // Protocol handler functions // EFI_INSTALL_PROTOCOL_INTERFACE InstallProtocolInterface; EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface; EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface; EFI_HANDLE_PROTOCOL HandleProtocol; EFI_HANDLE_PROTOCOL PCHandleProtocol; EFI_REGISTER_PROTOCOL_NOTIFY RegisterProtocolNotify; EFI_LOCATE_HANDLE LocateHandle; EFI_LOCATE_DEVICE_PATH LocateDevicePath; EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable; // // Image functions // EFI_IMAGE_LOAD LoadImage; EFI_IMAGE_START StartImage; EFI_EXIT Exit; EFI_IMAGE_UNLOAD UnloadImage; EFI_EXIT_BOOT_SERVICES ExitBootServices; // // Misc functions // EFI_GET_NEXT_MONOTONIC_COUNT GetNextMonotonicCount; EFI_STALL Stall; EFI_SET_WATCHDOG_TIMER SetWatchdogTimer; // // DriverSupport Services // EFI_CONNECT_CONTROLLER ConnectController; EFI_DISCONNECT_CONTROLLER DisconnectController; // // Open and Close Protocol Services // EFI_OPEN_PROTOCOL OpenProtocol; EFI_CLOSE_PROTOCOL CloseProtocol; EFI_OPEN_PROTOCOL_INFORMATION OpenProtocolInformation; // // Library Services // EFI_PROTOCOLS_PER_HANDLE ProtocolsPerHandle; EFI_LOCATE_HANDLE_BUFFER LocateHandleBuffer; EFI_LOCATE_PROTOCOL LocateProtocol; EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces; EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces; // // 32-bit CRC Services // EFI_CALCULATE_CRC32 CalculateCrc32; // // Misc Services // EFI_COPY_MEM CopyMem; EFI_SET_MEM SetMem; EFI_CREATE_EVENT_EX CreateEventEx; } EFI_BOOT_SERVICES; // // EFI Configuration Table and GUID definitions // #define MPS_TABLE_GUID \ { 0xeb9d2d2f, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } #define ACPI_TABLE_GUID \ { 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } #define ACPI_20_TABLE_GUID \ { 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} } #define SMBIOS_TABLE_GUID \ { 0xeb9d2d31, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } #define SMBIOS3_TABLE_GUID \ { 0xf2fd1544, 0x9794, 0x4a2c, {0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94} } #define SAL_SYSTEM_TABLE_GUID \ { 0xeb9d2d32, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } #define EFI_DTB_TABLE_GUID \ { 0xb1b621d5, 0xf19c, 0x41a5, {0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0} } typedef struct _EFI_CONFIGURATION_TABLE { EFI_GUID VendorGuid; VOID *VendorTable; } EFI_CONFIGURATION_TABLE; // // EFI System Table // #define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 #define EFI_1_02_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(1, 02) #define EFI_1_10_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(1, 10) #define EFI_2_00_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 00) #define EFI_2_10_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 10) #define EFI_2_20_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 20) #define EFI_2_30_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 30) #define EFI_2_31_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 31) #define EFI_2_40_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 40) #define EFI_2_50_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 50) #define EFI_2_60_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 60) #define EFI_2_70_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 70) #define EFI_2_80_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 80) #define EFI_2_90_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 90) #define EFI_2_100_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_REVISION_MAJORMINOR(2, 100) #define EFI_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_VERSION typedef struct _EFI_SYSTEM_TABLE { EFI_TABLE_HEADER Hdr; CHAR16 *FirmwareVendor; UINT32 FirmwareRevision; EFI_HANDLE ConsoleInHandle; SIMPLE_INPUT_INTERFACE *ConIn; EFI_HANDLE ConsoleOutHandle; SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut; EFI_HANDLE StandardErrorHandle; SIMPLE_TEXT_OUTPUT_INTERFACE *StdErr; EFI_RUNTIME_SERVICES *RuntimeServices; EFI_BOOT_SERVICES *BootServices; UINTN NumberOfTableEntries; EFI_CONFIGURATION_TABLE *ConfigurationTable; } EFI_SYSTEM_TABLE; #endif ncroxon-gnu-efi-157d47c/inc/eficompiler.h000066400000000000000000000026611471215650600203240ustar00rootroot00000000000000/*++ Copyright (c) 2016-2024 Pete Batard Module Name: eficompiler.h Abstract: Compiler specific adjustments --*/ #if defined(__GNUC__) #define EFI_UNUSED __attribute__((__unused__)) #else #define EFI_UNUSED #endif #if defined(__clang__) #define EFI_NO_TAIL_CALL __attribute__((disable_tail_calls)) #elif defined(__GNUC__) #define EFI_NO_TAIL_CALL __attribute__((optimize("no-optimize-sibling-calls"))) #else #define EFI_NO_TAIL_CALL #endif #if defined(__clang__) #define EFI_OPTNONE __attribute__((optnone)) #elif defined(__GNUC__) #define EFI_OPTNONE __attribute__((__optimize__("0"))) #else #define EFI_OPTNONE #endif #if defined(__GNUC__) #define EFI_ALIGN(x) __attribute__((__aligned__(x))) #elif defined(_MSC_VER) #define EFI_ALIGN(x) __declspec(align(x)) #else // Not being able to align is likely to break executables, so report it #error "No alignement directive is defined for this platform" #endif #if !defined(ALIGN) #define ALIGN(x) EFI_ALIGN(x) #endif #if defined(__GNUC__) #define EFI_NORETURN __attribute__((noreturn)) #elif defined(_MSC_VER) #define EFI_NORETURN __declspec(noreturn) #else #define EFI_NORETURN #endif #if defined(__GNUC__) #define EFI_NOINLINE __attribute__((noinline)) #elif defined(_MSC_VER) #define EFI_NOINLINE __declspec(noinline) #else #define EFI_NOINLINE #endif /* Also add a catch-all on __attribute__() for MS compilers */ #if defined(_MSC_VER) #define __attribute__(x) #endif ncroxon-gnu-efi-157d47c/inc/eficon.h000066400000000000000000000222461471215650600172720ustar00rootroot00000000000000#ifndef _EFI_CON_H #define _EFI_CON_H /*++ Copyright (c) 1998 Intel Corporation Module Name: eficon.h Abstract: EFI console protocols Revision History --*/ // // Text output protocol // #define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \ { 0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define SIMPLE_TEXT_OUTPUT_PROTOCOL EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID INTERFACE_DECL(_SIMPLE_TEXT_OUTPUT_INTERFACE); typedef EFI_STATUS (EFIAPI *EFI_TEXT_RESET) ( IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, IN BOOLEAN ExtendedVerification ); typedef EFI_STATUS (EFIAPI *EFI_TEXT_OUTPUT_STRING) ( IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, IN CHAR16 *String ); typedef EFI_STATUS (EFIAPI *EFI_TEXT_TEST_STRING) ( IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, IN CHAR16 *String ); typedef EFI_STATUS (EFIAPI *EFI_TEXT_QUERY_MODE) ( IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, IN UINTN ModeNumber, OUT UINTN *Columns, OUT UINTN *Rows ); typedef EFI_STATUS (EFIAPI *EFI_TEXT_SET_MODE) ( IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, IN UINTN ModeNumber ); typedef EFI_STATUS (EFIAPI *EFI_TEXT_SET_ATTRIBUTE) ( IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, IN UINTN Attribute ); #define EFI_BLACK 0x00 #define EFI_BLUE 0x01 #define EFI_GREEN 0x02 #define EFI_CYAN (EFI_BLUE | EFI_GREEN) #define EFI_RED 0x04 #define EFI_MAGENTA (EFI_BLUE | EFI_RED) #define EFI_BROWN (EFI_GREEN | EFI_RED) #define EFI_LIGHTGRAY (EFI_BLUE | EFI_GREEN | EFI_RED) #define EFI_BRIGHT 0x08 #define EFI_DARKGRAY (EFI_BRIGHT) #define EFI_LIGHTBLUE (EFI_BLUE | EFI_BRIGHT) #define EFI_LIGHTGREEN (EFI_GREEN | EFI_BRIGHT) #define EFI_LIGHTCYAN (EFI_CYAN | EFI_BRIGHT) #define EFI_LIGHTRED (EFI_RED | EFI_BRIGHT) #define EFI_LIGHTMAGENTA (EFI_MAGENTA | EFI_BRIGHT) #define EFI_YELLOW (EFI_BROWN | EFI_BRIGHT) #define EFI_WHITE (EFI_BLUE | EFI_GREEN | EFI_RED | EFI_BRIGHT) #define EFI_TEXT_ATTR(f,b) ((f) | ((b) << 4)) #define EFI_BACKGROUND_BLACK 0x00 #define EFI_BACKGROUND_BLUE 0x10 #define EFI_BACKGROUND_GREEN 0x20 #define EFI_BACKGROUND_CYAN (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN) #define EFI_BACKGROUND_RED 0x40 #define EFI_BACKGROUND_MAGENTA (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_RED) #define EFI_BACKGROUND_BROWN (EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED) #define EFI_BACKGROUND_LIGHTGRAY (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED) typedef EFI_STATUS (EFIAPI *EFI_TEXT_CLEAR_SCREEN) ( IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This ); typedef EFI_STATUS (EFIAPI *EFI_TEXT_SET_CURSOR_POSITION) ( IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, IN UINTN Column, IN UINTN Row ); typedef EFI_STATUS (EFIAPI *EFI_TEXT_ENABLE_CURSOR) ( IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, IN BOOLEAN Enable ); typedef struct { INT32 MaxMode; // current settings INT32 Mode; INT32 Attribute; INT32 CursorColumn; INT32 CursorRow; BOOLEAN CursorVisible; } SIMPLE_TEXT_OUTPUT_MODE; typedef struct _SIMPLE_TEXT_OUTPUT_INTERFACE { EFI_TEXT_RESET Reset; EFI_TEXT_OUTPUT_STRING OutputString; EFI_TEXT_TEST_STRING TestString; EFI_TEXT_QUERY_MODE QueryMode; EFI_TEXT_SET_MODE SetMode; EFI_TEXT_SET_ATTRIBUTE SetAttribute; EFI_TEXT_CLEAR_SCREEN ClearScreen; EFI_TEXT_SET_CURSOR_POSITION SetCursorPosition; EFI_TEXT_ENABLE_CURSOR EnableCursor; // Current mode SIMPLE_TEXT_OUTPUT_MODE *Mode; } SIMPLE_TEXT_OUTPUT_INTERFACE, EFI_SIMPLE_TEXT_OUT_PROTOCOL; // // Define's for required EFI Unicode Box Draw character // #define BOXDRAW_HORIZONTAL 0x2500 #define BOXDRAW_VERTICAL 0x2502 #define BOXDRAW_DOWN_RIGHT 0x250c #define BOXDRAW_DOWN_LEFT 0x2510 #define BOXDRAW_UP_RIGHT 0x2514 #define BOXDRAW_UP_LEFT 0x2518 #define BOXDRAW_VERTICAL_RIGHT 0x251c #define BOXDRAW_VERTICAL_LEFT 0x2524 #define BOXDRAW_DOWN_HORIZONTAL 0x252c #define BOXDRAW_UP_HORIZONTAL 0x2534 #define BOXDRAW_VERTICAL_HORIZONTAL 0x253c #define BOXDRAW_DOUBLE_HORIZONTAL 0x2550 #define BOXDRAW_DOUBLE_VERTICAL 0x2551 #define BOXDRAW_DOWN_RIGHT_DOUBLE 0x2552 #define BOXDRAW_DOWN_DOUBLE_RIGHT 0x2553 #define BOXDRAW_DOUBLE_DOWN_RIGHT 0x2554 #define BOXDRAW_DOWN_LEFT_DOUBLE 0x2555 #define BOXDRAW_DOWN_DOUBLE_LEFT 0x2556 #define BOXDRAW_DOUBLE_DOWN_LEFT 0x2557 #define BOXDRAW_UP_RIGHT_DOUBLE 0x2558 #define BOXDRAW_UP_DOUBLE_RIGHT 0x2559 #define BOXDRAW_DOUBLE_UP_RIGHT 0x255a #define BOXDRAW_UP_LEFT_DOUBLE 0x255b #define BOXDRAW_UP_DOUBLE_LEFT 0x255c #define BOXDRAW_DOUBLE_UP_LEFT 0x255d #define BOXDRAW_VERTICAL_RIGHT_DOUBLE 0x255e #define BOXDRAW_VERTICAL_DOUBLE_RIGHT 0x255f #define BOXDRAW_DOUBLE_VERTICAL_RIGHT 0x2560 #define BOXDRAW_VERTICAL_LEFT_DOUBLE 0x2561 #define BOXDRAW_VERTICAL_DOUBLE_LEFT 0x2562 #define BOXDRAW_DOUBLE_VERTICAL_LEFT 0x2563 #define BOXDRAW_DOWN_HORIZONTAL_DOUBLE 0x2564 #define BOXDRAW_DOWN_DOUBLE_HORIZONTAL 0x2565 #define BOXDRAW_DOUBLE_DOWN_HORIZONTAL 0x2566 #define BOXDRAW_UP_HORIZONTAL_DOUBLE 0x2567 #define BOXDRAW_UP_DOUBLE_HORIZONTAL 0x2568 #define BOXDRAW_DOUBLE_UP_HORIZONTAL 0x2569 #define BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE 0x256a #define BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL 0x256b #define BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL 0x256c // // EFI Required Block Elements Code Chart // #define BLOCKELEMENT_FULL_BLOCK 0x2588 #define BLOCKELEMENT_LIGHT_SHADE 0x2591 // // EFI Required Geometric Shapes Code Chart // #define GEOMETRICSHAPE_UP_TRIANGLE 0x25b2 #define GEOMETRICSHAPE_RIGHT_TRIANGLE 0x25ba #define GEOMETRICSHAPE_DOWN_TRIANGLE 0x25bc #define GEOMETRICSHAPE_LEFT_TRIANGLE 0x25c4 // // EFI Required Arrow shapes // #define ARROW_UP 0x2191 #define ARROW_DOWN 0x2193 // // Text input protocol // #define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \ { 0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define SIMPLE_TEXT_INPUT_PROTOCOL EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID INTERFACE_DECL(_SIMPLE_INPUT_INTERFACE); typedef struct { UINT16 ScanCode; CHAR16 UnicodeChar; } EFI_INPUT_KEY; // // Baseline unicode control chars // #define CHAR_NULL 0x0000 #define CHAR_BACKSPACE 0x0008 #define CHAR_TAB 0x0009 #define CHAR_LINEFEED 0x000A #define CHAR_CARRIAGE_RETURN 0x000D // // Scan codes for base line keys // #define SCAN_NULL 0x0000 #define SCAN_UP 0x0001 #define SCAN_DOWN 0x0002 #define SCAN_RIGHT 0x0003 #define SCAN_LEFT 0x0004 #define SCAN_HOME 0x0005 #define SCAN_END 0x0006 #define SCAN_INSERT 0x0007 #define SCAN_DELETE 0x0008 #define SCAN_PAGE_UP 0x0009 #define SCAN_PAGE_DOWN 0x000A #define SCAN_F1 0x000B #define SCAN_F2 0x000C #define SCAN_F3 0x000D #define SCAN_F4 0x000E #define SCAN_F5 0x000F #define SCAN_F6 0x0010 #define SCAN_F7 0x0011 #define SCAN_F8 0x0012 #define SCAN_F9 0x0013 #define SCAN_F10 0x0014 #define SCAN_F11 0x0015 #define SCAN_F12 0x0016 #define SCAN_ESC 0x0017 typedef EFI_STATUS (EFIAPI *EFI_INPUT_RESET) ( IN struct _SIMPLE_INPUT_INTERFACE *This, IN BOOLEAN ExtendedVerification ); typedef EFI_STATUS (EFIAPI *EFI_INPUT_READ_KEY) ( IN struct _SIMPLE_INPUT_INTERFACE *This, OUT EFI_INPUT_KEY *Key ); typedef struct _SIMPLE_INPUT_INTERFACE { EFI_INPUT_RESET Reset; EFI_INPUT_READ_KEY ReadKeyStroke; EFI_EVENT WaitForKey; } SIMPLE_INPUT_INTERFACE, EFI_SIMPLE_TEXT_IN_PROTOCOL; #endif ncroxon-gnu-efi-157d47c/inc/eficonex.h000066400000000000000000000066331471215650600176310ustar00rootroot00000000000000#ifndef _EFI_CONEX_H #define _EFI_CONEX_H /*++ Copyright (c) 2020 Kagurazaka Kotori Module Name: eficonex.h Abstract: EFI console extension protocols --*/ // // Simple Text Input Ex Protocol // #define EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID \ { 0xdd9e7534, 0x7762, 0x4698, {0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa} } INTERFACE_DECL(_EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL); typedef UINT8 EFI_KEY_TOGGLE_STATE; typedef struct EFI_KEY_STATE { UINT32 KeyShiftState; EFI_KEY_TOGGLE_STATE KeyToggleState; } EFI_KEY_STATE; typedef struct { EFI_INPUT_KEY Key; EFI_KEY_STATE KeyState; } EFI_KEY_DATA; // Shift states #define EFI_SHIFT_STATE_VALID 0x80000000 #define EFI_RIGHT_SHIFT_PRESSED 0x00000001 #define EFI_LEFT_SHIFT_PRESSED 0x00000002 #define EFI_RIGHT_CONTROL_PRESSED 0x00000004 #define EFI_LEFT_CONTROL_PRESSED 0x00000008 #define EFI_RIGHT_ALT_PRESSED 0x00000010 #define EFI_LEFT_ALT_PRESSED 0x00000020 #define EFI_RIGHT_LOGO_PRESSED 0x00000040 #define EFI_LEFT_LOGO_PRESSED 0x00000080 #define EFI_MENU_KEY_PRESSED 0x00000100 #define EFI_SYS_REQ_PRESSED 0x00000200 // Toggle states #define EFI_TOGGLE_STATE_VALID 0x80 #define EFI_KEY_STATE_EXPOSED 0x40 #define EFI_SCROLL_LOCK_ACTIVE 0x01 #define EFI_NUM_LOCK_ACTIVE 0x02 #define EFI_CAPS_LOCK_ACTIVE 0x04 typedef EFI_STATUS (EFIAPI *EFI_INPUT_RESET_EX) ( IN struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); typedef EFI_STATUS (EFIAPI *EFI_INPUT_READ_KEY_EX) ( IN struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, OUT EFI_KEY_DATA *KeyData ); typedef EFI_STATUS (EFIAPI *EFI_SET_STATE) ( IN struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_KEY_TOGGLE_STATE *KeyToggleState ); typedef EFI_STATUS (EFIAPI *EFI_KEY_NOTIFY_FUNCTION) ( IN EFI_KEY_DATA *KeyData ); typedef EFI_STATUS (EFIAPI *EFI_REGISTER_KEYSTROKE_NOTIFY) ( IN struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_KEY_DATA *KeyData, IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction, OUT VOID **NotifyHandle ); typedef EFI_STATUS (EFIAPI *EFI_UNREGISTER_KEYSTROKE_NOTIFY) ( IN struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN VOID *NotificationHandle ); typedef struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL{ EFI_INPUT_RESET_EX Reset; EFI_INPUT_READ_KEY_EX ReadKeyStrokeEx; EFI_EVENT WaitForKeyEx; EFI_SET_STATE SetState; EFI_REGISTER_KEYSTROKE_NOTIFY RegisterKeyNotify; EFI_UNREGISTER_KEYSTROKE_NOTIFY UnregisterKeyNotify; } EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL; #endif ncroxon-gnu-efi-157d47c/inc/efidebug.h000066400000000000000000000405141471215650600175770ustar00rootroot00000000000000#ifndef _EFI_DEBUG_H #define _EFI_DEBUG_H /*++ Copyright (c) 1998 Intel Corporation Module Name: efidebug.h Abstract: EFI library debug functions Revision History --*/ extern UINTN EFIDebug; #if EFI_DEBUG #define DBGASSERT(a) DbgAssert(__FILE__, __LINE__, #a) #define DEBUG(a) DbgPrint a #else #define DBGASSERT(a) #define DEBUG(a) #endif #if EFI_DEBUG_CLEAR_MEMORY #define DBGSETMEM(a,l) SetMem(a,l,(CHAR8)BAD_POINTER) #else #define DBGSETMEM(a,l) #endif #define D_INIT 0x00000001 // Initialization style messages #define D_WARN 0x00000002 // Warnings #define D_LOAD 0x00000004 // Load events #define D_FS 0x00000008 // EFI File system #define D_POOL 0x00000010 // Alloc & Free's #define D_PAGE 0x00000020 // Alloc & Free's #define D_INFO 0x00000040 // Verbose #define D_VAR 0x00000100 // Variable #define D_PARSE 0x00000200 // Command parsing #define D_BM 0x00000400 // Boot manager #define D_BLKIO 0x00001000 // BlkIo Driver #define D_BLKIO_ULTRA 0x00002000 // BlkIo Driver #define D_NET 0x00004000 // SNI Driver #define D_NET_ULTRA 0x00008000 // SNI Driver #define D_TXTIN 0x00010000 // Simple Input Driver #define D_TXTOUT 0x00020000 // Simple Text Output Driver #define D_ERROR_ATA 0x00040000 // ATA error messages #define D_ERROR 0x80000000 // Error #define D_RESERVED 0x7fffC880 // Bits not reserved above // // Current Debug level of the system, value of EFIDebug // //#define EFI_DBUG_MASK (D_ERROR | D_WARN | D_LOAD | D_BLKIO | D_INIT) #define EFI_DBUG_MASK (D_ERROR) // // // #if EFI_DEBUG #define ASSERT(a) if(!(a)) DBGASSERT(a) #define ASSERT_LOCKED(l) if(!(l)->Lock) DBGASSERT(l not locked) #define ASSERT_STRUCT(p,t) DBGASSERT(t not structure), p #else #define ASSERT(a) #define ASSERT_LOCKED(l) #define ASSERT_STRUCT(p,t) #endif // // Prototypes // INTN DbgAssert ( CONST CHAR8 *file, INTN lineno, CONST CHAR8 *string ); INTN DbgPrint ( INTN mask, CONST CHAR8 *format, ... ); // // Instruction Set Architectures definitions for debuggers // typedef INTN EFI_EXCEPTION_TYPE; // IA32 #define EXCEPT_IA32_DIVIDE_ERROR 0 #define EXCEPT_IA32_DEBUG 1 #define EXCEPT_IA32_NMI 2 #define EXCEPT_IA32_BREAKPOINT 3 #define EXCEPT_IA32_OVERFLOW 4 #define EXCEPT_IA32_BOUND 5 #define EXCEPT_IA32_INVALID_OPCODE 6 #define EXCEPT_IA32_DOUBLE_FAULT 8 #define EXCEPT_IA32_INVALID_TSS 10 #define EXCEPT_IA32_SEG_NOT_PRESENT 11 #define EXCEPT_IA32_STACK_FAULT 12 #define EXCEPT_IA32_GP_FAULT 13 #define EXCEPT_IA32_PAGE_FAULT 14 #define EXCEPT_IA32_FP_ERROR 16 #define EXCEPT_IA32_ALIGNMENT_CHECK 17 #define EXCEPT_IA32_MACHINE_CHECK 18 #define EXCEPT_IA32_SIMD 19 typedef struct { UINT16 Fcw; UINT16 Fsw; UINT16 Ftw; UINT16 Opcode; UINT32 Eip; UINT16 Cs; UINT16 Reserved1; UINT32 DataOffset; UINT16 Ds; UINT8 Reserved2[10]; UINT8 St0Mm0[10], Reserved3[6]; UINT8 St1Mm1[10], Reserved4[6]; UINT8 St2Mm2[10], Reserved5[6]; UINT8 St3Mm3[10], Reserved6[6]; UINT8 St4Mm4[10], Reserved7[6]; UINT8 St5Mm5[10], Reserved8[6]; UINT8 St6Mm6[10], Reserved9[6]; UINT8 St7Mm7[10], Reserved10[6]; UINT8 Xmm0[16]; UINT8 Xmm1[16]; UINT8 Xmm2[16]; UINT8 Xmm3[16]; UINT8 Xmm4[16]; UINT8 Xmm5[16]; UINT8 Xmm6[16]; UINT8 Xmm7[16]; UINT8 Reserved11[14 * 16]; } EFI_FX_SAVE_STATE_IA32; typedef struct { UINT32 ExceptionData; EFI_FX_SAVE_STATE_IA32 FxSaveState; UINT32 Dr0; UINT32 Dr1; UINT32 Dr2; UINT32 Dr3; UINT32 Dr6; UINT32 Dr7; UINT32 Cr0; UINT32 Cr1; UINT32 Cr2; UINT32 Cr3; UINT32 Cr4; UINT32 Eflags; UINT32 Ldtr; UINT32 Tr; UINT32 Gdtr[2]; UINT32 Idtr[2]; UINT32 Eip; UINT32 Gs; UINT32 Fs; UINT32 Es; UINT32 Ds; UINT32 Cs; UINT32 Ss; UINT32 Edi; UINT32 Esi; UINT32 Ebp; UINT32 Esp; UINT32 Ebx; UINT32 Edx; UINT32 Ecx; UINT32 Eax; } EFI_SYSTEM_CONTEXT_IA32; // X64 #define EXCEPT_X64_DIVIDE_ERROR 0 #define EXCEPT_X64_DEBUG 1 #define EXCEPT_X64_NMI 2 #define EXCEPT_X64_BREAKPOINT 3 #define EXCEPT_X64_OVERFLOW 4 #define EXCEPT_X64_BOUND 5 #define EXCEPT_X64_INVALID_OPCODE 6 #define EXCEPT_X64_DOUBLE_FAULT 8 #define EXCEPT_X64_INVALID_TSS 10 #define EXCEPT_X64_SEG_NOT_PRESENT 11 #define EXCEPT_X64_STACK_FAULT 12 #define EXCEPT_X64_GP_FAULT 13 #define EXCEPT_X64_PAGE_FAULT 14 #define EXCEPT_X64_FP_ERROR 16 #define EXCEPT_X64_ALIGNMENT_CHECK 17 #define EXCEPT_X64_MACHINE_CHECK 18 #define EXCEPT_X64_SIMD 19 typedef struct { UINT16 Fcw; UINT16 Fsw; UINT16 Ftw; UINT16 Opcode; UINT64 Rip; UINT64 DataOffset; UINT8 Reserved1[8]; UINT8 St0Mm0[10], Reserved2[6]; UINT8 St1Mm1[10], Reserved3[6]; UINT8 St2Mm2[10], Reserved4[6]; UINT8 St3Mm3[10], Reserved5[6]; UINT8 St4Mm4[10], Reserved6[6]; UINT8 St5Mm5[10], Reserved7[6]; UINT8 St6Mm6[10], Reserved8[6]; UINT8 St7Mm7[10], Reserved9[6]; UINT8 Xmm0[16]; UINT8 Xmm1[16]; UINT8 Xmm2[16]; UINT8 Xmm3[16]; UINT8 Xmm4[16]; UINT8 Xmm5[16]; UINT8 Xmm6[16]; UINT8 Xmm7[16]; UINT8 Reserved11[14 * 16]; } EFI_FX_SAVE_STATE_X64; typedef struct { UINT64 ExceptionData; EFI_FX_SAVE_STATE_X64 FxSaveState; UINT64 Dr0; UINT64 Dr1; UINT64 Dr2; UINT64 Dr3; UINT64 Dr6; UINT64 Dr7; UINT64 Cr0; UINT64 Cr1; UINT64 Cr2; UINT64 Cr3; UINT64 Cr4; UINT64 Cr8; UINT64 Rflags; UINT64 Ldtr; UINT64 Tr; UINT64 Gdtr[2]; UINT64 Idtr[2]; UINT64 Rip; UINT64 Gs; UINT64 Fs; UINT64 Es; UINT64 Ds; UINT64 Cs; UINT64 Ss; UINT64 Rdi; UINT64 Rsi; UINT64 Rbp; UINT64 Rsp; UINT64 Rbx; UINT64 Rdx; UINT64 Rcx; UINT64 Rax; UINT64 R8; UINT64 R9; UINT64 R10; UINT64 R11; UINT64 R12; UINT64 R13; UINT64 R14; UINT64 R15; } EFI_SYSTEM_CONTEXT_X64; /// IA64 #define EXCEPT_IPF_VHTP_TRANSLATION 0 #define EXCEPT_IPF_INSTRUCTION_TLB 1 #define EXCEPT_IPF_DATA_TLB 2 #define EXCEPT_IPF_ALT_INSTRUCTION_TLB 3 #define EXCEPT_IPF_ALT_DATA_TLB 4 #define EXCEPT_IPF_DATA_NESTED_TLB 5 #define EXCEPT_IPF_INSTRUCTION_KEY_MISSED 6 #define EXCEPT_IPF_DATA_KEY_MISSED 7 #define EXCEPT_IPF_DIRTY_BIT 8 #define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT 9 #define EXCEPT_IPF_DATA_ACCESS_BIT 10 #define EXCEPT_IPF_BREAKPOINT 11 #define EXCEPT_IPF_EXTERNAL_INTERRUPT 12 #define EXCEPT_IPF_PAGE_NOT_PRESENT 20 #define EXCEPT_IPF_KEY_PERMISSION 21 #define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS 22 #define EXCEPT_IPF_DATA_ACCESS_RIGHTS 23 #define EXCEPT_IPF_GENERAL_EXCEPTION 24 #define EXCEPT_IPF_DISABLED_FP_REGISTER 25 #define EXCEPT_IPF_NAT_CONSUMPTION 26 #define EXCEPT_IPF_SPECULATION 27 #define EXCEPT_IPF_DEBUG 29 #define EXCEPT_IPF_UNALIGNED_REFERENCE 30 #define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE 31 #define EXCEPT_IPF_FP_FAULT 32 #define EXCEPT_IPF_FP_TRAP 33 #define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP 34 #define EXCEPT_IPF_TAKEN_BRANCH 35 #define EXCEPT_IPF_SINGLE_STEP 36 #define EXCEPT_IPF_IA32_EXCEPTION 45 #define EXCEPT_IPF_IA32_INTERCEPT 46 #define EXCEPT_IPF_IA32_INTERRUPT 47 typedef struct { UINT64 Reserved; UINT64 R1; UINT64 R2; UINT64 R3; UINT64 R4; UINT64 R5; UINT64 R6; UINT64 R7; UINT64 R8; UINT64 R9; UINT64 R10; UINT64 R11; UINT64 R12; UINT64 R13; UINT64 R14; UINT64 R15; UINT64 R16; UINT64 R17; UINT64 R18; UINT64 R19; UINT64 R20; UINT64 R21; UINT64 R22; UINT64 R23; UINT64 R24; UINT64 R25; UINT64 R26; UINT64 R27; UINT64 R28; UINT64 R29; UINT64 R30; UINT64 R31; UINT64 F2[2]; UINT64 F3[2]; UINT64 F4[2]; UINT64 F5[2]; UINT64 F6[2]; UINT64 F7[2]; UINT64 F8[2]; UINT64 F9[2]; UINT64 F10[2]; UINT64 F11[2]; UINT64 F12[2]; UINT64 F13[2]; UINT64 F14[2]; UINT64 F15[2]; UINT64 F16[2]; UINT64 F17[2]; UINT64 F18[2]; UINT64 F19[2]; UINT64 F20[2]; UINT64 F21[2]; UINT64 F22[2]; UINT64 F23[2]; UINT64 F24[2]; UINT64 F25[2]; UINT64 F26[2]; UINT64 F27[2]; UINT64 F28[2]; UINT64 F29[2]; UINT64 F30[2]; UINT64 F31[2]; UINT64 Pr; UINT64 B0; UINT64 B1; UINT64 B2; UINT64 B3; UINT64 B4; UINT64 B5; UINT64 B6; UINT64 B7; UINT64 ArRsc; UINT64 ArBsp; UINT64 ArBspstore; UINT64 ArRnat; UINT64 ArFcr; UINT64 ArEflag; UINT64 ArCsd; UINT64 ArSsd; UINT64 ArCflg; UINT64 ArFsr; UINT64 ArFir; UINT64 ArFdr; UINT64 ArCcv; UINT64 ArUnat; UINT64 ArFpsr; UINT64 ArPfs; UINT64 ArLc; UINT64 ArEc; UINT64 CrDcr; UINT64 CrItm; UINT64 CrIva; UINT64 CrPta; UINT64 CrIpsr; UINT64 CrIsr; UINT64 CrIip; UINT64 CrIfa; UINT64 CrItir; UINT64 CrIipa; UINT64 CrIfs; UINT64 CrIim; UINT64 CrIha; UINT64 Dbr0; UINT64 Dbr1; UINT64 Dbr2; UINT64 Dbr3; UINT64 Dbr4; UINT64 Dbr5; UINT64 Dbr6; UINT64 Dbr7; UINT64 Ibr0; UINT64 Ibr1; UINT64 Ibr2; UINT64 Ibr3; UINT64 Ibr4; UINT64 Ibr5; UINT64 Ibr6; UINT64 Ibr7; UINT64 IntNat; } EFI_SYSTEM_CONTEXT_IPF; // EBC #define EXCEPT_EBC_UNDEFINED 0 #define EXCEPT_EBC_DIVIDE_ERROR 1 #define EXCEPT_EBC_DEBUG 2 #define EXCEPT_EBC_BREAKPOINT 3 #define EXCEPT_EBC_OVERFLOW 4 #define EXCEPT_EBC_INVALID_OPCODE 5 #define EXCEPT_EBC_STACK_FAULT 6 #define EXCEPT_EBC_ALIGNMENT_CHECK 7 #define EXCEPT_EBC_INSTRUCTION_ENCODING 8 #define EXCEPT_EBC_BAD_BREAK 9 #define EXCEPT_EBC_STEP 10 #define MAX_EBC_EXCEPTION EXCEPT_EBC_STEP typedef struct { UINT64 R0; UINT64 R1; UINT64 R2; UINT64 R3; UINT64 R4; UINT64 R5; UINT64 R6; UINT64 R7; UINT64 Flags; UINT64 ControlFlags; UINT64 Ip; } EFI_SYSTEM_CONTEXT_EBC; // ARM #define EXCEPT_ARM_RESET 0 #define EXCEPT_ARM_UNDEFINED_INSTRUCTION 1 #define EXCEPT_ARM_SOFTWARE_INTERRUPT 2 #define EXCEPT_ARM_PREFETCH_ABORT 3 #define EXCEPT_ARM_DATA_ABORT 4 #define EXCEPT_ARM_RESERVED 5 #define EXCEPT_ARM_IRQ 6 #define EXCEPT_ARM_FIQ 7 #define MAX_ARM_EXCEPTION EXCEPT_ARM_FIQ typedef struct { UINT32 R0; UINT32 R1; UINT32 R2; UINT32 R3; UINT32 R4; UINT32 R5; UINT32 R6; UINT32 R7; UINT32 R8; UINT32 R9; UINT32 R10; UINT32 R11; UINT32 R12; UINT32 SP; UINT32 LR; UINT32 PC; UINT32 CPSR; UINT32 DFSR; UINT32 DFAR; UINT32 IFSR; UINT32 IFAR; } EFI_SYSTEM_CONTEXT_ARM; typedef union { EFI_SYSTEM_CONTEXT_EBC *SystemContextEbc; EFI_SYSTEM_CONTEXT_IA32 *SystemContextIa32; EFI_SYSTEM_CONTEXT_X64 *SystemContextX64; EFI_SYSTEM_CONTEXT_IPF *SystemContextIpf; EFI_SYSTEM_CONTEXT_ARM *SystemContextArm; } EFI_SYSTEM_CONTEXT; typedef VOID (EFIAPI *EFI_EXCEPTION_CALLBACK)( IN EFI_EXCEPTION_TYPE ExceptionType, IN OUT EFI_SYSTEM_CONTEXT SystemContext); typedef VOID (EFIAPI *EFI_PERIODIC_CALLBACK)( IN OUT EFI_SYSTEM_CONTEXT SystemContext); typedef enum { IsaIa32 = EFI_IMAGE_MACHINE_IA32, IsaX64 = EFI_IMAGE_MACHINE_X64, IsaIpf = EFI_IMAGE_MACHINE_IA64, IsaEbc = EFI_IMAGE_MACHINE_EBC, IsaArm = EFI_IMAGE_MACHINE_ARMTHUMB_MIXED, // IsaArm64 = EFI_IMAGE_MACHINE_AARCH64 } EFI_INSTRUCTION_SET_ARCHITECTURE; // // DEBUG_IMAGE_INFO // #define EFI_DEBUG_IMAGE_INFO_TABLE_GUID \ { 0x49152e77, 0x1ada, 0x4764, {0xb7, 0xa2, 0x7a, 0xfe, 0xfe, 0xd9, 0x5e, 0x8b} } #define EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS 0x01 #define EFI_DEBUG_IMAGE_INFO_TABLE_MODIFIED 0x02 #define EFI_DEBUG_IMAGE_INFO_INITIAL_SIZE (EFI_PAGE_SIZE / sizeof (UINTN)) #define EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL 0x01 typedef struct { UINT64 Signature; EFI_PHYSICAL_ADDRESS EfiSystemTableBase; UINT32 Crc32; } EFI_SYSTEM_TABLE_POINTER; typedef struct { UINT32 ImageInfoType; EFI_LOADED_IMAGE_PROTOCOL *LoadedImageProtocolInstance; EFI_HANDLE *ImageHandle; } EFI_DEBUG_IMAGE_INFO_NORMAL; typedef union { UINT32 *ImageInfoType; EFI_DEBUG_IMAGE_INFO_NORMAL *NormalImage; } EFI_DEBUG_IMAGE_INFO; typedef struct { volatile UINT32 UpdateStatus; UINT32 TableSize; EFI_DEBUG_IMAGE_INFO *EfiDebugImageInfoTable; } EFI_DEBUG_IMAGE_INFO_TABLE_HEADER; // // EFI_DEBUGGER_PROTOCOL // #define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \ { 0x2755590c, 0x6f3c, 0x42fa, {0x9e, 0xa4, 0xa3, 0xba, 0x54, 0x3c, 0xda, 0x25} } INTERFACE_DECL(_EFI_DEBUG_SUPPORT_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)( IN struct _EFI_DEBUG_SUPPORT_PROTOCOL *This, OUT UINTN *MaxProcessorIndex); typedef EFI_STATUS (EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK)( IN struct _EFI_DEBUG_SUPPORT_PROTOCOL *This, IN UINTN ProcessorIndex, IN EFI_PERIODIC_CALLBACK PeriodicCallback); typedef EFI_STATUS (EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK)( IN struct _EFI_DEBUG_SUPPORT_PROTOCOL *This, IN UINTN ProcessorIndex, IN EFI_EXCEPTION_CALLBACK ExceptionCallback, IN EFI_EXCEPTION_TYPE ExceptionType); typedef EFI_STATUS (EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE)( IN struct _EFI_DEBUG_SUPPORT_PROTOCOL *This, IN UINTN ProcessorIndex, IN VOID *Start, IN UINT64 Length); typedef struct _EFI_DEBUG_SUPPORT_PROTOCOL { EFI_INSTRUCTION_SET_ARCHITECTURE Isa; EFI_GET_MAXIMUM_PROCESSOR_INDEX GetMaximumProcessorIndex; EFI_REGISTER_PERIODIC_CALLBACK RegisterPeriodicCallback; EFI_REGISTER_EXCEPTION_CALLBACK RegisterExceptionCallback; EFI_INVALIDATE_INSTRUCTION_CACHE InvalidateInstructionCache; } EFI_DEBUG_SUPPORT_PROTOCOL; #endif ncroxon-gnu-efi-157d47c/inc/efidef.h000066400000000000000000000146311471215650600172500ustar00rootroot00000000000000#ifndef _EFI_DEF_H #define _EFI_DEF_H /*++ Copyright (c) 1998 Intel Corporation Module Name: efidef.h Abstract: EFI definitions Revision History --*/ #if !defined(__cplusplus) #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L typedef _Bool BOOLEAN; #else typedef unsigned char BOOLEAN; #endif #else typedef bool BOOLEAN; #endif #ifndef CONST #define CONST const #endif #ifndef TRUE #if defined(__cplusplus) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) #if defined(_MSC_VER) #include #endif #define TRUE true #define FALSE false #else #define TRUE ((BOOLEAN) 1) #define FALSE ((BOOLEAN) 0) #endif #endif #ifndef NULL #if (defined(__cplusplus) && __cplusplus >= 201103L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) #define NULL nullptr #else #if !defined(__cplusplus) #define NULL ((VOID *) 0) #else #define NULL 0 #endif #endif #endif typedef UINTN EFI_STATUS; typedef UINT64 EFI_LBA; typedef UINTN EFI_TPL; typedef VOID *EFI_HANDLE; typedef VOID *EFI_EVENT; // // Prototype argument decoration for EFI parameters to indicate // their direction // // IN - argument is passed into the function // OUT - argument (pointer) is returned from the function // OPTIONAL - argument is optional // #ifndef IN #define IN #define OUT #define OPTIONAL #endif // STATIC - Name is internal to the module #define STATIC static // // A GUID // typedef struct { UINT32 Data1; UINT16 Data2; UINT16 Data3; UINT8 Data4[8]; } EFI_GUID; // // Time // typedef struct { UINT16 Year; // 1998 - 20XX UINT8 Month; // 1 - 12 UINT8 Day; // 1 - 31 UINT8 Hour; // 0 - 23 UINT8 Minute; // 0 - 59 UINT8 Second; // 0 - 59 UINT8 Pad1; UINT32 Nanosecond; // 0 - 999,999,999 INT16 TimeZone; // -1440 to 1440 or 2047 UINT8 Daylight; UINT8 Pad2; } EFI_TIME; // Bit definitions for EFI_TIME.Daylight #define EFI_TIME_ADJUST_DAYLIGHT 0x01 #define EFI_TIME_IN_DAYLIGHT 0x02 // Value definition for EFI_TIME.TimeZone #define EFI_UNSPECIFIED_TIMEZONE 0x07FF // // Networking // typedef struct { UINT8 Addr[4]; } EFI_IPv4_ADDRESS; typedef struct { UINT8 Addr[16]; } EFI_IPv6_ADDRESS; typedef struct { UINT8 Addr[32]; } EFI_MAC_ADDRESS; typedef struct { UINT32 ReceivedQueueTimeoutValue; UINT32 TransmitQueueTimeoutValue; UINT16 ProtocolTypeFilter; BOOLEAN EnableUnicastReceive; BOOLEAN EnableMulticastReceive; BOOLEAN EnableBroadcastReceive; BOOLEAN EnablePromiscuousReceive; BOOLEAN FlushQueuesOnReset; BOOLEAN EnableReceiveTimestamps; BOOLEAN DisableBackgroundPolling; } EFI_MANAGED_NETWORK_CONFIG_DATA; // // Memory // typedef UINT64 EFI_PHYSICAL_ADDRESS; typedef UINT64 EFI_VIRTUAL_ADDRESS; typedef enum { AllocateAnyPages, AllocateMaxAddress, AllocateAddress, MaxAllocateType } EFI_ALLOCATE_TYPE; //Preseve the attr on any range supplied. //ConventialMemory must have WB,SR,SW when supplied. //When allocating from ConventialMemory always make it WB,SR,SW //When returning to ConventialMemory always make it WB,SR,SW //When getting the memory map, or on RT for runtime types typedef enum { EfiReservedMemoryType, EfiLoaderCode, EfiLoaderData, EfiBootServicesCode, EfiBootServicesData, EfiRuntimeServicesCode, EfiRuntimeServicesData, EfiConventionalMemory, EfiUnusableMemory, EfiACPIReclaimMemory, EfiACPIMemoryNVS, EfiMemoryMappedIO, EfiMemoryMappedIOPortSpace, EfiPalCode, EfiPersistentMemory, EfiUnacceptedMemoryType, EfiMaxMemoryType } EFI_MEMORY_TYPE; // Memory cacheability attribute #define EFI_MEMORY_UC 0x0000000000000001 #define EFI_MEMORY_WC 0x0000000000000002 #define EFI_MEMORY_WT 0x0000000000000004 #define EFI_MEMORY_WB 0x0000000000000008 #define EFI_MEMORY_UCE 0x0000000000000010 // Physical memory protection attribute #define EFI_MEMORY_WP 0x0000000000001000 #define EFI_MEMORY_RP 0x0000000000002000 #define EFI_MEMORY_XP 0x0000000000004000 #define EFI_MEMORY_RO 0x0000000000020000 // Runtime memory attribute #define EFI_MEMORY_NV 0x0000000000008000 #define EFI_MEMORY_RUNTIME 0x8000000000000000 // Other memory attribute #define EFI_MEMORY_MORE_RELIABLE 0x0000000000010000 #define EFI_MEMORY_SP 0x0000000000040000 #define EFI_MEMORY_CPU_CRYPTO 0x0000000000080000 #define EFI_MEMORY_ISA_VALID 0x4000000000000000 #define EFI_MEMORY_ISA_MASK 0x0FFFF00000000000 #define EFI_MEMORY_DESCRIPTOR_VERSION 1 typedef struct { UINT32 Type; // Field size is 32 bits followed by 32 bit pad UINT32 Pad; EFI_PHYSICAL_ADDRESS PhysicalStart; // Field size is 64 bits EFI_VIRTUAL_ADDRESS VirtualStart; // Field size is 64 bits UINT64 NumberOfPages; // Field size is 64 bits UINT64 Attribute; // Field size is 64 bits } EFI_MEMORY_DESCRIPTOR; // // International Language // typedef CHAR8 ISO_639_2; #define ISO_639_2_ENTRY_SIZE 3 // // // #define EFI_PAGE_SIZE 4096 #define EFI_PAGE_MASK 0xFFF #define EFI_PAGE_SHIFT 12 #define EFI_SIZE_TO_PAGES(a) \ ( ((a) >> EFI_PAGE_SHIFT) + ((a) & EFI_PAGE_MASK ? 1 : 0) ) #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001 #define EFI_OS_INDICATIONS_TIMESTAMP_REVOCATION 0x0000000000000002 #define EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED \ 0x0000000000000004 #define EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED \ 0x0000000000000008 #define EFI_OS_INDICATIONS_CAPSULE_RESULT_VAR_SUPPORTED \ 0x0000000000000010 #define EFI_OS_INDICATIONS_START_OS_RECOVERY 0x0000000000000020 #define EFI_OS_INDICATIONS_START_PLATFORM_RECOVERY \ 0x0000000000000040 #define EFI_OS_INDICATIONS_JSON_CONFIG_DATA_REFRESH \ 0x0000000000000080 #endif ncroxon-gnu-efi-157d47c/inc/efidevp.h000066400000000000000000000534171471215650600174550ustar00rootroot00000000000000#ifndef _DEVPATH_H #define _DEVPATH_H /*++ Copyright (c) 1998 Intel Corporation Module Name: devpath.h Abstract: Defines for parsing the EFI Device Path structures Revision History --*/ // // Device Path structures - Section C // typedef struct _EFI_DEVICE_PATH_PROTOCOL { UINT8 Type; UINT8 SubType; UINT8 Length[2]; } EFI_DEVICE_PATH_PROTOCOL; typedef struct _EFI_DEVICE_PATH_PROTOCOL _EFI_DEVICE_PATH; typedef EFI_DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH; #define EFI_DP_TYPE_MASK 0x7F #define EFI_DP_TYPE_UNPACKED 0x80 //#define END_DEVICE_PATH_TYPE 0xff #define END_DEVICE_PATH_TYPE 0x7f //#define END_DEVICE_PATH_TYPE_UNPACKED 0x7f #define END_ENTIRE_DEVICE_PATH_SUBTYPE 0xff #define END_INSTANCE_DEVICE_PATH_SUBTYPE 0x01 #define END_DEVICE_PATH_LENGTH (sizeof(EFI_DEVICE_PATH_PROTOCOL)) #define DP_IS_END_TYPE(a) #define DP_IS_END_SUBTYPE(a) ( ((a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE ) #define DevicePathType(a) ( ((a)->Type) & EFI_DP_TYPE_MASK ) #define DevicePathSubType(a) ( (a)->SubType ) #define DevicePathNodeLength(a) ( ((a)->Length[0]) | ((a)->Length[1] << 8) ) #define NextDevicePathNode(a) ( (EFI_DEVICE_PATH_PROTOCOL *) ( ((UINT8 *) (a)) + DevicePathNodeLength(a))) //#define IsDevicePathEndType(a) ( DevicePathType(a) == END_DEVICE_PATH_TYPE_UNPACKED ) #define IsDevicePathEndType(a) ( DevicePathType(a) == END_DEVICE_PATH_TYPE ) #define IsDevicePathEndSubType(a) ( (a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE ) #define IsDevicePathEnd(a) ( IsDevicePathEndType(a) && IsDevicePathEndSubType(a) ) #define IsDevicePathUnpacked(a) ( (a)->Type & EFI_DP_TYPE_UNPACKED ) #define SetDevicePathNodeLength(a,l) { \ (a)->Length[0] = (UINT8) (l); \ (a)->Length[1] = (UINT8) ((l) >> 8); \ } #define SetDevicePathEndNode(a) { \ (a)->Type = END_DEVICE_PATH_TYPE; \ (a)->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE; \ (a)->Length[0] = sizeof(EFI_DEVICE_PATH_PROTOCOL); \ (a)->Length[1] = 0; \ } /* * Hardware Device Path (UEFI 2.4 specification, version 2.4 § 9.3.2.) */ #define HARDWARE_DEVICE_PATH 0x01 #define HW_PCI_DP 0x01 typedef struct _PCI_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT8 Function; UINT8 Device; } PCI_DEVICE_PATH; #define HW_PCCARD_DP 0x02 typedef struct _PCCARD_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT8 FunctionNumber ; } PCCARD_DEVICE_PATH; #define HW_MEMMAP_DP 0x03 typedef struct _MEMMAP_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT32 MemoryType; EFI_PHYSICAL_ADDRESS StartingAddress; EFI_PHYSICAL_ADDRESS EndingAddress; } MEMMAP_DEVICE_PATH; #define HW_VENDOR_DP 0x04 typedef struct _VENDOR_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; EFI_GUID Guid; } VENDOR_DEVICE_PATH; #define UNKNOWN_DEVICE_GUID \ { 0xcf31fac5, 0xc24e, 0x11d2, {0x85, 0xf3, 0x0, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b} } typedef struct _UKNOWN_DEVICE_VENDOR_DP { VENDOR_DEVICE_PATH DevicePath; UINT8 LegacyDriveLetter; } UNKNOWN_DEVICE_VENDOR_DEVICE_PATH; #define HW_CONTROLLER_DP 0x05 typedef struct _CONTROLLER_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT32 Controller; } CONTROLLER_DEVICE_PATH; /* * ACPI Device Path (UEFI 2.4 specification, version 2.4 § 9.3.3 and 9.3.4.) */ #define ACPI_DEVICE_PATH 0x02 #define ACPI_DP 0x01 typedef struct _ACPI_HID_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT32 HID; UINT32 UID; } ACPI_HID_DEVICE_PATH; #define EXPANDED_ACPI_DP 0x02 typedef struct _EXPANDED_ACPI_HID_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT32 HID; UINT32 UID; UINT32 CID; UINT8 HidStr[1]; } EXPANDED_ACPI_HID_DEVICE_PATH; #define ACPI_ADR_DP 3 typedef struct _ACPI_ADR_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header ; UINT32 ADR ; } ACPI_ADR_DEVICE_PATH ; // // EISA ID Macro // EISA ID Definition 32-bits // bits[15:0] - three character compressed ASCII EISA ID. // bits[31:16] - binary number // Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' // #define PNP_EISA_ID_CONST 0x41d0 #define EISA_ID(_Name, _Num) ((UINT32) ((_Name) | (_Num) << 16)) #define EISA_PNP_ID(_PNPId) (EISA_ID(PNP_EISA_ID_CONST, (_PNPId))) #define PNP_EISA_ID_MASK 0xffff #define EISA_ID_TO_NUM(_Id) ((_Id) >> 16) /* * Messaging Device Path (UEFI 2.4 specification, version 2.4 § 9.3.5.) */ #define MESSAGING_DEVICE_PATH 0x03 #define MSG_ATAPI_DP 0x01 typedef struct _ATAPI_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT8 PrimarySecondary; UINT8 SlaveMaster; UINT16 Lun; } ATAPI_DEVICE_PATH; #define MSG_SCSI_DP 0x02 typedef struct _SCSI_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT16 Pun; UINT16 Lun; } SCSI_DEVICE_PATH; #define MSG_FIBRECHANNEL_DP 0x03 typedef struct _FIBRECHANNEL_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT32 Reserved; UINT64 WWN; UINT64 Lun; } FIBRECHANNEL_DEVICE_PATH; /** * Fibre Channel Ex SubType. * UEFI 2.0 specification version 2.4 § 9.3.5.6. */ #define MSG_FIBRECHANNELEX_DP 21 typedef struct _FIBRECHANNELEX_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header ; UINT32 Reserved ; UINT8 WWN[ 8 ] ; /* World Wide Name */ UINT8 Lun[ 8 ] ; /* Logical unit, T-10 SCSI Architecture Model 4 specification */ } FIBRECHANNELEX_DEVICE_PATH ; #define MSG_1394_DP 0x04 typedef struct _F1394_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT32 Reserved; UINT64 Guid; } F1394_DEVICE_PATH; #define MSG_USB_DP 0x05 typedef struct _USB_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT8 Port; UINT8 Endpoint; } USB_DEVICE_PATH; /** * SATA Device Path SubType. * UEFI 2.0 specification version 2.4 § 9.3.5.6. */ #define MSG_SATA_DP 18 typedef struct _SATA_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header ; UINT16 HBAPortNumber ; UINT16 PortMultiplierPortNumber ; UINT16 Lun ; /* Logical Unit Number */ } SATA_DEVICE_PATH ; /** * USB WWID Device Path SubType. * UEFI 2.0 specification version 2.4 § 9.3.5.7. */ #define MSG_USB_WWID_DP 16 typedef struct _USB_WWID_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header ; UINT16 InterfaceNumber ; UINT16 VendorId ; UINT16 ProductId ; CHAR16 SerialNumber[ 1 ] ; /* UTF-16 characters of the USB serial number */ } USB_WWID_DEVICE_PATH ; /** * Device Logical Unit SubType. * UEFI 2.0 specification version 2.4 § 9.3.5.8. */ #define MSG_DEVICE_LOGICAL_UNIT_DP 17 typedef struct _DEVICE_LOGICAL_UNIT_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header ; UINT8 Lun ; /* Logical Unit Number */ } DEVICE_LOGICAL_UNIT_DEVICE_PATH ; #define MSG_USB_CLASS_DP 0x0F typedef struct _USB_CLASS_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT16 VendorId; UINT16 ProductId; UINT8 DeviceClass; UINT8 DeviceSubclass; UINT8 DeviceProtocol; } USB_CLASS_DEVICE_PATH; #define MSG_I2O_DP 0x06 typedef struct _I2O_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT32 Tid; } I2O_DEVICE_PATH; #define MSG_MAC_ADDR_DP 0x0b typedef struct _MAC_ADDR_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; EFI_MAC_ADDRESS MacAddress; UINT8 IfType; } MAC_ADDR_DEVICE_PATH; #define MSG_IPv4_DP 0x0c typedef struct _IPv4_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; EFI_IPv4_ADDRESS LocalIpAddress; EFI_IPv4_ADDRESS RemoteIpAddress; UINT16 LocalPort; UINT16 RemotePort; UINT16 Protocol; BOOLEAN StaticIpAddress; /* new from UEFI version 2, code must check Length field in Header */ EFI_IPv4_ADDRESS GatewayIpAddress ; EFI_IPv4_ADDRESS SubnetMask ; } IPv4_DEVICE_PATH; #define MSG_IPv6_DP 0x0d typedef struct _IPv6_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; EFI_IPv6_ADDRESS LocalIpAddress; EFI_IPv6_ADDRESS RemoteIpAddress; UINT16 LocalPort; UINT16 RemotePort; UINT16 Protocol; BOOLEAN IPAddressOrigin ; /* new from UEFI version 2, code must check Length field in Header */ UINT8 PrefixLength ; EFI_IPv6_ADDRESS GatewayIpAddress ; } IPv6_DEVICE_PATH; /** * Uniform Resource Identifiers SubType. * UEFI 2.0 specification version 2.4C § 9.3.5.23. */ #define MSG_URI_DP 24 typedef struct _URI_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; CHAR8 Uri[1]; } URI_DEVICE_PATH; /** * Device Logical Unit SubType. * UEFI 2.0 specification version 2.4 § 9.3.5.8. */ #define MSG_VLAN_DP 20 typedef struct _VLAN_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header ; UINT16 VlanId ; } VLAN_DEVICE_PATH; #define MSG_INFINIBAND_DP 0x09 typedef struct _INFINIBAND_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT32 ResourceFlags; UINT8 PortGid[16]; UINT64 ServiceId; UINT64 TargetPortId; UINT64 DeviceId; } INFINIBAND_DEVICE_PATH; #define MSG_UART_DP 0x0e typedef struct _UART_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT32 Reserved; UINT64 BaudRate; UINT8 DataBits; UINT8 Parity; UINT8 StopBits; } UART_DEVICE_PATH; #define MSG_VENDOR_DP 0x0A /* Use VENDOR_DEVICE_PATH struct */ #define EFI_PC_ANSI_GUID \ { 0xe0c14753, 0xf9be, 0x11d2, {0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } #define DEVICE_PATH_MESSAGING_PC_ANSI EFI_PC_ANSI_GUID #define EFI_VT_100_GUID \ { 0xdfa66065, 0xb419, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } #define DEVICE_PATH_MESSAGING_VT_100 EFI_VT_100_GUID #define EFI_VT_100_PLUS_GUID \ { 0x7baec70b, 0x57e0, 0x4c76, {0x8e, 0x87, 0x2f, 0x9e, 0x28, 0x08, 0x83, 0x43} } #define DEVICE_PATH_MESSAGING_VT_100_PLUS EFI_VT_100_PLUS_GUID #define EFI_VT_UTF8_GUID \ { 0xad15a0d6, 0x8bec, 0x4acf, {0xa0, 0x73, 0xd0, 0x1d, 0xe7, 0x7e, 0x2d, 0x88} } #define DEVICE_PATH_MESSAGING_VT_UTF8 EFI_VT_UTF8_GUID /* * Media Device Path (UEFI 2.4 specification, version 2.4 § 9.3.6.) */ #define MEDIA_DEVICE_PATH 0x04 #define MEDIA_HARDDRIVE_DP 0x01 typedef struct _HARDDRIVE_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT32 PartitionNumber; UINT64 PartitionStart; UINT64 PartitionSize; UINT8 Signature[16]; UINT8 MBRType; UINT8 SignatureType; } HARDDRIVE_DEVICE_PATH; #define MBR_TYPE_PCAT 0x01 #define MBR_TYPE_EFI_PARTITION_TABLE_HEADER 0x02 #define SIGNATURE_TYPE_MBR 0x01 #define SIGNATURE_TYPE_GUID 0x02 #define MEDIA_CDROM_DP 0x02 typedef struct _CDROM_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT32 BootEntry; UINT64 PartitionStart; UINT64 PartitionSize; } CDROM_DEVICE_PATH; #define MEDIA_VENDOR_DP 0x03 /* Use VENDOR_DEVICE_PATH struct */ #define MEDIA_FILEPATH_DP 0x04 typedef struct _FILEPATH_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; CHAR16 PathName[1]; } FILEPATH_DEVICE_PATH; #define SIZE_OF_FILEPATH_DEVICE_PATH EFI_FIELD_OFFSET(FILEPATH_DEVICE_PATH,PathName) #define MEDIA_PROTOCOL_DP 0x05 typedef struct _MEDIA_PROTOCOL_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; EFI_GUID Protocol; } MEDIA_PROTOCOL_DEVICE_PATH; /** * PIWG Firmware File SubType. * UEFI 2.0 specification version 2.4 § 9.3.6.6. */ #define MEDIA_PIWG_FW_FILE_DP 6 typedef struct _MEDIA_FW_VOL_FILEPATH_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header ; EFI_GUID FvFileName ; } MEDIA_FW_VOL_FILEPATH_DEVICE_PATH ; /** * PIWG Firmware Volume Device Path SubType. * UEFI 2.0 specification version 2.4 § 9.3.6.7. */ #define MEDIA_PIWG_FW_VOL_DP 7 typedef struct _MEDIA_FW_VOL_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header ; EFI_GUID FvName ; } MEDIA_FW_VOL_DEVICE_PATH ; /** * Media relative offset range device path. * UEFI 2.0 specification version 2.4 § 9.3.6.8. */ #define MEDIA_RELATIVE_OFFSET_RANGE_DP 8 typedef struct _MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header ; UINT32 Reserved ; UINT64 StartingOffset ; UINT64 EndingOffset ; } MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH ; /* * BIOS Boot Specification Device Path (UEFI 2.4 specification, version 2.4 § 9.3.7.) */ #define BBS_DEVICE_PATH 0x05 #define BBS_BBS_DP 0x01 typedef struct _BBS_BBS_DEVICE_PATH { EFI_DEVICE_PATH_PROTOCOL Header; UINT16 DeviceType; UINT16 StatusFlag; CHAR8 String[1]; } BBS_BBS_DEVICE_PATH; /* DeviceType definitions - from BBS specification */ #define BBS_TYPE_FLOPPY 0x01 #define BBS_TYPE_HARDDRIVE 0x02 #define BBS_TYPE_CDROM 0x03 #define BBS_TYPE_PCMCIA 0x04 #define BBS_TYPE_USB 0x05 #define BBS_TYPE_EMBEDDED_NETWORK 0x06 #define BBS_TYPE_DEV 0x80 #define BBS_TYPE_UNKNOWN 0xFF typedef union { EFI_DEVICE_PATH_PROTOCOL DevPath; PCI_DEVICE_PATH Pci; PCCARD_DEVICE_PATH PcCard; MEMMAP_DEVICE_PATH MemMap; VENDOR_DEVICE_PATH Vendor; UNKNOWN_DEVICE_VENDOR_DEVICE_PATH UnknownVendor; CONTROLLER_DEVICE_PATH Controller; ACPI_HID_DEVICE_PATH Acpi; ATAPI_DEVICE_PATH Atapi; SCSI_DEVICE_PATH Scsi; FIBRECHANNEL_DEVICE_PATH FibreChannel; F1394_DEVICE_PATH F1394; USB_DEVICE_PATH Usb; USB_CLASS_DEVICE_PATH UsbClass; I2O_DEVICE_PATH I2O; MAC_ADDR_DEVICE_PATH MacAddr; IPv4_DEVICE_PATH Ipv4; IPv6_DEVICE_PATH Ipv6; URI_DEVICE_PATH Uri; INFINIBAND_DEVICE_PATH InfiniBand; UART_DEVICE_PATH Uart; HARDDRIVE_DEVICE_PATH HardDrive; CDROM_DEVICE_PATH CD; FILEPATH_DEVICE_PATH FilePath; MEDIA_PROTOCOL_DEVICE_PATH MediaProtocol; BBS_BBS_DEVICE_PATH Bbs; } EFI_DEV_PATH; typedef union { EFI_DEVICE_PATH_PROTOCOL *DevPath; PCI_DEVICE_PATH *Pci; PCCARD_DEVICE_PATH *PcCard; MEMMAP_DEVICE_PATH *MemMap; VENDOR_DEVICE_PATH *Vendor; UNKNOWN_DEVICE_VENDOR_DEVICE_PATH *UnknownVendor; CONTROLLER_DEVICE_PATH *Controller; ACPI_HID_DEVICE_PATH *Acpi; ATAPI_DEVICE_PATH *Atapi; SCSI_DEVICE_PATH *Scsi; FIBRECHANNEL_DEVICE_PATH *FibreChannel; F1394_DEVICE_PATH *F1394; USB_DEVICE_PATH *Usb; USB_CLASS_DEVICE_PATH *UsbClass; I2O_DEVICE_PATH *I2O; MAC_ADDR_DEVICE_PATH *MacAddr; IPv4_DEVICE_PATH *Ipv4; IPv6_DEVICE_PATH *Ipv6; URI_DEVICE_PATH *Uri; INFINIBAND_DEVICE_PATH *InfiniBand; UART_DEVICE_PATH *Uart; HARDDRIVE_DEVICE_PATH *HardDrive; FILEPATH_DEVICE_PATH *FilePath; MEDIA_PROTOCOL_DEVICE_PATH *MediaProtocol; CDROM_DEVICE_PATH *CD; BBS_BBS_DEVICE_PATH *Bbs; } EFI_DEV_PATH_PTR; #define EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \ { 0x8b843e20, 0x8132, 0x4852, {0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c} } typedef CHAR16* (EFIAPI *EFI_DEVICE_PATH_TO_TEXT_NODE) ( IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode, IN BOOLEAN DisplayOnly, IN BOOLEAN AllowShortcuts ); typedef CHAR16* (EFIAPI *EFI_DEVICE_PATH_TO_TEXT_PATH) ( IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN BOOLEAN DisplayOnly, IN BOOLEAN AllowShortcuts ); typedef struct _EFI_DEVICE_PATH_TO_TEXT_PROTOCOL { EFI_DEVICE_PATH_TO_TEXT_NODE ConvertDeviceNodeToText; EFI_DEVICE_PATH_TO_TEXT_PATH ConvertDevicePathToText; } EFI_DEVICE_PATH_TO_TEXT_PROTOCOL; #define EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL_GUID \ { 0x5c99a21, 0xc70f, 0x4ad2, {0x8a, 0x5f, 0x35, 0xdf, 0x33, 0x43, 0xf5, 0x1e} } typedef EFI_DEVICE_PATH_PROTOCOL* (EFIAPI *EFI_DEVICE_PATH_FROM_TEXT_NODE) ( IN CONST CHAR16 *TextDeviceNode ); typedef EFI_DEVICE_PATH_PROTOCOL* (EFIAPI *EFI_DEVICE_PATH_FROM_TEXT_PATH) ( IN CONST CHAR16 *TextDevicePath ); typedef struct { EFI_DEVICE_PATH_FROM_TEXT_NODE ConvertTextToDeviceNode; EFI_DEVICE_PATH_FROM_TEXT_PATH ConvertTextToDevicePath; } EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL; #define EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID \ { 0x379be4e, 0xd706, 0x437d, {0xb0, 0x37, 0xed, 0xb8, 0x2f, 0xb7, 0x72, 0xa4} } typedef UINTN (EFIAPI *EFI_DEVICE_PATH_UTILS_GET_DEVICE_PATH_SIZE) ( IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath ); typedef EFI_DEVICE_PATH_PROTOCOL* (EFIAPI *EFI_DEVICE_PATH_UTILS_DUP_DEVICE_PATH) ( IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath ); typedef EFI_DEVICE_PATH_PROTOCOL* (EFIAPI *EFI_DEVICE_PATH_UTILS_APPEND_PATH) ( IN CONST EFI_DEVICE_PATH_PROTOCOL *Src1, IN CONST EFI_DEVICE_PATH_PROTOCOL *Src2 ); typedef EFI_DEVICE_PATH_PROTOCOL* (EFIAPI *EFI_DEVICE_PATH_UTILS_APPEND_NODE) ( IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode ); typedef EFI_DEVICE_PATH_PROTOCOL* (EFIAPI *EFI_DEVICE_PATH_UTILS_APPEND_INSTANCE) ( IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance ); typedef EFI_DEVICE_PATH_PROTOCOL* (EFIAPI *EFI_DEVICE_PATH_UTILS_GET_NEXT_INSTANCE) ( IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathInstance, OUT UINTN *DevicePathInstanceSize OPTIONAL ); typedef EFI_DEVICE_PATH_PROTOCOL* (EFIAPI *EFI_DEVICE_PATH_UTILS_CREATE_NODE) ( IN UINT8 NodeType, IN UINT8 NodeSubType, IN UINT16 NodeLength ); typedef BOOLEAN (EFIAPI *EFI_DEVICE_PATH_UTILS_IS_MULTI_INSTANCE) ( IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath ); typedef struct _EFI_DEVICE_PATH_UTILITIES_PROTOCOL { EFI_DEVICE_PATH_UTILS_GET_DEVICE_PATH_SIZE GetDevicePathSize; EFI_DEVICE_PATH_UTILS_DUP_DEVICE_PATH DuplicateDevicePath; EFI_DEVICE_PATH_UTILS_APPEND_PATH AppendDevicePath; EFI_DEVICE_PATH_UTILS_APPEND_NODE AppendDeviceNode; EFI_DEVICE_PATH_UTILS_APPEND_INSTANCE AppendDevicePathInstance; EFI_DEVICE_PATH_UTILS_GET_NEXT_INSTANCE GetNextDevicePathInstance; EFI_DEVICE_PATH_UTILS_IS_MULTI_INSTANCE IsDevicePathMultiInstance; EFI_DEVICE_PATH_UTILS_CREATE_NODE CreateDeviceNode; } EFI_DEVICE_PATH_UTILITIES_PROTOCOL; #endif ncroxon-gnu-efi-157d47c/inc/efierr.h000066400000000000000000000045611471215650600173030ustar00rootroot00000000000000#ifndef _EFI_ERR_H #define _EFI_ERR_H /*++ Copyright (c) 1998 Intel Corporation Module Name: efierr.h Abstract: EFI error codes Revision History --*/ #define EFIWARN(a) (a) #define EFI_ERROR(a) (((INTN) a) < 0) #define EFI_SUCCESS 0 #define EFI_LOAD_ERROR EFIERR(1) #define EFI_INVALID_PARAMETER EFIERR(2) #define EFI_UNSUPPORTED EFIERR(3) #define EFI_BAD_BUFFER_SIZE EFIERR(4) #define EFI_BUFFER_TOO_SMALL EFIERR(5) #define EFI_NOT_READY EFIERR(6) #define EFI_DEVICE_ERROR EFIERR(7) #define EFI_WRITE_PROTECTED EFIERR(8) #define EFI_OUT_OF_RESOURCES EFIERR(9) #define EFI_VOLUME_CORRUPTED EFIERR(10) #define EFI_VOLUME_FULL EFIERR(11) #define EFI_NO_MEDIA EFIERR(12) #define EFI_MEDIA_CHANGED EFIERR(13) #define EFI_NOT_FOUND EFIERR(14) #define EFI_ACCESS_DENIED EFIERR(15) #define EFI_NO_RESPONSE EFIERR(16) #define EFI_NO_MAPPING EFIERR(17) #define EFI_TIMEOUT EFIERR(18) #define EFI_NOT_STARTED EFIERR(19) #define EFI_ALREADY_STARTED EFIERR(20) #define EFI_ABORTED EFIERR(21) #define EFI_ICMP_ERROR EFIERR(22) #define EFI_TFTP_ERROR EFIERR(23) #define EFI_PROTOCOL_ERROR EFIERR(24) #define EFI_INCOMPATIBLE_VERSION EFIERR(25) #define EFI_SECURITY_VIOLATION EFIERR(26) #define EFI_CRC_ERROR EFIERR(27) #define EFI_END_OF_MEDIA EFIERR(28) #define EFI_END_OF_FILE EFIERR(31) #define EFI_INVALID_LANGUAGE EFIERR(32) #define EFI_COMPROMISED_DATA EFIERR(33) #define EFI_IP_ADDRESS_CONFLICT EFIERR(34) #define EFI_HTTP_ERROR EFIERR(35) #define EFI_WARN_UNKOWN_GLYPH EFIWARN(1) #define EFI_WARN_UNKNOWN_GLYPH EFIWARN(1) #define EFI_WARN_DELETE_FAILURE EFIWARN(2) #define EFI_WARN_WRITE_FAILURE EFIWARN(3) #define EFI_WARN_BUFFER_TOO_SMALL EFIWARN(4) #define EFI_WARN_STALE_DATA EFIWARN(5) #define EFI_WARN_FILE_SYSTEM EFIWARN(6) #define EFI_WARN_RESET_REQUIRED EFIWARN(7) #endif ncroxon-gnu-efi-157d47c/inc/efifs.h000066400000000000000000000047541471215650600171270ustar00rootroot00000000000000#ifndef _EFI_FS_H #define _EFI_FS_H /*++ Copyright (c) 1998 Intel Corporation Module Name: efifs.h Abstract: EFI File System structures Revision History --*/ // // EFI Partition header (normaly starts in LBA 1) // #define EFI_PARTITION_SIGNATURE 0x5053595320494249 #define EFI_PARTITION_REVISION 0x00010001 #define MIN_EFI_PARTITION_BLOCK_SIZE 512 #define EFI_PARTITION_LBA 1 typedef struct _EFI_PARTITION_HEADER { EFI_TABLE_HEADER Hdr; UINT32 DirectoryAllocationNumber; UINT32 BlockSize; EFI_LBA FirstUsableLba; EFI_LBA LastUsableLba; EFI_LBA UnusableSpace; EFI_LBA FreeSpace; EFI_LBA RootFile; EFI_LBA SecutiryFile; } EFI_PARTITION_HEADER; // // File header // #define EFI_FILE_HEADER_SIGNATURE 0x454c494620494249 #define EFI_FILE_HEADER_REVISION 0x00010000 #define EFI_FILE_STRING_SIZE 260 typedef struct _EFI_FILE_HEADER { EFI_TABLE_HEADER Hdr; UINT32 Class; UINT32 LBALOffset; EFI_LBA Parent; UINT64 FileSize; UINT64 FileAttributes; EFI_TIME FileCreateTime; EFI_TIME FileModificationTime; EFI_GUID VendorGuid; CHAR16 FileString[EFI_FILE_STRING_SIZE]; } EFI_FILE_HEADER; // // Return the file's first LBAL which is in the same // logical block as the file header // #define EFI_FILE_LBAL(a) ((EFI_LBAL *) (((CHAR8 *) (a)) + (a)->LBALOffset)) #define EFI_FILE_CLASS_FREE_SPACE 1 #define EFI_FILE_CLASS_EMPTY 2 #define EFI_FILE_CLASS_NORMAL 3 // // Logical Block Address List - the fundemental block // description structure // #define EFI_LBAL_SIGNATURE 0x4c41424c20494249 #define EFI_LBAL_REVISION 0x00010000 typedef struct _EFI_LBAL { EFI_TABLE_HEADER Hdr; UINT32 Class; EFI_LBA Parent; EFI_LBA Next; UINT32 ArraySize; UINT32 ArrayCount; } EFI_LBAL; // Array size #define EFI_LBAL_ARRAY_SIZE(lbal,offs,blks) \ (((blks) - (offs) - (lbal)->Hdr.HeaderSize) / sizeof(EFI_RL)) // // Logical Block run-length // typedef struct { EFI_LBA Start; UINT64 Length; } EFI_RL; // // Return the run-length structure from an LBAL header // #define EFI_LBAL_RL(a) ((EFI_RL*) (((CHAR8 *) (a)) + (a)->Hdr.HeaderSize)) #endif ncroxon-gnu-efi-157d47c/inc/efigpt.h000066400000000000000000000035121471215650600173000ustar00rootroot00000000000000#ifndef _EFI_GPT_H #define _EFI_GPT_H /*++ Copyright (c) 1998 Intel Corporation Module Name: EfiGpt.h Abstract: Include file for EFI partitioning scheme Revision History --*/ #define PRIMARY_PART_HEADER_LBA 1 typedef struct { EFI_TABLE_HEADER Header; EFI_LBA MyLBA; EFI_LBA AlternateLBA; EFI_LBA FirstUsableLBA; EFI_LBA LastUsableLBA; EFI_GUID DiskGUID; EFI_LBA PartitionEntryLBA; UINT32 NumberOfPartitionEntries; UINT32 SizeOfPartitionEntry; UINT32 PartitionEntryArrayCRC32; } EFI_PARTITION_TABLE_HEADER; #define EFI_PTAB_HEADER_ID "EFI PART" typedef struct { EFI_GUID PartitionTypeGUID; EFI_GUID UniquePartitionGUID; EFI_LBA StartingLBA; EFI_LBA EndingLBA; UINT64 Attributes; CHAR16 PartitionName[36]; } EFI_PARTITION_ENTRY; // // EFI Partition Attributes // #define EFI_PART_USED_BY_EFI 0x0000000000000001 #define EFI_PART_REQUIRED_TO_FUNCTION 0x0000000000000002 #define EFI_PART_USED_BY_OS 0x0000000000000004 #define EFI_PART_REQUIRED_BY_OS 0x0000000000000008 #define EFI_PART_BACKUP_REQUIRED 0x0000000000000010 #define EFI_PART_USER_DATA 0x0000000000000020 #define EFI_PART_CRITICAL_USER_DATA 0x0000000000000040 #define EFI_PART_REDUNDANT_PARTITION 0x0000000000000080 #define EFI_PART_TYPE_UNUSED_GUID \ { 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } #define EFI_PART_TYPE_EFI_SYSTEM_PART_GUID \ { 0xc12a7328, 0xf81f, 0x11d2, {0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b} } #define EFI_PART_TYPE_LEGACY_MBR_GUID \ { 0x024dee41, 0x33e7, 0x11d3, {0x9d, 0x69, 0x00, 0x08, 0xc7, 0x81, 0xf3, 0x9f} } #endif ncroxon-gnu-efi-157d47c/inc/efiip.h000066400000000000000000000312131471215650600171150ustar00rootroot00000000000000#ifndef _EFI_IP_H #define _EFI_IP_H /*++ Copyright (c) 2013 Intel Corporation --*/ #define EFI_IP4_SERVICE_BINDING_PROTOCOL \ {0xc51711e7,0xb4bf,0x404a,{0xbf,0xb8,0x0a,0x04, 0x8e,0xf1,0xff,0xe4}} #define EFI_IP4_PROTOCOL \ {0x41d94cd2,0x35b6,0x455a,{0x82,0x58,0xd4,0xe5,0x13,0x34,0xaa,0xdd}} #define EFI_IP6_SERVICE_BINDING_PROTOCOL \ {0xec835dd3,0xfe0f,0x617b,{0xa6,0x21,0xb3,0x50,0xc3,0xe1,0x33,0x88}} #define EFI_IP6_PROTOCOL \ {0x2c8759d5,0x5c2d,0x66ef,{0x92,0x5f,0xb6,0x6c,0x10,0x19,0x57,0xe2}} INTERFACE_DECL(_EFI_IP4); INTERFACE_DECL(_EFI_IP6); typedef struct { EFI_HANDLE InstanceHandle; EFI_IPv4_ADDRESS Ip4Address; EFI_IPv4_ADDRESS SubnetMask; } EFI_IP4_ADDRESS_PAIR; typedef struct { EFI_HANDLE DriverHandle; UINT32 AddressCount; EFI_IP4_ADDRESS_PAIR AddressPairs[1]; } EFI_IP4_VARIABLE_DATA; typedef struct { UINT8 DefaultProtocol; BOOLEAN AcceptAnyProtocol; BOOLEAN AcceptIcmpErrors; BOOLEAN AcceptBroadcast; BOOLEAN AcceptPromiscuous; BOOLEAN UseDefaultAddress; EFI_IPv4_ADDRESS StationAddress; EFI_IPv4_ADDRESS SubnetMask; UINT8 TypeOfService; UINT8 TimeToLive; BOOLEAN DoNotFragment; BOOLEAN RawData; UINT32 ReceiveTimeout; UINT32 TransmitTimeout; } EFI_IP4_CONFIG_DATA; typedef struct { EFI_IPv4_ADDRESS SubnetAddress; EFI_IPv4_ADDRESS SubnetMask; EFI_IPv4_ADDRESS GatewayAddress; } EFI_IP4_ROUTE_TABLE; typedef struct { UINT8 Type; UINT8 Code; } EFI_IP4_ICMP_TYPE; typedef struct { BOOLEAN IsStarted; UINT32 MaxPacketSize; EFI_IP4_CONFIG_DATA ConfigData; BOOLEAN IsConfigured; UINT32 GroupCount; EFI_IPv4_ADDRESS *GroupTable; UINT32 RouteCount; EFI_IP4_ROUTE_TABLE *RouteTable; UINT32 IcmpTypeCount; EFI_IP4_ICMP_TYPE *IcmpTypeList; } EFI_IP4_MODE_DATA; typedef EFI_STATUS (EFIAPI *EFI_IP4_GET_MODE_DATA) ( IN struct _EFI_IP4 *This, OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP4_CONFIGURE) ( IN struct _EFI_IP4 *This, IN EFI_IP4_CONFIG_DATA *IpConfigData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP4_GROUPS) ( IN struct _EFI_IP4 *This, IN BOOLEAN JoinFlag, IN EFI_IPv4_ADDRESS *GroupAddress OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP4_ROUTES) ( IN struct _EFI_IP4 *This, IN BOOLEAN DeleteRoute, IN EFI_IPv4_ADDRESS *SubnetAddress, IN EFI_IPv4_ADDRESS *SubnetMask, IN EFI_IPv4_ADDRESS *GatewayAddress ); #pragma pack(1) typedef struct { UINT8 HeaderLength:4; UINT8 Version:4; UINT8 TypeOfService; UINT16 TotalLength; UINT16 Identification; UINT16 Fragmentation; UINT8 TimeToLive; UINT8 Protocol; UINT16 Checksum; EFI_IPv4_ADDRESS SourceAddress; EFI_IPv4_ADDRESS DestinationAddress; } EFI_IP4_HEADER; #pragma pack() typedef struct { UINT32 FragmentLength; VOID *FragmentBuffer; } EFI_IP4_FRAGMENT_DATA; typedef struct { EFI_TIME TimeStamp; EFI_EVENT RecycleSignal; UINT32 HeaderLength; EFI_IP4_HEADER *Header; UINT32 OptionsLength; VOID *Options; UINT32 DataLength; UINT32 FragmentCount; EFI_IP4_FRAGMENT_DATA FragmentTable[1]; } EFI_IP4_RECEIVE_DATA; typedef struct { EFI_IPv4_ADDRESS SourceAddress; EFI_IPv4_ADDRESS GatewayAddress; UINT8 Protocol; UINT8 TypeOfService; UINT8 TimeToLive; BOOLEAN DoNotFragment; } EFI_IP4_OVERRIDE_DATA; typedef struct { EFI_IPv4_ADDRESS DestinationAddress; EFI_IP4_OVERRIDE_DATA *OverrideData; UINT32 OptionsLength; VOID *OptionsBuffer; UINT32 TotalDataLength; UINT32 FragmentCount; EFI_IP4_FRAGMENT_DATA FragmentTable[1]; } EFI_IP4_TRANSMIT_DATA; typedef struct { EFI_EVENT Event; EFI_STATUS Status; union { EFI_IP4_RECEIVE_DATA *RxData; EFI_IP4_TRANSMIT_DATA *TxData; } Packet; } EFI_IP4_COMPLETION_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_IP4_TRANSMIT) ( IN struct _EFI_IP4 *This, IN EFI_IP4_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_IP4_RECEIVE) ( IN struct _EFI_IP4 *This, IN EFI_IP4_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_IP4_CANCEL)( IN struct _EFI_IP4 *This, IN EFI_IP4_COMPLETION_TOKEN *Token OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP4_POLL) ( IN struct _EFI_IP4 *This ); typedef struct _EFI_IP4 { EFI_IP4_GET_MODE_DATA GetModeData; EFI_IP4_CONFIGURE Configure; EFI_IP4_GROUPS Groups; EFI_IP4_ROUTES Routes; EFI_IP4_TRANSMIT Transmit; EFI_IP4_RECEIVE Receive; EFI_IP4_CANCEL Cancel; EFI_IP4_POLL Poll; } EFI_IP4; typedef struct { UINT8 DefaultProtocol; BOOLEAN AcceptAnyProtocol; BOOLEAN AcceptIcmpErrors; BOOLEAN AcceptPromiscuous; EFI_IPv6_ADDRESS DestinationAddress; EFI_IPv6_ADDRESS StationAddress; UINT8 TrafficClass; UINT8 HopLimit; UINT32 FlowLabel; UINT32 ReceiveTimeout; UINT32 TransmitTimeout; } EFI_IP6_CONFIG_DATA; typedef struct { EFI_IPv6_ADDRESS Address; UINT8 PrefixLength; } EFI_IP6_ADDRESS_INFO; typedef struct { EFI_IPv6_ADDRESS Gateway; EFI_IPv6_ADDRESS Destination; UINT8 PrefixLength; } EFI_IP6_ROUTE_TABLE; typedef enum { EfiNeighborInComplete, EfiNeighborReachable, EfiNeighborStale, EfiNeighborDelay, EfiNeighborProbe } EFI_IP6_NEIGHBOR_STATE; typedef struct { EFI_IPv6_ADDRESS Neighbor; EFI_MAC_ADDRESS LinkAddress; EFI_IP6_NEIGHBOR_STATE State; } EFI_IP6_NEIGHBOR_CACHE; typedef struct { UINT8 Type; UINT8 Code; } EFI_IP6_ICMP_TYPE; //*********************************************************** // ICMPv6 type definitions for error messages //*********************************************************** #define ICMP_V6_DEST_UNREACHABLE 0x1 #define ICMP_V6_PACKET_TOO_BIG 0x2 #define ICMP_V6_TIME_EXCEEDED 0x3 #define ICMP_V6_PARAMETER_PROBLEM 0x4 //*********************************************************** // ICMPv6 type definition for informational messages //*********************************************************** #define ICMP_V6_ECHO_REQUEST 0x80 #define ICMP_V6_ECHO_REPLY 0x81 #define ICMP_V6_LISTENER_QUERY 0x82 #define ICMP_V6_LISTENER_REPORT 0x83 #define ICMP_V6_LISTENER_DONE 0x84 #define ICMP_V6_ROUTER_SOLICIT 0x85 #define ICMP_V6_ROUTER_ADVERTISE 0x86 #define ICMP_V6_NEIGHBOR_SOLICIT 0x87 #define ICMP_V6_NEIGHBOR_ADVERTISE 0x88 #define ICMP_V6_REDIRECT 0x89 #define ICMP_V6_LISTENER_REPORT_2 0x8F //*********************************************************** // ICMPv6 code definitions for ICMP_V6_DEST_UNREACHABLE //*********************************************************** #define ICMP_V6_NO_ROUTE_TO_DEST 0x0 #define ICMP_V6_COMM_PROHIBITED 0x1 #define ICMP_V6_BEYOND_SCOPE 0x2 #define ICMP_V6_ADDR_UNREACHABLE 0x3 #define ICMP_V6_PORT_UNREACHABLE 0x4 #define ICMP_V6_SOURCE_ADDR_FAILED 0x5 #define ICMP_V6_ROUTE_REJECTED 0x6 //*********************************************************** // ICMPv6 code definitions for ICMP_V6_TIME_EXCEEDED //*********************************************************** #define ICMP_V6_TIMEOUT_HOP_LIMIT 0x0 #define ICMP_V6_TIMEOUT_REASSEMBLE 0x1 //*********************************************************** // ICMPv6 code definitions for ICMP_V6_PARAMETER_PROBLEM //*********************************************************** #define ICMP_V6_ERRONEOUS_HEADER 0x0 #define ICMP_V6_UNRECOGNIZE_NEXT_HDR 0x1 #define ICMP_V6_UNRECOGNIZE_OPTION 0x2 typedef struct { BOOLEAN IsStarted; UINT32 MaxPacketSize; EFI_IP6_CONFIG_DATA ConfigData; BOOLEAN IsConfigured; UINT32 AddressCount; EFI_IP6_ADDRESS_INFO *AddressList; UINT32 GroupCount; EFI_IPv6_ADDRESS *GroupTable; UINT32 RouteCount; EFI_IP6_ROUTE_TABLE *RouteTable; UINT32 NeighborCount; EFI_IP6_NEIGHBOR_CACHE *NeighborCache; UINT32 PrefixCount; EFI_IP6_ADDRESS_INFO *PrefixTable; UINT32 IcmpTypeCount; EFI_IP6_ICMP_TYPE *IcmpTypeList; } EFI_IP6_MODE_DATA; typedef EFI_STATUS (EFIAPI *EFI_IP6_GET_MODE_DATA) ( IN struct _EFI_IP6 *This, OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL, OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP6_CONFIGURE) ( IN struct _EFI_IP6 *This, IN EFI_IP6_CONFIG_DATA *Ip6ConfigData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP6_GROUPS) ( IN struct _EFI_IP6 *This, IN BOOLEAN JoinFlag, IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP6_ROUTES) ( IN struct _EFI_IP6 *This, IN BOOLEAN DeleteRoute, IN EFI_IPv6_ADDRESS *Destination OPTIONAL, IN UINT8 PrefixLength, IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP6_NEIGHBORS) ( IN struct _EFI_IP6 *This, IN BOOLEAN DeleteFlag, IN EFI_IPv6_ADDRESS *TargetIp6Address, IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL, IN UINT32 Timeout, IN BOOLEAN Override ); typedef struct _EFI_IP6_FRAGMENT_DATA { UINT32 FragmentLength; VOID *FragmentBuffer; } EFI_IP6_FRAGMENT_DATA; typedef struct _EFI_IP6_OVERRIDE_DATA { UINT8 Protocol; UINT8 HopLimit; UINT32 FlowLabel; } EFI_IP6_OVERRIDE_DATA; typedef struct _EFI_IP6_TRANSMIT_DATA { EFI_IPv6_ADDRESS DestinationAddress; EFI_IP6_OVERRIDE_DATA *OverrideData; UINT32 ExtHdrsLength; VOID *ExtHdrs; UINT8 NextHeader; UINT32 DataLength; UINT32 FragmentCount; EFI_IP6_FRAGMENT_DATA FragmentTable[1]; } EFI_IP6_TRANSMIT_DATA; #pragma pack(1) typedef struct _EFI_IP6_HEADER { UINT8 TrafficClassH:4; UINT8 Version:4; UINT8 FlowLabelH:4; UINT8 TrafficClassL:4; UINT16 FlowLabelL; UINT16 PayloadLength; UINT8 NextHeader; UINT8 HopLimit; EFI_IPv6_ADDRESS SourceAddress; EFI_IPv6_ADDRESS DestinationAddress; } EFI_IP6_HEADER; #pragma pack() typedef struct _EFI_IP6_RECEIVE_DATA { EFI_TIME TimeStamp; EFI_EVENT RecycleSignal; UINT32 HeaderLength; EFI_IP6_HEADER *Header; UINT32 DataLength; UINT32 FragmentCount; EFI_IP6_FRAGMENT_DATA FragmentTable[1]; } EFI_IP6_RECEIVE_DATA; typedef struct { EFI_EVENT Event; EFI_STATUS Status; union { EFI_IP6_RECEIVE_DATA *RxData; EFI_IP6_TRANSMIT_DATA *TxData; } Packet; } EFI_IP6_COMPLETION_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_IP6_TRANSMIT) ( IN struct _EFI_IP6 *This, IN EFI_IP6_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_IP6_RECEIVE) ( IN struct _EFI_IP6 *This, IN EFI_IP6_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_IP6_CANCEL)( IN struct _EFI_IP6 *This, IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_IP6_POLL) ( IN struct _EFI_IP6 *This ); typedef struct _EFI_IP6 { EFI_IP6_GET_MODE_DATA GetModeData; EFI_IP6_CONFIGURE Configure; EFI_IP6_GROUPS Groups; EFI_IP6_ROUTES Routes; EFI_IP6_NEIGHBORS Neighbors; EFI_IP6_TRANSMIT Transmit; EFI_IP6_RECEIVE Receive; EFI_IP6_CANCEL Cancel; EFI_IP6_POLL Poll; } EFI_IP6; #endif /* _EFI_IP_H */ ncroxon-gnu-efi-157d47c/inc/efilib.h000066400000000000000000000563711471215650600172670ustar00rootroot00000000000000#ifndef _EFILIB_INCLUDE_ #define _EFILIB_INCLUDE_ /*++ Copyright (c) 2000 Intel Corporation Module Name: efilib.h Abstract: EFI library functions Revision History --*/ #ifdef __cplusplus extern "C" { #endif #include "efidebug.h" #include "efipart.h" #if defined(_M_X64) || defined(__x86_64__) || defined(__amd64__) #include "x86_64/efilibplat.h" #elif defined(_M_IX86) || defined(__i386__) #include "ia32/efilibplat.h" #elif defined(_M_IA64) || defined(__ia64__) #include "ia64/efilibplat.h" #elif defined (_M_ARM64) || defined(__aarch64__) #include "aarch64/efilibplat.h" #elif defined (_M_ARM) || defined(__arm__) #include "arm/efilibplat.h" #elif defined (_M_MIPS64) || defined(__mips64__) || defined(__mips64) #include "mips64el/efilibplat.h" #elif defined (__riscv) && __riscv_xlen == 64 #include "riscv64/efilibplat.h" #elif defined (__loongarch64) #include "loongarch64/efilibplat.h" #endif #include "efilink.h" #include "efirtlib.h" #include "efistdarg.h" #include "pci22.h" #include "libsmbios.h" // // Public read-only data in the EFI library // extern EFI_SYSTEM_TABLE *ST; #define gST ST extern EFI_BOOT_SERVICES *BS; #define gBS BS extern EFI_RUNTIME_SERVICES *RT; #define gRT RT extern EFI_GUID gEfiDevicePathProtocolGuid; #define DevicePathProtocol gEfiDevicePathProtocolGuid extern EFI_GUID gEfiDevicePathToTextProtocolGuid; #define DevicePathToTextProtocol gEfiDevicePathToTextProtocolGuid extern EFI_GUID gEfiDevicePathFromTextProtocolGuid; #define DevicePathFromTextProtocol gEfiDevicePathFromTextProtocolGuid extern EFI_GUID gEfiDevicePathUtilitiesProtocolGuid; #define DevicePathUtilitiesProtocol gEfiDevicePathUtilitiesProtocolGuid extern EFI_GUID gEfiLoadedImageProtocolGuid; #define LoadedImageProtocol gEfiLoadedImageProtocolGuid extern EFI_GUID gEfiSimpleTextInProtocolGuid; #define TextInProtocol gEfiSimpleTextInProtocolGuid extern EFI_GUID gEfiSimpleTextOutProtocolGuid; #define TextOutProtocol gEfiSimpleTextOutProtocolGuid extern EFI_GUID gEfiGraphicsOutputProtocolGuid; #define GraphicsOutputProtocol gEfiGraphicsOutputProtocolGuid extern EFI_GUID gEfiEdidDiscoveredProtocolGuid; #define EdidDiscoveredProtocol gEfiEdidDiscoveredProtocolGuid extern EFI_GUID gEfiEdidActiveProtocolGuid; #define EdidActiveProtocol gEfiEdidActiveProtocolGuid extern EFI_GUID gEfiEdidOverrideProtocolGuid; #define EdidOverrideProtocol gEfiEdidOverrideProtocolGuid extern EFI_GUID gEfiBlockIoProtocolGuid; #define BlockIoProtocol gEfiBlockIoProtocolGuid extern EFI_GUID gEfiBlockIo2ProtocolGuid; #define BlockIo2Protocol gEfiBlockIo2ProtocolGuid extern EFI_GUID gEfiDiskIoProtocolGuid; #define DiskIoProtocol gEfiDiskIoProtocolGuid extern EFI_GUID gEfiDiskIo2ProtocolGuid; #define DiskIo2Protocol gEfiDiskIo2ProtocolGuid extern EFI_GUID gEfiSimpleFileSystemProtocolGuid; #define FileSystemProtocol gEfiSimpleFileSystemProtocolGuid extern EFI_GUID gEfiLoadFileProtocolGuid; #define LoadFileProtocol gEfiLoadFileProtocolGuid extern EFI_GUID gEfiDeviceIoProtocolGuid; #define DeviceIoProtocol gEfiDeviceIoProtocolGuid extern EFI_GUID VariableStoreProtocol; extern EFI_GUID LegacyBootProtocol; extern EFI_GUID gEfiUnicodeCollationProtocolGuid; #define UnicodeCollationProtocol gEfiUnicodeCollationProtocolGuid extern EFI_GUID gEfiSerialIoProtocolGuid; #define SerialIoProtocol gEfiSerialIoProtocolGuid extern EFI_GUID VgaClassProtocol; extern EFI_GUID TextOutSpliterProtocol; extern EFI_GUID ErrorOutSpliterProtocol; extern EFI_GUID TextInSpliterProtocol; extern EFI_GUID gEfiSimpleNetworkProtocolGuid; #define SimpleNetworkProtocol gEfiSimpleNetworkProtocolGuid extern EFI_GUID gEfiPxeBaseCodeProtocolGuid; #define PxeBaseCodeProtocol gEfiPxeBaseCodeProtocolGuid extern EFI_GUID gEfiPxeBaseCodeCallbackProtocolGuid; #define PxeCallbackProtocol gEfiPxeBaseCodeCallbackProtocolGuid extern EFI_GUID gEfiNetworkInterfaceIdentifierProtocolGuid; #define NetworkInterfaceIdentifierProtocol gEfiNetworkInterfaceIdentifierProtocolGuid extern EFI_GUID gEFiUiInterfaceProtocolGuid; #define UiProtocol gEFiUiInterfaceProtocolGuid extern EFI_GUID InternalShellProtocol; extern EFI_GUID gEfiPciIoProtocolGuid; #define PciIoProtocol gEfiPciIoProtocolGuid extern EFI_GUID gEfiPciRootBridgeIoProtocolGuid; extern EFI_GUID gEfiDriverBindingProtocolGuid; #define DriverBindingProtocol gEfiDriverBindingProtocolGuid extern EFI_GUID gEfiComponentNameProtocolGuid; #define ComponentNameProtocol gEfiComponentNameProtocolGuid extern EFI_GUID gEfiComponentName2ProtocolGuid; #define ComponentName2Protocol gEfiComponentName2ProtocolGuid extern EFI_GUID gEfiHashProtocolGuid; #define HashProtocol gEfiHashProtocolGuid extern EFI_GUID gEfiPlatformDriverOverrideProtocolGuid; #define PlatformDriverOverrideProtocol gEfiPlatformDriverOverrideProtocolGuid extern EFI_GUID gEfiBusSpecificDriverOverrideProtocolGuid; #define BusSpecificDriverOverrideProtocol gEfiBusSpecificDriverOverrideProtocolGuid extern EFI_GUID gEfiDriverFamilyOverrideProtocolGuid; #define DriverFamilyOverrideProtocol gEfiDriverFamilyOverrideProtocolGuid extern EFI_GUID gEfiEbcProtocolGuid; extern EFI_GUID gEfiMpServicesProtocolGuid; #define MpServicesProtocol gEfiMpServicesProtocolGuid extern EFI_GUID gEfiGlobalVariableGuid; #define EfiGlobalVariable gEfiGlobalVariableGuid extern EFI_GUID gEfiFileInfoGuid; #define GenericFileInfo gEfiFileInfoGuid extern EFI_GUID gEfiFileSystemInfoGuid; #define FileSystemInfo gEfiFileSystemInfoGuid extern EFI_GUID gEfiFileSystemVolumeLabelInfoIdGuid; #define FileSystemVolumeLabelInfo gEfiFileSystemVolumeLabelInfoIdGuid extern EFI_GUID gEfiPcAnsiGuid; #define PcAnsiProtocol gEfiPcAnsiGuid extern EFI_GUID gEfiVT100Guid; #define Vt100Protocol gEfiVT100Guid extern EFI_GUID gEfiVT100PlusGuid; extern EFI_GUID gEfiVTUTF8Guid; extern EFI_GUID NullGuid; extern EFI_GUID UnknownDevice; extern EFI_GUID EfiPartTypeSystemPartitionGuid; extern EFI_GUID EfiPartTypeLegacyMbrGuid; extern EFI_GUID MpsTableGuid; extern EFI_GUID AcpiTableGuid; extern EFI_GUID gEfiSmbiosTableGuid; #define SMBIOSTableGuid gEfiSmbiosTableGuid extern EFI_GUID gEfiSmbios3TableGuid; #define SMBIOS3TableGuid gEfiSmbios3TableGuid extern EFI_GUID SalSystemTableGuid; extern EFI_GUID EfiDtbTableGuid; extern EFI_GUID SimplePointerProtocol; extern EFI_GUID AbsolutePointerProtocol; extern EFI_GUID gEfiDebugImageInfoTableGuid; extern EFI_GUID gEfiDebugSupportProtocolGuid; extern EFI_GUID SimpleTextInputExProtocol; extern EFI_GUID ShellProtocolGuid; extern EFI_GUID ShellParametersProtocolGuid; extern EFI_GUID ShellDynamicCommandProtocolGuid; // // EFI Variable strings // #define LOAD_OPTION_ACTIVE 0x00000001 #define VarLanguageCodes u"LangCodes" #define VarLanguage u"Lang" #define VarTimeout u"Timeout" #define VarConsoleInp u"ConIn" #define VarConsoleOut u"ConOut" #define VarErrorOut u"ErrOut" #define VarBootOption u"Boot%04x" #define VarBootOrder u"BootOrder" #define VarBootNext u"BootNext" #define VarBootCurrent u"BootCurrent" #define VarDriverOption u"Driver%04x" #define VarDriverOrder u"DriverOrder" #define VarConsoleInpDev u"ConInDev" #define VarConsoleOutDev u"ConOutDev" #define VarErrorOutDev u"ErrOutDev" #define LanguageCodeEnglish "eng" extern EFI_DEVICE_PATH RootDevicePath[]; extern EFI_DEVICE_PATH EndDevicePath[]; extern EFI_DEVICE_PATH EndInstanceDevicePath[]; // // Other public data in the EFI library // extern EFI_MEMORY_TYPE PoolAllocationType; // // INTERNAL - Name is internal to the component (i.e., directory) // BOOTSERVCE - Name of a boot service function // #define INTERNAL #define BOOTSERVICE // // Prototypes // VOID InitializeLib ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); VOID InitializeUnicodeSupport ( CHAR8 *LangCode ); VOID EFIDebugVariable ( VOID ); VOID Exit( IN EFI_STATUS ExitStatus, IN UINTN ExitDataSize, IN CHAR16 *ExitData OPTIONAL ); INTN GetShellArgcArgv( EFI_HANDLE ImageHandle, CHAR16 **Argv[] /* Statically allocated */ ); VOID SetCrc ( IN OUT EFI_TABLE_HEADER *Hdr ); VOID SetCrcAltSize ( IN UINTN Size, IN OUT EFI_TABLE_HEADER *Hdr ); BOOLEAN CheckCrc ( IN UINTN MaxSize, IN OUT EFI_TABLE_HEADER *Hdr ); BOOLEAN CheckCrcAltSize ( IN UINTN MaxSize, IN UINTN Size, IN OUT EFI_TABLE_HEADER *Hdr ); UINT32 CalculateCrc ( UINT8 *pt, UINTN Size ); VOID ZeroMem ( IN VOID *Buffer, IN UINTN Size ); VOID EFIAPI SetMem ( IN VOID *Buffer, IN UINTN Size, IN UINT8 Value ); VOID EFIAPI CopyMem_1 ( IN VOID *Dest, IN VOID *Src, IN UINTN len ); VOID EFIAPI CopyMemC ( IN VOID *Dest, IN CONST VOID *Src, IN UINTN len ); INTN CompareMem ( IN CONST VOID *Dest, IN CONST VOID *Src, IN UINTN len ); INTN StrCmp ( IN CONST CHAR16 *s1, IN CONST CHAR16 *s2 ); INTN StrnCmp ( IN CONST CHAR16 *s1, IN CONST CHAR16 *s2, IN UINTN len ); INTN StriCmp ( IN CONST CHAR16 *s1, IN CONST CHAR16 *s2 ); VOID StrLwr ( IN CHAR16 *Str ); VOID StrUpr ( IN CHAR16 *Str ); VOID StrCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ); VOID StrnCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ); CHAR16 * StpCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ); CHAR16 * StpnCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ); VOID StrCat ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ); VOID StrnCat ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ); UINTN StrLen ( IN CONST CHAR16 *s1 ); UINTN StrnLen ( IN CONST CHAR16 *s1, IN UINTN Len ); UINTN StrSize ( IN CONST CHAR16 *s1 ); CHAR16 * StrDuplicate ( IN CONST CHAR16 *Src ); UINTN AsciiStrLen ( IN CONST CHAR8 *s1 ); UINTN AsciiStrCmp ( IN CONST CHAR8 *s1, IN CONST CHAR8 *s2 ); UINTN AsciiStrnCmp ( IN CONST CHAR8 *s1, IN CONST CHAR8 *s2, IN UINTN len ); // // For compatibility with previous gnu-efi versions // #define strlena AsciiStrLen #define strcmpa AsciiStrCmp #define strncmpa AsciiStrnCmp UINTN xtoi ( CONST CHAR16 *str ); UINTN Atoi ( CONST CHAR16 *str ); BOOLEAN MetaMatch ( IN CHAR16 *String, IN CHAR16 *Pattern ); BOOLEAN MetaiMatch ( IN CHAR16 *String, IN CHAR16 *Pattern ); UINT64 LShiftU64 ( IN UINT64 Operand, IN UINTN Count ); UINT64 RShiftU64 ( IN UINT64 Operand, IN UINTN Count ); UINT64 MultU64x32 ( IN UINT64 Multiplicand, IN UINTN Multiplier ); UINT64 DivU64x32 ( IN UINT64 Dividend, IN UINTN Divisor, OUT UINTN *Remainder OPTIONAL ); VOID InitializeLock ( IN OUT FLOCK *Lock, IN EFI_TPL Priority ); VOID AcquireLock ( IN FLOCK *Lock ); VOID ReleaseLock ( IN FLOCK *Lock ); BOOLEAN EFIAPI CompareGuid_1 ( IN CONST EFI_GUID *Guid1, IN CONST EFI_GUID *Guid2 ); VOID * AllocatePool ( IN UINTN Size ); VOID * AllocateZeroPool ( IN UINTN Size ); VOID * EFIAPI ReallocatePool_1 ( IN UINTN OldSize, IN UINTN NewSize, IN VOID *OldPool OPTIONAL ); VOID FreePool ( IN VOID *p ); VOID Output ( IN CHAR16 *Str ); VOID Input ( IN CHAR16 *Prompt OPTIONAL, OUT CHAR16 *InStr, IN UINTN StrLen ); VOID IInput ( IN SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut, IN SIMPLE_INPUT_INTERFACE *ConIn, IN CHAR16 *Prompt OPTIONAL, OUT CHAR16 *InStr, IN UINTN StrLen ); UINTN Print ( IN CONST CHAR16 *fmt, ... ); UINTN VPrint ( IN CONST CHAR16 *fmt, va_list args ); UINTN UnicodeSPrint ( OUT CHAR16 *Str, IN UINTN StrSize, IN CONST CHAR16 *fmt, ... ); UINTN UnicodeVSPrint ( OUT CHAR16 *Str, IN UINTN StrSize, IN CONST CHAR16 *fmt, va_list args ); CHAR16 * VPoolPrint ( IN CONST CHAR16 *fmt, va_list args ); CHAR16 * PoolPrint ( IN CONST CHAR16 *fmt, ... ); typedef struct { CHAR16 *str; UINTN len; UINTN maxlen; } POOL_PRINT; CHAR16 * CatPrint ( IN OUT POOL_PRINT *Str, IN CONST CHAR16 *fmt, ... ); UINTN PrintAt ( IN UINTN Column, IN UINTN Row, IN CONST CHAR16 *fmt, ... ); UINTN IPrint ( IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, IN CONST CHAR16 *fmt, ... ); UINTN IPrintAt ( IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, IN UINTN Column, IN UINTN Row, IN CONST CHAR16 *fmt, ... ); UINTN AsciiPrint ( IN CONST CHAR8 *fmt, ... ); UINTN AsciiVSPrint( OUT CHAR8 *Str, IN UINTN StrSize, IN CONST CHAR8 *fmt, va_list args ); // // For compatibility with previous gnu-efi versions // #define SPrint UnicodeSPrint #define VSPrint UnicodeVSPrint #define APrint AsciiPrint VOID ValueToHex ( IN CHAR16 *Buffer, IN UINT64 v ); VOID ValueToString ( IN CHAR16 *Buffer, IN BOOLEAN Comma, IN INT64 v ); VOID FloatToString ( IN CHAR16 *Buffer, IN BOOLEAN Comma, IN double v ); VOID TimeToString ( OUT CHAR16 *Buffer, IN EFI_TIME *Time ); VOID GuidToString ( OUT CHAR16 *Buffer, IN EFI_GUID *Guid ); VOID StatusToString ( OUT CHAR16 *Buffer, EFI_STATUS Status ); VOID DumpHex ( IN UINTN Indent, IN UINTN Offset, IN UINTN DataSize, IN VOID *UserData ); BOOLEAN GrowBuffer( IN OUT EFI_STATUS *Status, IN OUT VOID **Buffer, IN UINTN BufferSize ); EFI_MEMORY_DESCRIPTOR * LibMemoryMap ( OUT UINTN *NoEntries, OUT UINTN *MapKey, OUT UINTN *DescriptorSize, OUT UINT32 *DescriptorVersion ); VOID * LibGetVariable ( IN CHAR16 *Name, IN EFI_GUID *VendorGuid ); VOID * LibGetVariableAndSize ( IN CHAR16 *Name, IN EFI_GUID *VendorGuid, OUT UINTN *VarSize ); EFI_STATUS LibDeleteVariable ( IN CHAR16 *VarName, IN EFI_GUID *VarGuid ); EFI_STATUS LibSetNVVariable ( IN CHAR16 *VarName, IN EFI_GUID *VarGuid, IN UINTN DataSize, IN VOID *Data ); EFI_STATUS LibSetVariable ( IN CHAR16 *VarName, IN EFI_GUID *VarGuid, IN UINTN DataSize, IN VOID *Data ); EFI_STATUS LibInsertToTailOfBootOrder ( IN UINT16 BootOption, IN BOOLEAN OnlyInsertIfEmpty ); EFI_STATUS LibLocateProtocol ( IN EFI_GUID *ProtocolGuid, OUT VOID **Interface ); EFI_STATUS LibLocateHandle ( IN EFI_LOCATE_SEARCH_TYPE SearchType, IN EFI_GUID *Protocol OPTIONAL, IN VOID *SearchKey OPTIONAL, IN OUT UINTN *NoHandles, OUT EFI_HANDLE **Buffer ); EFI_STATUS LibLocateHandleByDiskSignature ( IN UINT8 MBRType, IN UINT8 SignatureType, IN VOID *Signature, IN OUT UINTN *NoHandles, OUT EFI_HANDLE **Buffer ); EFI_STATUS LibInstallProtocolInterfaces ( IN OUT EFI_HANDLE *Handle, ... ); VOID LibUninstallProtocolInterfaces ( IN EFI_HANDLE Handle, ... ); EFI_STATUS LibReinstallProtocolInterfaces ( IN OUT EFI_HANDLE *Handle, ... ); EFI_EVENT LibCreateProtocolNotifyEvent ( IN EFI_GUID *ProtocolGuid, IN EFI_TPL NotifyTpl, IN EFI_EVENT_NOTIFY NotifyFunction, IN VOID *NotifyContext, OUT VOID *Registration ); EFI_STATUS WaitForSingleEvent ( IN EFI_EVENT Event, IN UINT64 Timeout OPTIONAL ); VOID WaitForEventWithTimeout ( IN EFI_EVENT Event, IN UINTN Timeout, IN UINTN Row, IN UINTN Column, IN CHAR16 *String, IN EFI_INPUT_KEY TimeoutKey, OUT EFI_INPUT_KEY *Key ); EFI_FILE_HANDLE LibOpenRoot ( IN EFI_HANDLE DeviceHandle ); EFI_FILE_INFO * LibFileInfo ( IN EFI_FILE_HANDLE FHand ); EFI_FILE_SYSTEM_INFO * LibFileSystemInfo ( IN EFI_FILE_HANDLE FHand ); EFI_FILE_SYSTEM_VOLUME_LABEL_INFO * LibFileSystemVolumeLabelInfo ( IN EFI_FILE_HANDLE FHand ); BOOLEAN ValidMBR( IN MASTER_BOOT_RECORD *Mbr, IN EFI_BLOCK_IO *BlkIo ); BOOLEAN LibMatchDevicePaths ( IN EFI_DEVICE_PATH *Multi, IN EFI_DEVICE_PATH *Single ); EFI_DEVICE_PATH * LibDuplicateDevicePathInstance ( IN EFI_DEVICE_PATH *DevPath ); EFI_DEVICE_PATH * DevicePathFromHandle ( IN EFI_HANDLE Handle ); EFI_DEVICE_PATH * DevicePathInstance ( IN OUT EFI_DEVICE_PATH **DevicePath, OUT UINTN *Size ); UINTN DevicePathInstanceCount ( IN EFI_DEVICE_PATH *DevicePath ); EFI_DEVICE_PATH * AppendDevicePath ( IN EFI_DEVICE_PATH *Src1, IN EFI_DEVICE_PATH *Src2 ); EFI_DEVICE_PATH * AppendDevicePathNode ( IN EFI_DEVICE_PATH *Src1, IN EFI_DEVICE_PATH *Src2 ); EFI_DEVICE_PATH* AppendDevicePathInstance ( IN EFI_DEVICE_PATH *Src, IN EFI_DEVICE_PATH *Instance ); EFI_DEVICE_PATH * FileDevicePath ( IN EFI_HANDLE Device OPTIONAL, IN CHAR16 *FileName ); UINTN DevicePathSize ( IN EFI_DEVICE_PATH *DevPath ); EFI_DEVICE_PATH * DuplicateDevicePath ( IN EFI_DEVICE_PATH *DevPath ); EFI_DEVICE_PATH * UnpackDevicePath ( IN EFI_DEVICE_PATH *DevPath ); EFI_STATUS LibDevicePathToInterface ( IN EFI_GUID *Protocol, IN EFI_DEVICE_PATH *FilePath, OUT VOID **Interface ); CHAR16 * DevicePathToStr ( EFI_DEVICE_PATH *DevPath ); // // BugBug: I need my own include files // typedef struct { UINT8 Register; UINT8 Function; UINT8 Device; UINT8 Bus; UINT32 Reserved; } EFI_ADDRESS; typedef union { UINT64 Address; EFI_ADDRESS EfiAddress; } EFI_PCI_ADDRESS_UNION; EFI_STATUS PciFindDeviceClass ( IN OUT EFI_PCI_ADDRESS_UNION *Address, IN UINT8 BaseClass, IN UINT8 SubClass ); EFI_STATUS PciFindDevice ( IN OUT EFI_PCI_ADDRESS_UNION *DeviceAddress, IN UINT16 VendorId, IN UINT16 DeviceId, IN OUT PCI_TYPE00 *Pci ); // // SIMPLE_READ_FILE object used to access files // typedef VOID *SIMPLE_READ_FILE; EFI_STATUS OpenSimpleReadFile ( IN BOOLEAN BootPolicy, IN VOID *SourceBuffer OPTIONAL, IN UINTN SourceSize, IN OUT EFI_DEVICE_PATH **FilePath, OUT EFI_HANDLE *DeviceHandle, OUT SIMPLE_READ_FILE *SimpleReadHandle ); EFI_STATUS ReadSimpleReadFile ( IN SIMPLE_READ_FILE SimpleReadHandle, IN UINTN Offset, IN OUT UINTN *ReadSize, OUT VOID *Buffer ); VOID CloseSimpleReadFile ( IN SIMPLE_READ_FILE SimpleReadHandle ); VOID InitializeGuid ( VOID ); UINT8 DecimaltoBCD( IN UINT8 DecValue ); UINT8 BCDtoDecimal( IN UINT8 BcdValue ); EFI_STATUS LibGetSystemConfigurationTable( IN EFI_GUID *TableGuid, IN OUT VOID **Table ); BOOLEAN LibIsValidTextGraphics ( IN CHAR16 Graphic, OUT CHAR8 *PcAnsi, OPTIONAL OUT CHAR8 *Ascii OPTIONAL ); BOOLEAN IsValidAscii ( IN CHAR16 Ascii ); BOOLEAN IsValidEfiCntlChar ( IN CHAR16 c ); CHAR16 * LibGetUiString ( IN EFI_HANDLE Handle, IN UI_STRING_TYPE StringType, IN ISO_639_2 *LangCode, IN BOOLEAN ReturnDevicePathStrOnMismatch ); CHAR8* LibGetSmbiosString ( IN SMBIOS_STRUCTURE_POINTER *Smbios, IN UINT16 StringNumber ); EFI_STATUS LibGetSmbiosSystemGuidAndSerialNumber ( IN EFI_GUID *SystemGuid, OUT CHAR8 **SystemSerialNumber ); EFI_STATUS InitializeGlobalIoDevice ( IN EFI_DEVICE_PATH *DevicePath, IN EFI_GUID *Protocol, IN CHAR8 *ErrorStr, OUT EFI_DEVICE_IO_INTERFACE **GlobalIoFncs ); UINT32 ReadPort ( IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, IN EFI_IO_WIDTH Width, IN UINTN Port ); UINT32 WritePort ( IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, IN EFI_IO_WIDTH Width, IN UINTN Port, IN UINTN Data ); UINT32 ReadPciConfig ( IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, IN EFI_IO_WIDTH Width, IN UINTN Port ); UINT32 WritePciConfig ( IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, IN EFI_IO_WIDTH Width, IN UINTN Port, IN UINTN Data ); VOID Pause ( VOID ); extern EFI_DEVICE_IO_INTERFACE *GlobalIoFncs; #define outp(_Port, _DataByte) (UINT8)WritePort(GlobalIoFncs, IO_UINT8, (UINTN)_Port, (UINTN)_DataByte) #define inp(_Port) (UINT8)ReadPort(GlobalIoFncs, IO_UINT8, (UINTN)_Port) #define outpw(_Port, _DataByte) (UINT16)WritePort(GlobalIoFncs, IO_UINT16, (UINTN)_Port, (UINTN)_DataByte) #define inpw(_Port) (UINT16)ReadPort(GlobalIoFncs, IO_UINT16, (UINTN)_Port) #define outpd(_Port, _DataByte) (UINT32)WritePort(GlobalIoFncs, IO_UINT32, (UINTN)_Port, (UINTN)_DataByte) #define inpd(_Port) (UINT32)ReadPort(GlobalIoFncs, IO_UINT32, (UINTN)_Port) #define writepci8(_Addr, _DataByte) (UINT8)WritePciConfig(GlobalIoFncs, IO_UINT8, (UINTN)_Addr, (UINTN)_DataByte) #define readpci8(_Addr) (UINT8)ReadPciConfig(GlobalIoFncs, IO_UINT8, (UINTN)_Addr) #define writepci16(_Addr, _DataByte) (UINT16)WritePciConfig(GlobalIoFncs, IO_UINT16, (UINTN)_Addr, (UINTN)_DataByte) #define readpci16(_Addr) (UINT16)ReadPciConfig(GlobalIoFncs, IO_UINT16, (UINTN)_Addr) #define writepci32(_Addr, _DataByte) (UINT32)WritePciConfig(GlobalIoFncs, IO_UINT32, (UINTN)_Addr, (UINTN)_DataByte) #define readpci32(_Addr) (UINT32)ReadPciConfig(GlobalIoFncs, IO_UINT32, (UINTN)_Addr) #define Port80(_PostCode) GlobalIoFncs->Io.Write (GlobalIoFncs, IO_UINT16, (UINT64)0x80, 1, &(_PostCode)) #ifdef __cplusplus } #endif #endif ncroxon-gnu-efi-157d47c/inc/efilink.h000066400000000000000000000076361471215650600174560ustar00rootroot00000000000000#ifndef _EFI_LINK_H #define _EFI_LINK_H /*++ Copyright (c) 1998 Intel Corporation Module Name: link.h (renamed efilink.h to avoid conflicts) Abstract: EFI link list macro's Revision History --*/ #ifndef EFI_NT_EMUL // // List entry - doubly linked list // typedef struct _LIST_ENTRY { struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Blink; } LIST_ENTRY, EFI_LIST_ENTRY; #endif // // VOID // InitializeListHead( // LIST_ENTRY *ListHead // ); // #define InitializeListHead(ListHead) \ (ListHead)->Flink = ListHead; \ (ListHead)->Blink = ListHead; // // BOOLEAN // IsListEmpty( // PLIST_ENTRY ListHead // ); // #define IsListEmpty(ListHead) \ ((ListHead)->Flink == (ListHead)) // // VOID // RemoveEntryList( // PLIST_ENTRY Entry // ); // #define _RemoveEntryList(Entry) { \ LIST_ENTRY *_Blink, *_Flink; \ _Flink = (Entry)->Flink; \ _Blink = (Entry)->Blink; \ _Blink->Flink = _Flink; \ _Flink->Blink = _Blink; \ } #if EFI_DEBUG #define RemoveEntryList(Entry) \ _RemoveEntryList(Entry); \ (Entry)->Flink = (LIST_ENTRY *) BAD_POINTER; \ (Entry)->Blink = (LIST_ENTRY *) BAD_POINTER; #else #define RemoveEntryList(Entry) \ _RemoveEntryList(Entry); #endif // // VOID // InsertTailList( // PLIST_ENTRY ListHead, // PLIST_ENTRY Entry // ); // #define InsertTailList(ListHead,Entry) {\ LIST_ENTRY *_ListHead, *_Blink; \ _ListHead = (ListHead); \ _Blink = _ListHead->Blink; \ (Entry)->Flink = _ListHead; \ (Entry)->Blink = _Blink; \ _Blink->Flink = (Entry); \ _ListHead->Blink = (Entry); \ } // // VOID // InsertHeadList( // PLIST_ENTRY ListHead, // PLIST_ENTRY Entry // ); // #define InsertHeadList(ListHead,Entry) {\ LIST_ENTRY *_ListHead, *_Flink; \ _ListHead = (ListHead); \ _Flink = _ListHead->Flink; \ (Entry)->Flink = _Flink; \ (Entry)->Blink = _ListHead; \ _Flink->Blink = (Entry); \ _ListHead->Flink = (Entry); \ } // VOID // SwapListEntries( // PLIST_ENTRY Entry1, // PLIST_ENTRY Entry2 // ); // // Put Entry2 before Entry1 // #define SwapListEntries(Entry1,Entry2) {\ LIST_ENTRY *Entry1Flink, *Entry1Blink; \ LIST_ENTRY *Entry2Flink, *Entry2Blink; \ Entry2Flink = (Entry2)->Flink; \ Entry2Blink = (Entry2)->Blink; \ Entry1Flink = (Entry1)->Flink; \ Entry1Blink = (Entry1)->Blink; \ Entry2Blink->Flink = Entry2Flink; \ Entry2Flink->Blink = Entry2Blink; \ (Entry2)->Flink = Entry1; \ (Entry2)->Blink = Entry1Blink; \ Entry1Blink->Flink = (Entry2); \ (Entry1)->Blink = (Entry2); \ } // // EFI_FIELD_OFFSET - returns the byte offset to a field within a structure // #define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(intptr_t)(&(((TYPE *) 0)->Field))) // // CONTAINING_RECORD - returns a pointer to the structure // from one of it's elements. // #define _CR(Record, TYPE, Field) \ ((TYPE *) ( (CHAR8 *)(Record) - (CHAR8 *) &(((TYPE *) 0)->Field))) // // EDK2 uses BASE_CR for the above // #define BASE_CR _CR #if EFI_DEBUG #define CR(Record, TYPE, Field, Sig) \ _CR(Record, TYPE, Field)->Signature != Sig ? \ (TYPE *) ASSERT_STRUCT(_CR(Record, TYPE, Field), Record) : \ _CR(Record, TYPE, Field) #else #define CR(Record, TYPE, Field, Signature) \ _CR(Record, TYPE, Field) #endif // // A lock structure // typedef struct _FLOCK { EFI_TPL Tpl; EFI_TPL OwnerTpl; UINTN Lock; } FLOCK; #endif ncroxon-gnu-efi-157d47c/inc/efimp.h000066400000000000000000000073351471215650600171310ustar00rootroot00000000000000#ifndef _EFI_MP_H #define _EFI_MP_H #define EFI_MP_SERVICES_PROTOCOL_GUID \ { 0x3fdda605, 0xa76e, 0x4f46, {0xad, 0x29, 0x12, 0xf4, 0x53, 0x1b, 0x3d, 0x08} } #define PROCESSOR_AS_BSP_BIT (1 << 0) #define PROCESSOR_ENABLED_BIT (1 << 1) #define PROCESSOR_HEALTH_STATUS_BIT (1 << 2) INTERFACE_DECL(_EFI_MP_SERVICES_PROTOCOL); typedef struct { UINT32 Package; UINT32 Core; UINT32 Thread; } EFI_CPU_PHYSICAL_LOCATION; typedef struct { UINT32 Package; UINT32 Module; UINT32 Tile; UINT32 Die; UINT32 Core; UINT32 Thread; } EFI_CPU_PHYSICAL_LOCATION2; typedef union { EFI_CPU_PHYSICAL_LOCATION2 Location2; } EXTENDED_PROCESSOR_INFORMATION; typedef struct { UINT64 ProcessorId; UINT32 StatusFlag; EFI_CPU_PHYSICAL_LOCATION Location; EXTENDED_PROCESSOR_INFORMATION ExtendedInformation; } EFI_PROCESSOR_INFORMATION; typedef VOID (EFIAPI *EFI_AP_PROCEDURE) ( IN VOID *ProcedureArgument ); typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS) ( IN struct _EFI_MP_SERVICES_PROTOCOL *This, OUT UINTN *NumberOfProcessors, OUT UINTN *NumberOfEnabledProcessors ); typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_GET_PROCESSOR_INFO) ( IN struct _EFI_MP_SERVICES_PROTOCOL *This, IN UINTN ProcessorNumber, OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer ); typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_STARTUP_ALL_APS) ( IN struct _EFI_MP_SERVICES_PROTOCOL *This, IN EFI_AP_PROCEDURE Procedure, IN BOOLEAN SingleThread, IN EFI_EVENT WaitEvent OPTIONAL, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL, OUT UINTN **FailedCpuList OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_STARTUP_THIS_AP) ( IN struct _EFI_MP_SERVICES_PROTOCOL *This, IN EFI_AP_PROCEDURE Procedure, IN UINTN ProcessorNumber, IN EFI_EVENT WaitEvent OPTIONAL, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL, OUT BOOLEAN *Finished OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_SWITCH_BSP) ( IN struct _EFI_MP_SERVICES_PROTOCOL *This, IN UINTN ProcessorNumber, IN BOOLEAN EnableOldBSP ); typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_ENABLEDISABLEAP) ( IN struct _EFI_MP_SERVICES_PROTOCOL *This, IN UINTN ProcessorNumber, IN BOOLEAN EnableAP, IN UINT32 *HealthFlag OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_MP_SERVICES_WHOAMI) ( IN struct _EFI_MP_SERVICES_PROTOCOL *This, OUT UINTN *ProcessorNumber ); /** * The primary protocol structure for MP service methods. */ typedef struct _EFI_MP_SERVICES_PROTOCOL { EFI_MP_SERVICES_GET_NUMBER_OF_PROCESSORS GetNumberOfProcessors; EFI_MP_SERVICES_GET_PROCESSOR_INFO GetProcessorInfo; EFI_MP_SERVICES_STARTUP_ALL_APS StartupAllAPs; EFI_MP_SERVICES_STARTUP_THIS_AP StartupThisAP; EFI_MP_SERVICES_SWITCH_BSP SwitchBSP; EFI_MP_SERVICES_ENABLEDISABLEAP EnableDisableAP; EFI_MP_SERVICES_WHOAMI WhoAmI; } EFI_MP_SERVICES_PROTOCOL; #endif /* _EFI_MP_H */ncroxon-gnu-efi-157d47c/inc/efinet.h000066400000000000000000000245161471215650600173030ustar00rootroot00000000000000#ifndef _EFINET_H #define _EFINET_H /*++ Copyright (c) 1999 Intel Corporation Module Name: efinet.h Abstract: EFI Simple Network protocol Revision History --*/ /////////////////////////////////////////////////////////////////////////////// // // Simple Network Protocol // #define EFI_SIMPLE_NETWORK_PROTOCOL_GUID \ { 0xA19832B9, 0xAC25, 0x11D3, {0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D} } INTERFACE_DECL(_EFI_SIMPLE_NETWORK_PROTOCOL); /////////////////////////////////////////////////////////////////////////////// // typedef struct { // // Total number of frames received. Includes frames with errors and // dropped frames. // UINT64 RxTotalFrames; // // Number of valid frames received and copied into receive buffers. // UINT64 RxGoodFrames; // // Number of frames below the minimum length for the media. // This would be <64 for ethernet. // UINT64 RxUndersizeFrames; // // Number of frames longer than the maxminum length for the // media. This would be >1500 for ethernet. // UINT64 RxOversizeFrames; // // Valid frames that were dropped because receive buffers were full. // UINT64 RxDroppedFrames; // // Number of valid unicast frames received and not dropped. // UINT64 RxUnicastFrames; // // Number of valid broadcast frames received and not dropped. // UINT64 RxBroadcastFrames; // // Number of valid mutlicast frames received and not dropped. // UINT64 RxMulticastFrames; // // Number of frames w/ CRC or alignment errors. // UINT64 RxCrcErrorFrames; // // Total number of bytes received. Includes frames with errors // and dropped frames. // UINT64 RxTotalBytes; // // Transmit statistics. // UINT64 TxTotalFrames; UINT64 TxGoodFrames; UINT64 TxUndersizeFrames; UINT64 TxOversizeFrames; UINT64 TxDroppedFrames; UINT64 TxUnicastFrames; UINT64 TxBroadcastFrames; UINT64 TxMulticastFrames; UINT64 TxCrcErrorFrames; UINT64 TxTotalBytes; // // Number of collisions detection on this subnet. // UINT64 Collisions; // // Number of frames destined for unsupported protocol. // UINT64 UnsupportedProtocol; } EFI_NETWORK_STATISTICS; /////////////////////////////////////////////////////////////////////////////// // typedef enum { EfiSimpleNetworkStopped, EfiSimpleNetworkStarted, EfiSimpleNetworkInitialized, EfiSimpleNetworkMaxState } EFI_SIMPLE_NETWORK_STATE; /////////////////////////////////////////////////////////////////////////////// // #define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST 0x01 #define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST 0x02 #define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST 0x04 #define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS 0x08 #define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10 /////////////////////////////////////////////////////////////////////////////// // #define EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT 0x01 #define EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT 0x02 #define EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT 0x04 #define EFI_SIMPLE_NETWORK_SOFTWARE_INTERRUPT 0x08 /////////////////////////////////////////////////////////////////////////////// // #define MAX_MCAST_FILTER_CNT 16 typedef struct { UINT32 State; UINT32 HwAddressSize; UINT32 MediaHeaderSize; UINT32 MaxPacketSize; UINT32 NvRamSize; UINT32 NvRamAccessSize; UINT32 ReceiveFilterMask; UINT32 ReceiveFilterSetting; UINT32 MaxMCastFilterCount; UINT32 MCastFilterCount; EFI_MAC_ADDRESS MCastFilter[MAX_MCAST_FILTER_CNT]; EFI_MAC_ADDRESS CurrentAddress; EFI_MAC_ADDRESS BroadcastAddress; EFI_MAC_ADDRESS PermanentAddress; UINT8 IfType; BOOLEAN MacAddressChangeable; BOOLEAN MultipleTxSupported; BOOLEAN MediaPresentSupported; BOOLEAN MediaPresent; } EFI_SIMPLE_NETWORK_MODE; /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_START) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_STOP) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_INITIALIZE) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This, IN UINTN ExtraRxBufferSize OPTIONAL, IN UINTN ExtraTxBufferSize OPTIONAL ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_RESET) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_SHUTDOWN) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_RECEIVE_FILTERS) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This, IN UINT32 Enable, IN UINT32 Disable, IN BOOLEAN ResetMCastFilter, IN UINTN MCastFilterCnt OPTIONAL, IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_STATION_ADDRESS) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This, IN BOOLEAN Reset, IN EFI_MAC_ADDRESS *New OPTIONAL ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_STATISTICS) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This, IN BOOLEAN Reset, IN OUT UINTN *StatisticsSize OPTIONAL, OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_MCAST_IP_TO_MAC) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This, IN BOOLEAN IPv6, IN EFI_IP_ADDRESS *IP, OUT EFI_MAC_ADDRESS *MAC ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_NVDATA) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This, IN BOOLEAN ReadWrite, IN UINTN Offset, IN UINTN BufferSize, IN OUT VOID *Buffer ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_GET_STATUS) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This, OUT UINT32 *InterruptStatus OPTIONAL, OUT VOID **TxBuf OPTIONAL ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_TRANSMIT) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This, IN UINTN HeaderSize, IN UINTN BufferSize, IN VOID *Buffer, IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL, IN EFI_MAC_ADDRESS *DestAddr OPTIONAL, IN UINT16 *Protocol OPTIONAL ); /////////////////////////////////////////////////////////////////////////////// // typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_NETWORK_RECEIVE) ( IN struct _EFI_SIMPLE_NETWORK_PROTOCOL *This, OUT UINTN *HeaderSize OPTIONAL, IN OUT UINTN *BufferSize, OUT VOID *Buffer, OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL, OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL, OUT UINT16 *Protocol OPTIONAL ); /////////////////////////////////////////////////////////////////////////////// // #define EFI_SIMPLE_NETWORK_PROTOCOL_REVISION 0x00010000 #define EFI_SIMPLE_NETWORK_INTERFACE_REVISION EFI_SIMPLE_NETWORK_PROTOCOL_REVISION typedef struct _EFI_SIMPLE_NETWORK_PROTOCOL { UINT64 Revision; EFI_SIMPLE_NETWORK_START Start; EFI_SIMPLE_NETWORK_STOP Stop; EFI_SIMPLE_NETWORK_INITIALIZE Initialize; EFI_SIMPLE_NETWORK_RESET Reset; EFI_SIMPLE_NETWORK_SHUTDOWN Shutdown; EFI_SIMPLE_NETWORK_RECEIVE_FILTERS ReceiveFilters; EFI_SIMPLE_NETWORK_STATION_ADDRESS StationAddress; EFI_SIMPLE_NETWORK_STATISTICS Statistics; EFI_SIMPLE_NETWORK_MCAST_IP_TO_MAC MCastIpToMac; EFI_SIMPLE_NETWORK_NVDATA NvData; EFI_SIMPLE_NETWORK_GET_STATUS GetStatus; EFI_SIMPLE_NETWORK_TRANSMIT Transmit; EFI_SIMPLE_NETWORK_RECEIVE Receive; EFI_EVENT WaitForPacket; EFI_SIMPLE_NETWORK_MODE *Mode; } EFI_SIMPLE_NETWORK_PROTOCOL; // Note: Because it conflicted with the EDK2 struct name, the // 'EFI_SIMPLE_NETWORK_PROTOCOL' GUID definition, from older // versions of gnu-efi, is now obsoleted. // Use 'EFI_SIMPLE_NETWORK_PROTOCOL_GUID' instead. typedef struct _EFI_SIMPLE_NETWORK_PROTOCOL _EFI_SIMPLE_NETWORK; typedef EFI_SIMPLE_NETWORK_PROTOCOL EFI_SIMPLE_NETWORK; #endif /* _EFINET_H */ ncroxon-gnu-efi-157d47c/inc/efipart.h000066400000000000000000000022271471215650600174560ustar00rootroot00000000000000#ifndef _EFI_PART_H #define _EFI_PART_H /*++ Copyright (c) 1998 Intel Corporation Module Name: efipart.h Abstract: Info about disk partitions and Master Boot Records Revision History --*/ // // // #define EFI_PARTITION 0xef #define MBR_SIZE 512 #pragma pack(1) typedef struct { UINT8 BootIndicator; UINT8 StartHead; UINT8 StartSector; UINT8 StartTrack; UINT8 OSIndicator; UINT8 EndHead; UINT8 EndSector; UINT8 EndTrack; UINT8 StartingLBA[4]; UINT8 SizeInLBA[4]; } MBR_PARTITION_RECORD; #define EXTRACT_UINT32(D) (UINT32)(D[0] | (D[1] << 8) | (D[2] << 16) | (D[3] << 24)) #define MBR_SIGNATURE 0xaa55 #define MIN_MBR_DEVICE_SIZE 0x80000 #define MBR_ERRATA_PAD 0x40000 // 128 MB #define MAX_MBR_PARTITIONS 4 typedef struct { UINT8 BootStrapCode[440]; UINT8 UniqueMbrSignature[4]; UINT8 Unknown[2]; MBR_PARTITION_RECORD Partition[MAX_MBR_PARTITIONS]; UINT16 Signature; } MASTER_BOOT_RECORD; #pragma pack() #endif ncroxon-gnu-efi-157d47c/inc/efipciio.h000066400000000000000000000341011471215650600176070ustar00rootroot00000000000000#ifndef _EFI_PCI_IO_H #define _EFI_PCI_IO_H #define EFI_PCI_IO_PROTOCOL_GUID \ { 0x4cf5b200, 0x68b8, 0x4ca5, {0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a} } #define EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID \ { 0x2f707ebb, 0x4a1a, 0x11d4, {0x9a, 0x38, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } INTERFACE_DECL(_EFI_PCI_IO_PROTOCOL); INTERFACE_DECL(_EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL); typedef enum { EfiPciIoWidthUint8, EfiPciIoWidthUint16, EfiPciIoWidthUint32, EfiPciIoWidthUint64, EfiPciIoWidthFifoUint8, EfiPciIoWidthFifoUint16, EfiPciIoWidthFifoUint32, EfiPciIoWidthFifoUint64, EfiPciIoWidthFillUint8, EfiPciIoWidthFillUint16, EfiPciIoWidthFillUint32, EfiPciIoWidthFillUint64, EfiPciIoWidthMaximum } EFI_PCI_IO_PROTOCOL_WIDTH, EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH; #define EFI_PCI_IO_PASS_THROUGH_BAR 0xff typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_POLL_IO_MEM) ( IN struct _EFI_PCI_IO_PROTOCOL *This, IN EFI_PCI_IO_PROTOCOL_WIDTH Width, IN UINT8 BarIndex, IN UINT64 Offset, IN UINT64 Mask, IN UINT64 Value, IN UINT64 Delay, OUT UINT64 *Result ); typedef EFI_STATUS (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_POLL_IO_MEM) ( IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, IN UINT64 Address, IN UINT64 Mask, IN UINT64 Value, IN UINT64 Delay, OUT UINT64 *Result ); typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_IO_MEM) ( IN struct _EFI_PCI_IO_PROTOCOL *This, IN EFI_PCI_IO_PROTOCOL_WIDTH Width, IN UINT8 BarIndex, IN UINT64 Offset, IN UINTN Count, IN OUT VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_IO_MEM) ( IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, IN UINT64 Address, IN UINTN Count, IN OUT VOID *Buffer ); typedef struct { EFI_PCI_IO_PROTOCOL_IO_MEM Read; EFI_PCI_IO_PROTOCOL_IO_MEM Write; } EFI_PCI_IO_PROTOCOL_ACCESS; typedef struct { EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_IO_MEM Read; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_IO_MEM Write; } EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS; typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_CONFIG) ( IN struct _EFI_PCI_IO_PROTOCOL *This, IN EFI_PCI_IO_PROTOCOL_WIDTH Width, IN UINT32 Offset, IN UINTN Count, IN OUT VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_CONFIGURATION) ( IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, OUT VOID **Resources ); typedef struct { EFI_PCI_IO_PROTOCOL_CONFIG Read; EFI_PCI_IO_PROTOCOL_CONFIG Write; } EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS; typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_COPY_MEM) ( IN struct _EFI_PCI_IO_PROTOCOL *This, IN EFI_PCI_IO_PROTOCOL_WIDTH Width, IN UINT8 DestBarIndex, IN UINT64 DestOffset, IN UINT8 SrcBarIndex, IN UINT64 SrcOffset, IN UINTN Count ); typedef EFI_STATUS (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_COPY_MEM) ( IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, IN UINT64 DestAddress, IN UINT64 SrcAddress, IN UINTN Count ); typedef enum { EfiPciIoOperationBusMasterRead, EfiPciIoOperationBusMasterWrite, EfiPciIoOperationBusMasterCommonBuffer, EfiPciIoOperationMaximum } EFI_PCI_IO_PROTOCOL_OPERATION; typedef enum { EfiPciOperationBusMasterRead, EfiPciOperationBusMasterWrite, EfiPciOperationBusMasterCommonBuffer, EfiPciOperationBusMasterRead64, EfiPciOperationBusMasterWrite64, EfiPciOperationBusMasterCommonBuffer64, EfiPciOperationMaximum } EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION; typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_MAP) ( IN struct _EFI_PCI_IO_PROTOCOL *This, IN EFI_PCI_IO_PROTOCOL_OPERATION Operation, IN VOID *HostAddress, IN OUT UINTN *NumberOfBytes, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT VOID **Mapping ); typedef EFI_STATUS (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_MAP) ( IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION Operation, IN VOID *HostAddress, IN OUT UINTN *NumberOfBytes, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT VOID **Mapping ); typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_UNMAP) ( IN struct _EFI_PCI_IO_PROTOCOL *This, IN VOID *Mapping ); typedef EFI_STATUS (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_UNMAP) ( IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, IN VOID *Mapping ); typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_ALLOCATE_BUFFER) ( IN struct _EFI_PCI_IO_PROTOCOL *This, IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN Pages, OUT VOID **HostAddress, IN UINT64 Attributes ); typedef EFI_STATUS (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ALLOCATE_BUFFER) ( IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN Pages, IN OUT VOID **HostAddress, IN UINT64 Attributes ); typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_FREE_BUFFER) ( IN struct _EFI_PCI_IO_PROTOCOL *This, IN UINTN Pages, IN VOID *HostAddress ); typedef EFI_STATUS (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FREE_BUFFER) ( IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, IN UINTN Pages, IN VOID *HostAddress ); typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_FLUSH) ( IN struct _EFI_PCI_IO_PROTOCOL *This ); typedef EFI_STATUS (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FLUSH) ( IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This ); typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_GET_LOCATION) ( IN struct _EFI_PCI_IO_PROTOCOL *This, OUT UINTN *SegmentNumber, OUT UINTN *BusNumber, OUT UINTN *DeviceNumber, OUT UINTN *FunctionNumber ); #define EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001 #define EFI_PCI_ATTRIBUTE_ISA_IO 0x0002 #define EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO 0x0004 #define EFI_PCI_ATTRIBUTE_VGA_MEMORY 0x0008 #define EFI_PCI_ATTRIBUTE_VGA_IO 0x0010 #define EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO 0x0020 #define EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO 0x0040 #define EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080 #define EFI_PCI_ATTRIBUTE_IO 0x0100 #define EFI_PCI_ATTRIBUTE_MEMORY 0x0200 #define EFI_PCI_ATTRIBUTE_BUS_MASTER 0x0400 #define EFI_PCI_ATTRIBUTE_MEMORY_CACHED 0x0800 #define EFI_PCI_ATTRIBUTE_MEMORY_DISABLE 0x1000 #define EFI_PCI_ATTRIBUTE_EMBEDDED_DEVICE 0x2000 #define EFI_PCI_ATTRIBUTE_EMBEDDED_ROM 0x4000 #define EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000 #define EFI_PCI_ATTRIBUTE_ISA_IO_16 0x10000 #define EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000 #define EFI_PCI_ATTRIBUTE_VGA_IO_16 0x40000 #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO #define EFI_PCI_IO_ATTRIBUTE_ISA_IO EFI_PCI_ATTRIBUTE_ISA_IO #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY EFI_PCI_ATTRIBUTE_VGA_MEMORY #define EFI_PCI_IO_ATTRIBUTE_VGA_IO EFI_PCI_ATTRIBUTE_VGA_IO #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE #define EFI_PCI_IO_ATTRIBUTE_IO EFI_PCI_ATTRIBUTE_IO #define EFI_PCI_IO_ATTRIBUTE_MEMORY EFI_PCI_ATTRIBUTE_MEMORY #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER EFI_PCI_ATTRIBUTE_BUS_MASTER #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED EFI_PCI_ATTRIBUTE_MEMORY_CACHED #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE EFI_PCI_ATTRIBUTE_MEMORY_DISABLE #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE EFI_PCI_ATTRIBUTE_EMBEDDED_DEVICE #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM EFI_PCI_ATTRIBUTE_EMBEDDED_ROM #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 EFI_PCI_ATTRIBUTE_ISA_IO_16 #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16 #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 EFI_PCI_ATTRIBUTE_VGA_IO_16 #define EFI_PCI_ATTRIBUTE_VALID_FOR_ALLOCATE_BUFFER \ (EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE | EFI_PCI_ATTRIBUTE_MEMORY_CACHED | EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE) #define EFI_PCI_ATTRIBUTE_INVALID_FOR_ALLOCATE_BUFFER \ (~EFI_PCI_ATTRIBUTE_VALID_FOR_ALLOCATE_BUFFER) typedef struct { UINT8 Register; UINT8 Function; UINT8 Device; UINT8 Bus; UINT32 ExtendedRegister; } EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS; typedef enum { EfiPciIoAttributeOperationGet, EfiPciIoAttributeOperationSet, EfiPciIoAttributeOperationEnable, EfiPciIoAttributeOperationDisable, EfiPciIoAttributeOperationSupported, EfiPciIoAttributeOperationMaximum } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION; typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_ATTRIBUTES) ( IN struct _EFI_PCI_IO_PROTOCOL *This, IN EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION Operation, IN UINT64 Attributes, OUT UINT64 *Result OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES) ( IN struct _EFI_PCI_IO_PROTOCOL *This, IN UINT8 BarIndex, OUT UINT64 *Supports OPTIONAL, OUT VOID **Resources OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GET_ATTRIBUTES) ( IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, OUT UINT64 *Supports, OUT UINT64 *Attributes ); typedef EFI_STATUS (EFIAPI *EFI_PCI_IO_PROTOCOL_SET_BAR_ATTRIBUTES) ( IN struct _EFI_PCI_IO_PROTOCOL *This, IN UINT64 Attributes, IN UINT8 BarIndex, IN OUT UINT64 *Offset, IN OUT UINT64 *Length ); typedef EFI_STATUS (EFIAPI *EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_SET_ATTRIBUTES) ( IN struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, IN UINT64 Attributes, IN OUT UINT64 *ResourceBase, IN OUT UINT64 *ResourceLength ); typedef struct _EFI_PCI_IO_PROTOCOL { EFI_PCI_IO_PROTOCOL_POLL_IO_MEM PollMem; EFI_PCI_IO_PROTOCOL_POLL_IO_MEM PollIo; EFI_PCI_IO_PROTOCOL_ACCESS Mem; EFI_PCI_IO_PROTOCOL_ACCESS Io; EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS Pci; EFI_PCI_IO_PROTOCOL_COPY_MEM CopyMem; EFI_PCI_IO_PROTOCOL_MAP Map; EFI_PCI_IO_PROTOCOL_UNMAP Unmap; EFI_PCI_IO_PROTOCOL_ALLOCATE_BUFFER AllocateBuffer; EFI_PCI_IO_PROTOCOL_FREE_BUFFER FreeBuffer; EFI_PCI_IO_PROTOCOL_FLUSH Flush; EFI_PCI_IO_PROTOCOL_GET_LOCATION GetLocation; EFI_PCI_IO_PROTOCOL_ATTRIBUTES Attributes; EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES GetBarAttributes; EFI_PCI_IO_PROTOCOL_SET_BAR_ATTRIBUTES SetBarAttributes; UINT64 RomSize; VOID *RomImage; } EFI_PCI_IO_PROTOCOL; // Note: Because it conflicted with the EDK2 struct name, the // 'EFI_PCI_IO_PROTOCOL' GUID definition, from older versions // of gnu-efi, is now obsoleted. // Use 'EFI_PCI_IO_PROTOCOL_GUID' instead. typedef struct _EFI_PCI_IO_PROTOCOL _EFI_PCI_IO; typedef EFI_PCI_IO_PROTOCOL EFI_PCI_IO; typedef struct _EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL { EFI_HANDLE ParentHandle; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_POLL_IO_MEM PollMem; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_POLL_IO_MEM PollIo; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS Mem; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS Io; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ACCESS Pci; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_COPY_MEM CopyMem; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_MAP Map; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_UNMAP Unmap; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_ALLOCATE_BUFFER AllocateBuffer; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FREE_BUFFER FreeBuffer; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_FLUSH Flush; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GET_ATTRIBUTES GetAttributes; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_SET_ATTRIBUTES SetAttributes; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_CONFIGURATION Configuration; UINT32 SegmentNumber; } EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL; #endif /* _EFI_PCI_IO_H */ ncroxon-gnu-efi-157d47c/inc/efipoint.h000066400000000000000000000063571471215650600176510ustar00rootroot00000000000000/* Copyright (C) 2014 by John Cronin * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #ifndef _EFI_POINT_H #define _EFI_POINT_H #define EFI_SIMPLE_POINTER_PROTOCOL_GUID \ { 0x31878c87, 0xb75, 0x11d5, { 0x9a, 0x4f, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } } INTERFACE_DECL(_EFI_SIMPLE_POINTER); typedef struct { INT32 RelativeMovementX; INT32 RelativeMovementY; INT32 RelativeMovementZ; BOOLEAN LeftButton; BOOLEAN RightButton; } EFI_SIMPLE_POINTER_STATE; typedef struct { UINT64 ResolutionX; UINT64 ResolutionY; UINT64 ResolutionZ; BOOLEAN LeftButton; BOOLEAN RightButton; } EFI_SIMPLE_POINTER_MODE; typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_POINTER_RESET) ( IN struct _EFI_SIMPLE_POINTER *This, IN BOOLEAN ExtendedVerification ); typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_POINTER_GET_STATE) ( IN struct _EFI_SIMPLE_POINTER *This, IN OUT EFI_SIMPLE_POINTER_STATE *State ); typedef struct _EFI_SIMPLE_POINTER { EFI_SIMPLE_POINTER_RESET Reset; EFI_SIMPLE_POINTER_GET_STATE GetState; EFI_EVENT WaitForInput; EFI_SIMPLE_POINTER_MODE *Mode; } EFI_SIMPLE_POINTER_PROTOCOL; #define EFI_ABSOLUTE_POINTER_PROTOCOL_GUID \ { 0x8D59D32B, 0xC655, 0x4AE9, { 0x9B, 0x15, 0xF2, 0x59, 0x04, 0x99, 0x2A, 0x43 } } INTERFACE_DECL(_EFI_ABSOLUTE_POINTER_PROTOCOL); typedef struct { UINT64 AbsoluteMinX; UINT64 AbsoluteMinY; UINT64 AbsoluteMinZ; UINT64 AbsoluteMaxX; UINT64 AbsoluteMaxY; UINT64 AbsoluteMaxZ; UINT32 Attributes; } EFI_ABSOLUTE_POINTER_MODE; typedef struct { UINT64 CurrentX; UINT64 CurrentY; UINT64 CurrentZ; UINT32 ActiveButtons; } EFI_ABSOLUTE_POINTER_STATE; #define EFI_ABSP_SupportsAltActive 0x00000001 #define EFI_ABSP_SupportsPressureAsZ 0x00000002 #define EFI_ABSP_TouchActive 0x00000001 #define EFI_ABS_AltActive 0x00000002 typedef EFI_STATUS (EFIAPI *EFI_ABSOLUTE_POINTER_RESET) ( IN struct _EFI_ABSOLUTE_POINTER_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); typedef EFI_STATUS (EFIAPI *EFI_ABSOLUTE_POINTER_GET_STATE) ( IN struct _EFI_ABSOLUTE_POINTER_PROTOCOL *This, IN OUT EFI_ABSOLUTE_POINTER_STATE *State ); typedef struct _EFI_ABSOLUTE_POINTER_PROTOCOL { EFI_ABSOLUTE_POINTER_RESET Reset; EFI_ABSOLUTE_POINTER_GET_STATE GetState; EFI_EVENT WaitForInput; EFI_ABSOLUTE_POINTER_MODE *Mode; } EFI_ABSOLUTE_POINTER_PROTOCOL; #endif ncroxon-gnu-efi-157d47c/inc/efiprot.h000066400000000000000000001307371471215650600175040ustar00rootroot00000000000000#ifndef _EFI_PROT_H #define _EFI_PROT_H /*++ Copyright (c) 1998 Intel Corporation Module Name: efiprot.h Abstract: EFI Protocols Revision History --*/ // // FPSWA library protocol // #define EFI_FPSWA_PROTOCOL_GUID \ { 0xc41b6531, 0x97b9, 0x11d3, {0x9a, 0x29, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } #define FPSWA_PROTOCOL EFI_FPSWA_PROTOCOL_GUID // // Device Path protocol // #define EFI_DEVICE_PATH_PROTOCOL_GUID \ { 0x9576e91, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH_PROTOCOL_GUID // // Block IO protocol // #define EFI_BLOCK_IO_PROTOCOL_GUID \ { 0x964e5b21, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define BLOCK_IO_PROTOCOL EFI_BLOCK_IO_PROTOCOL_GUID #define EFI_BLOCK_IO_PROTOCOL_REVISION 0x00010000 #define EFI_BLOCK_IO_PROTOCOL_REVISION2 0x00020001 #define EFI_BLOCK_IO_PROTOCOL_REVISION3 ((2<<16) | 31) #define EFI_BLOCK_IO_INTERFACE_REVISION EFI_BLOCK_IO_PROTOCOL_REVISION #define EFI_BLOCK_IO_INTERFACE_REVISION2 EFI_BLOCK_IO_PROTOCOL_REVISION2 #define EFI_BLOCK_IO_INTERFACE_REVISION3 EFI_BLOCK_IO_PROTOCOL_REVISION3 INTERFACE_DECL(_EFI_BLOCK_IO_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_BLOCK_RESET) ( IN struct _EFI_BLOCK_IO_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); typedef EFI_STATUS (EFIAPI *EFI_BLOCK_READ) ( IN struct _EFI_BLOCK_IO_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA LBA, IN UINTN BufferSize, OUT VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_BLOCK_WRITE) ( IN struct _EFI_BLOCK_IO_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA LBA, IN UINTN BufferSize, IN VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_BLOCK_FLUSH) ( IN struct _EFI_BLOCK_IO_PROTOCOL *This ); typedef struct { UINT32 MediaId; BOOLEAN RemovableMedia; BOOLEAN MediaPresent; BOOLEAN LogicalPartition; BOOLEAN ReadOnly; BOOLEAN WriteCaching; UINT32 BlockSize; UINT32 IoAlign; EFI_LBA LastBlock; /* revision 2 */ EFI_LBA LowestAlignedLba; UINT32 LogicalBlocksPerPhysicalBlock; /* revision 3 */ UINT32 OptimalTransferLengthGranularity; } EFI_BLOCK_IO_MEDIA; typedef struct _EFI_BLOCK_IO_PROTOCOL { UINT64 Revision; EFI_BLOCK_IO_MEDIA *Media; EFI_BLOCK_RESET Reset; EFI_BLOCK_READ ReadBlocks; EFI_BLOCK_WRITE WriteBlocks; EFI_BLOCK_FLUSH FlushBlocks; } EFI_BLOCK_IO_PROTOCOL; typedef struct _EFI_BLOCK_IO_PROTOCOL _EFI_BLOCK_IO; typedef EFI_BLOCK_IO_PROTOCOL EFI_BLOCK_IO; #define EFI_BLOCK_IO2_PROTOCOL_GUID \ { 0xa77b2472, 0xe282, 0x4e9f, {0xa2, 0x45, 0xc2, 0xc0, 0xe2, 0x7b, 0xbc, 0xc1} } INTERFACE_DECL(_EFI_BLOCK_IO2_PROTOCOL); typedef struct { EFI_EVENT Event; EFI_STATUS TransactionStatus; } EFI_BLOCK_IO2_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_BLOCK_RESET_EX) ( IN struct _EFI_BLOCK_IO2_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); typedef EFI_STATUS (EFIAPI *EFI_BLOCK_READ_EX) ( IN struct _EFI_BLOCK_IO2_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA LBA, IN OUT EFI_BLOCK_IO2_TOKEN *Token, IN UINTN BufferSize, OUT VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_BLOCK_WRITE_EX) ( IN struct _EFI_BLOCK_IO2_PROTOCOL *This, IN UINT32 MediaId, IN EFI_LBA LBA, IN OUT EFI_BLOCK_IO2_TOKEN *Token, IN UINTN BufferSize, IN VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_BLOCK_FLUSH_EX) ( IN struct _EFI_BLOCK_IO2_PROTOCOL *This, IN OUT EFI_BLOCK_IO2_TOKEN *Token ); typedef struct _EFI_BLOCK_IO2_PROTOCOL { EFI_BLOCK_IO_MEDIA *Media; EFI_BLOCK_RESET_EX Reset; EFI_BLOCK_READ_EX ReadBlocksEx; EFI_BLOCK_WRITE_EX WriteBlocksEx; EFI_BLOCK_FLUSH_EX FlushBlocksEx; } EFI_BLOCK_IO2_PROTOCOL; // // Disk Block IO protocol // #define EFI_DISK_IO_PROTOCOL_GUID \ { 0xce345171, 0xba0b, 0x11d2, {0x8e, 0x4f, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define DISK_IO_PROTOCOL EFI_DISK_IO_PROTOCOL_GUID #define EFI_DISK_IO_PROTOCOL_REVISION 0x00010000 #define EFI_DISK_IO_INTERFACE_REVISION EFI_DISK_IO_PROTOCOL_REVISION INTERFACE_DECL(_EFI_DISK_IO_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_DISK_READ) ( IN struct _EFI_DISK_IO_PROTOCOL *This, IN UINT32 MediaId, IN UINT64 Offset, IN UINTN BufferSize, OUT VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_DISK_WRITE) ( IN struct _EFI_DISK_IO_PROTOCOL *This, IN UINT32 MediaId, IN UINT64 Offset, IN UINTN BufferSize, IN VOID *Buffer ); typedef struct _EFI_DISK_IO_PROTOCOL { UINT64 Revision; EFI_DISK_READ ReadDisk; EFI_DISK_WRITE WriteDisk; } EFI_DISK_IO_PROTOCOL; typedef struct _EFI_DISK_IO_PROTOCOL _EFI_DISK_IO; typedef EFI_DISK_IO_PROTOCOL EFI_DISK_IO; #define EFI_DISK_IO2_PROTOCOL_GUID \ { 0x151c8eae, 0x7f2c, 0x472c, {0x9e, 0x54, 0x98, 0x28, 0x19, 0x4f, 0x6a, 0x88} } #define EFI_DISK_IO2_PROTOCOL_REVISION 0x00020000 INTERFACE_DECL(_EFI_DISK_IO2_PROTOCOL); typedef struct { EFI_EVENT Event; EFI_STATUS TransactionStatus; } EFI_DISK_IO2_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_DISK_CANCEL_EX) ( IN struct _EFI_DISK_IO2_PROTOCOL *This ); typedef EFI_STATUS (EFIAPI *EFI_DISK_READ_EX) ( IN struct _EFI_DISK_IO2_PROTOCOL *This, IN UINT32 MediaId, IN UINT64 Offset, IN OUT EFI_DISK_IO2_TOKEN *Token, IN UINTN BufferSize, OUT VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_DISK_WRITE_EX) ( IN struct _EFI_DISK_IO2_PROTOCOL *This, IN UINT32 MediaId, IN UINT64 Offset, IN OUT EFI_DISK_IO2_TOKEN *Token, IN UINTN BufferSize, IN VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_DISK_FLUSH_EX) ( IN struct _EFI_DISK_IO2_PROTOCOL *This, IN OUT EFI_DISK_IO2_TOKEN *Token ); typedef struct _EFI_DISK_IO2_PROTOCOL { UINT64 Revision; EFI_DISK_CANCEL_EX Cancel; EFI_DISK_READ_EX ReadDiskEx; EFI_DISK_WRITE_EX WriteDiskEx; EFI_DISK_FLUSH_EX FlushDiskEx; } EFI_DISK_IO2_PROTOCOL; // // Simple file system protocol // #define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \ { 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define SIMPLE_FILE_SYSTEM_PROTOCOL EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID INTERFACE_DECL(_EFI_SIMPLE_FILE_SYSTEM_PROTOCOL); INTERFACE_DECL(_EFI_FILE_HANDLE); typedef EFI_STATUS (EFIAPI *EFI_VOLUME_OPEN) ( IN struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, OUT struct _EFI_FILE_HANDLE **Root ); #define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION 0x00010000 #define EFI_FILE_IO_INTERFACE_REVISION EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION typedef struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL { UINT64 Revision; EFI_VOLUME_OPEN OpenVolume; } EFI_SIMPLE_FILE_SYSTEM_PROTOCOL; typedef struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL _EFI_FILE_IO_INTERFACE; typedef EFI_SIMPLE_FILE_SYSTEM_PROTOCOL EFI_FILE_IO_INTERFACE; // // // typedef EFI_STATUS (EFIAPI *EFI_FILE_OPEN) ( IN struct _EFI_FILE_HANDLE *File, OUT struct _EFI_FILE_HANDLE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes ); // Open modes #define EFI_FILE_MODE_READ 0x0000000000000001 #define EFI_FILE_MODE_WRITE 0x0000000000000002 #define EFI_FILE_MODE_CREATE 0x8000000000000000 // File attributes #define EFI_FILE_READ_ONLY 0x0000000000000001 #define EFI_FILE_HIDDEN 0x0000000000000002 #define EFI_FILE_SYSTEM 0x0000000000000004 #define EFI_FILE_RESERVIED 0x0000000000000008 #define EFI_FILE_DIRECTORY 0x0000000000000010 #define EFI_FILE_ARCHIVE 0x0000000000000020 #define EFI_FILE_VALID_ATTR 0x0000000000000037 typedef EFI_STATUS (EFIAPI *EFI_FILE_CLOSE) ( IN struct _EFI_FILE_HANDLE *File ); typedef EFI_STATUS (EFIAPI *EFI_FILE_DELETE) ( IN struct _EFI_FILE_HANDLE *File ); typedef EFI_STATUS (EFIAPI *EFI_FILE_READ) ( IN struct _EFI_FILE_HANDLE *File, IN OUT UINTN *BufferSize, OUT VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_FILE_WRITE) ( IN struct _EFI_FILE_HANDLE *File, IN OUT UINTN *BufferSize, IN VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_FILE_SET_POSITION) ( IN struct _EFI_FILE_HANDLE *File, IN UINT64 Position ); typedef EFI_STATUS (EFIAPI *EFI_FILE_GET_POSITION) ( IN struct _EFI_FILE_HANDLE *File, OUT UINT64 *Position ); typedef EFI_STATUS (EFIAPI *EFI_FILE_GET_INFO) ( IN struct _EFI_FILE_HANDLE *File, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_FILE_SET_INFO) ( IN struct _EFI_FILE_HANDLE *File, IN EFI_GUID *InformationType, IN UINTN BufferSize, IN VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_FILE_FLUSH) ( IN struct _EFI_FILE_HANDLE *File ); typedef struct { EFI_EVENT Event; EFI_STATUS Status; UINTN BufferSize; VOID *Buffer; } EFI_FILE_IO_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_FILE_OPEN_EX)( IN struct _EFI_FILE_HANDLE *File, OUT struct _EFI_FILE_HANDLE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes, IN OUT EFI_FILE_IO_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_FILE_READ_EX) ( IN struct _EFI_FILE_HANDLE *File, IN OUT EFI_FILE_IO_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_FILE_WRITE_EX) ( IN struct _EFI_FILE_HANDLE *File, IN OUT EFI_FILE_IO_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_FILE_FLUSH_EX) ( IN struct _EFI_FILE_HANDLE *File, IN OUT EFI_FILE_IO_TOKEN *Token ); #define EFI_FILE_PROTOCOL_REVISION 0x00010000 #define EFI_FILE_PROTOCOL_REVISION2 0x00020000 #define EFI_FILE_PROTOCOL_LATEST_REVISION EFI_FILE_PROTOCOL_REVISION2 #define EFI_FILE_HANDLE_REVISION EFI_FILE_PROTOCOL_REVISION typedef struct _EFI_FILE_HANDLE { UINT64 Revision; EFI_FILE_OPEN Open; EFI_FILE_CLOSE Close; EFI_FILE_DELETE Delete; EFI_FILE_READ Read; EFI_FILE_WRITE Write; EFI_FILE_GET_POSITION GetPosition; EFI_FILE_SET_POSITION SetPosition; EFI_FILE_GET_INFO GetInfo; EFI_FILE_SET_INFO SetInfo; EFI_FILE_FLUSH Flush; EFI_FILE_OPEN_EX OpenEx; EFI_FILE_READ_EX ReadEx; EFI_FILE_WRITE_EX WriteEx; EFI_FILE_FLUSH_EX FlushEx; } EFI_FILE_PROTOCOL, *EFI_FILE_HANDLE; typedef EFI_FILE_PROTOCOL EFI_FILE; // // File information types // #define EFI_FILE_INFO_ID \ { 0x9576e92, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } typedef struct { UINT64 Size; UINT64 FileSize; UINT64 PhysicalSize; EFI_TIME CreateTime; EFI_TIME LastAccessTime; EFI_TIME ModificationTime; UINT64 Attribute; CHAR16 FileName[1]; } EFI_FILE_INFO; // // The FileName field of the EFI_FILE_INFO data structure is variable length. // Whenever code needs to know the size of the EFI_FILE_INFO data structure, it needs to // be the size of the data structure without the FileName field. The following macro // computes this size correctly no matter how big the FileName array is declared. // This is required to make the EFI_FILE_INFO data structure ANSI compilant. // #define SIZE_OF_EFI_FILE_INFO EFI_FIELD_OFFSET(EFI_FILE_INFO,FileName) #define EFI_FILE_SYSTEM_INFO_ID \ { 0x9576e93, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } typedef struct { UINT64 Size; BOOLEAN ReadOnly; UINT64 VolumeSize; UINT64 FreeSpace; UINT32 BlockSize; CHAR16 VolumeLabel[1]; } EFI_FILE_SYSTEM_INFO; // // The VolumeLabel field of the EFI_FILE_SYSTEM_INFO data structure is variable length. // Whenever code needs to know the size of the EFI_FILE_SYSTEM_INFO data structure, it needs // to be the size of the data structure without the VolumeLable field. The following macro // computes this size correctly no matter how big the VolumeLable array is declared. // This is required to make the EFI_FILE_SYSTEM_INFO data structure ANSI compilant. // #define SIZE_OF_EFI_FILE_SYSTEM_INFO EFI_FIELD_OFFSET(EFI_FILE_SYSTEM_INFO,VolumeLabel) #define EFI_FILE_SYSTEM_VOLUME_LABEL_ID \ { 0xDB47D7D3,0xFE81, 0x11d3, {0x9A, 0x35, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D} } typedef struct { CHAR16 VolumeLabel[1]; } EFI_FILE_SYSTEM_VOLUME_LABEL; #define SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO EFI_FIELD_OFFSET(EFI_FILE_SYSTEM_VOLUME_LABEL,VolumeLabel) // // For compatibility with older versions of gnu-efi // #define EFI_FILE_SYSTEM_VOLUME_LABEL_INFO_ID EFI_FILE_SYSTEM_VOLUME_LABEL_ID #define EFI_FILE_SYSTEM_VOLUME_LABEL_INFO EFI_FILE_SYSTEM_VOLUME_LABEL // // Load file protocol // #define EFI_LOAD_FILE_PROTOCOL_GUID \ { 0x56EC3091, 0x954C, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} } #define LOAD_FILE_PROTOCOL EFI_LOAD_FILE_PROTOCOL_GUID INTERFACE_DECL(_EFI_LOAD_FILE_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_LOAD_FILE) ( IN struct _EFI_LOAD_FILE_PROTOCOL *This, IN EFI_DEVICE_PATH *FilePath, IN BOOLEAN BootPolicy, IN OUT UINTN *BufferSize, IN VOID *Buffer OPTIONAL ); typedef struct _EFI_LOAD_FILE_PROTOCOL { EFI_LOAD_FILE LoadFile; } EFI_LOAD_FILE_PROTOCOL; typedef struct _EFI_LOAD_FILE_PROTOCOL _EFI_LOAD_FILE_INTERFACE; typedef EFI_LOAD_FILE_PROTOCOL EFI_LOAD_FILE_INTERFACE; // // Device IO protocol // #define EFI_DEVICE_IO_PROTOCOL_GUID \ { 0xaf6ac311, 0x84c3, 0x11d2, {0x8e, 0x3c, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define DEVICE_IO_PROTOCOL EFI_DEVICE_IO_PROTOCOL_GUID INTERFACE_DECL(_EFI_DEVICE_IO_PROTOCOL); typedef enum { IO_UINT8, IO_UINT16, IO_UINT32, IO_UINT64, // // Specification Change: Copy from MMIO to MMIO vs. MMIO to buffer, buffer to MMIO // MMIO_COPY_UINT8, MMIO_COPY_UINT16, MMIO_COPY_UINT32, MMIO_COPY_UINT64 } EFI_IO_WIDTH; #define EFI_PCI_ADDRESS(_bus,_dev,_func) \ ( (UINT64) ( (((UINTN)_bus) << 24) + (((UINTN)_dev) << 16) + (((UINTN)_func) << 8) ) ) typedef EFI_STATUS (EFIAPI *EFI_DEVICE_IO) ( IN struct _EFI_DEVICE_IO_PROTOCOL *This, IN EFI_IO_WIDTH Width, IN UINT64 Address, IN UINTN Count, IN OUT VOID *Buffer ); typedef struct { EFI_DEVICE_IO Read; EFI_DEVICE_IO Write; } EFI_IO_ACCESS; typedef EFI_STATUS (EFIAPI *EFI_PCI_DEVICE_PATH) ( IN struct _EFI_DEVICE_IO_PROTOCOL *This, IN UINT64 Address, IN OUT EFI_DEVICE_PATH **PciDevicePath ); typedef enum { EfiBusMasterRead, EfiBusMasterWrite, EfiBusMasterCommonBuffer } EFI_IO_OPERATION_TYPE; typedef EFI_STATUS (EFIAPI *EFI_IO_MAP) ( IN struct _EFI_DEVICE_IO_PROTOCOL *This, IN EFI_IO_OPERATION_TYPE Operation, IN EFI_PHYSICAL_ADDRESS *HostAddress, IN OUT UINTN *NumberOfBytes, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT VOID **Mapping ); typedef EFI_STATUS (EFIAPI *EFI_IO_UNMAP) ( IN struct _EFI_DEVICE_IO_PROTOCOL *This, IN VOID *Mapping ); typedef EFI_STATUS (EFIAPI *EFI_IO_ALLOCATE_BUFFER) ( IN struct _EFI_DEVICE_IO_PROTOCOL *This, IN EFI_ALLOCATE_TYPE Type, IN EFI_MEMORY_TYPE MemoryType, IN UINTN Pages, IN OUT EFI_PHYSICAL_ADDRESS *HostAddress ); typedef EFI_STATUS (EFIAPI *EFI_IO_FLUSH) ( IN struct _EFI_DEVICE_IO_PROTOCOL *This ); typedef EFI_STATUS (EFIAPI *EFI_IO_FREE_BUFFER) ( IN struct _EFI_DEVICE_IO_PROTOCOL *This, IN UINTN Pages, IN EFI_PHYSICAL_ADDRESS HostAddress ); typedef struct _EFI_DEVICE_IO_PROTOCOL { EFI_IO_ACCESS Mem; EFI_IO_ACCESS Io; EFI_IO_ACCESS Pci; EFI_IO_MAP Map; EFI_PCI_DEVICE_PATH PciDevicePath; EFI_IO_UNMAP Unmap; EFI_IO_ALLOCATE_BUFFER AllocateBuffer; EFI_IO_FLUSH Flush; EFI_IO_FREE_BUFFER FreeBuffer; } EFI_DEVICE_IO_PROTOCOL; typedef struct _EFI_DEVICE_IO_PROTOCOL _EFI_DEVICE_IO_INTERFACE; typedef EFI_DEVICE_IO_PROTOCOL EFI_DEVICE_IO_INTERFACE; // // Unicode Collation protocol // #define EFI_UNICODE_COLLATION_PROTOCOL_GUID \ { 0x1d85cd7f, 0xf43d, 0x11d2, {0x9a, 0xc, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } #define UNICODE_COLLATION_PROTOCOL EFI_UNICODE_COLLATION_PROTOCOL_GUID #define EFI_UNICODE_BYTE_ORDER_MARK (CHAR16)(0xfeff) #define UNICODE_BYTE_ORDER_MARK EFI_UNICODE_BYTE_ORDER_MARK INTERFACE_DECL(_EFI_UNICODE_COLLATION_PROTOCOL); typedef INTN (EFIAPI *EFI_UNICODE_STRICOLL) ( IN struct _EFI_UNICODE_COLLATION_PROTOCOL *This, IN CHAR16 *s1, IN CHAR16 *s2 ); typedef BOOLEAN (EFIAPI *EFI_UNICODE_METAIMATCH) ( IN struct _EFI_UNICODE_COLLATION_PROTOCOL *This, IN CHAR16 *String, IN CHAR16 *Pattern ); typedef VOID (EFIAPI *EFI_UNICODE_STRLWR) ( IN struct _EFI_UNICODE_COLLATION_PROTOCOL *This, IN OUT CHAR16 *Str ); typedef VOID (EFIAPI *EFI_UNICODE_STRUPR) ( IN struct _EFI_UNICODE_COLLATION_PROTOCOL *This, IN OUT CHAR16 *Str ); typedef VOID (EFIAPI *EFI_UNICODE_FATTOSTR) ( IN struct _EFI_UNICODE_COLLATION_PROTOCOL *This, IN UINTN FatSize, IN CHAR8 *Fat, OUT CHAR16 *String ); typedef BOOLEAN (EFIAPI *EFI_UNICODE_STRTOFAT) ( IN struct _EFI_UNICODE_COLLATION_PROTOCOL *This, IN CHAR16 *String, IN UINTN FatSize, OUT CHAR8 *Fat ); // // Hash Protocol // #define EFI_HASH_PROTOCOL_GUID \ { 0xC5184932, 0xDBA5, 0x46DB, { 0xA5, 0xBA, 0xCC, 0x0B, 0xDA, 0x9C, 0x14, 0x35 } } #define HASH_PROTOCOL EFI_HASH_PROTOCOL_GUID #define EFI_HASH_ALGORITHM_SHA1_GUID \ { 0x2AE9D80F, 0x3FB2, 0x4095, { 0xB7, 0xB1, 0xE9, 0x31, 0x57, 0xB9, 0x46, 0xB6 } } // Deprecated #define EFI_HASH_ALGORITHM_SHA1 EFI_HASH_ALGORITHM_SHA1_GUID #define EFI_HASH_ALGORITHM_SHA224_GUID \ { 0x8DF01A06, 0x9BD5, 0x4BF7, { 0xB0, 0x21, 0xDB, 0x4F, 0xD9, 0xCC, 0xF4, 0x5B } } // Deprecated #define EFI_HASH_ALGORITHM_SHA224 EFI_HASH_ALGORITHM_SHA224_GUID #define EFI_HASH_ALGORITHM_SHA256_GUID \ { 0x51AA59DE, 0xFDF2, 0x4EA3, { 0xBC, 0x63, 0x87, 0x5F, 0xB7, 0x84, 0x2E, 0xE9 } } // Deprecated #define EFI_HASH_ALGORITHM_SHA256 EFI_HASH_ALGORITHM_SHA256_GUID #define EFI_HASH_ALGORITHM_SHA384_GUID \ { 0xEFA96432, 0xDE33, 0x4DD2, { 0xAE, 0xE6, 0x32, 0x8C, 0x33, 0xDF, 0x77, 0x7A } } // Deprecated #define EFI_HASH_ALGORITHM_SHA384 EFI_HASH_ALGORITHM_SHA384_GUID #define EFI_HASH_ALGORITHM_SHA512_GUID \ { 0xCAA4381E, 0x750C, 0x4770, { 0xB8, 0x70, 0x7A, 0x23, 0xB4, 0xE4, 0x21, 0x30 } } // Deprecated #define EFI_HASH_ALGORITHM_SHA512 EFI_HASH_ALGORITHM_SHA512_GUID #define EFI_HASH_ALGORITHM_MD5_GUID \ { 0x0AF7C79C, 0x65B5, 0x4319, { 0xB0, 0xAE, 0x44, 0xEC, 0x48, 0x4E, 0x4A, 0xD7 } } // Deprecated #define EFI_HASH_ALGORITHM_MD5 EFI_HASH_ALGORITHM_MD5_GUID #define EFI_HASH_ALGORITHM_SHA1_NOPAD_GUID \ { 0x24C5DC2F, 0x53E2, 0x40CA, { 0x9E, 0xD6, 0xA5, 0xD9, 0xA4, 0x9F, 0x46, 0x3B } } #define EFI_HASH_ALGORITHM_SHA1_NOPAD EFI_HASH_ALGORITHM_SHA1_NOPAD_GUID #define EFI_HASH_ALGORITHM_SHA256_NOPAD_GUID \ { 0x8628752A, 0x6CB7, 0x4814, { 0x96, 0xFC, 0x24, 0xA8, 0x15, 0xAC, 0x22, 0x26 } } #define EFI_HASH_ALGORITHM_SHA256_NOPAD EFI_HASH_ALGORITHM_SHA256_NOPAD_GUID INTERFACE_DECL(_EFI_HASH_PROTOCOL); typedef UINT8 EFI_MD5_HASH[16]; typedef UINT8 EFI_SHA1_HASH[20]; typedef UINT8 EFI_SHA224_HASH[28]; typedef UINT8 EFI_SHA256_HASH[32]; typedef UINT8 EFI_SHA384_HASH[48]; typedef UINT8 EFI_SHA512_HASH[64]; typedef union _EFI_HASH_OUTPUT { EFI_MD5_HASH *Md5Hash; EFI_SHA1_HASH *Sha1Hash; EFI_SHA224_HASH *Sha224Hash; EFI_SHA256_HASH *Sha256Hash; EFI_SHA384_HASH *Sha384Hash; EFI_SHA512_HASH *Sha512Hash; } EFI_HASH_OUTPUT; typedef EFI_STATUS (EFIAPI *EFI_HASH_GET_HASH_SIZE) ( IN CONST struct _EFI_HASH_PROTOCOL *This, IN CONST EFI_GUID *HashAlgorithm, OUT UINTN *HashSize); typedef EFI_STATUS (EFIAPI *EFI_HASH_HASH) ( IN CONST struct _EFI_HASH_PROTOCOL *This, IN CONST EFI_GUID *HashAlgorithm, IN BOOLEAN Extend, IN CONST UINT8 *Message, IN UINT64 MessageSize, IN OUT EFI_HASH_OUTPUT *Hash); typedef struct _EFI_HASH_PROTOCOL { EFI_HASH_GET_HASH_SIZE GetHashSize; EFI_HASH_HASH Hash; } EFI_HASH_PROTOCOL; typedef struct _EFI_HASH_PROTOCOL _EFI_HASH; typedef EFI_HASH_PROTOCOL EFI_HASH; typedef struct _EFI_UNICODE_COLLATION_PROTOCOL { // general EFI_UNICODE_STRICOLL StriColl; EFI_UNICODE_METAIMATCH MetaiMatch; EFI_UNICODE_STRLWR StrLwr; EFI_UNICODE_STRUPR StrUpr; // for supporting fat volumes EFI_UNICODE_FATTOSTR FatToStr; EFI_UNICODE_STRTOFAT StrToFat; CHAR8 *SupportedLanguages; } EFI_UNICODE_COLLATION_PROTOCOL; typedef EFI_UNICODE_COLLATION_PROTOCOL EFI_UNICODE_COLLATION_INTERFACE; /* Graphics output protocol */ #define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \ { 0x9042a9de, 0x23dc, 0x4a38, {0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a } } typedef struct _EFI_GRAPHICS_OUTPUT_PROTOCOL EFI_GRAPHICS_OUTPUT_PROTOCOL; typedef struct { UINT32 RedMask; UINT32 GreenMask; UINT32 BlueMask; UINT32 ReservedMask; } EFI_PIXEL_BITMASK; typedef enum { PixelRedGreenBlueReserved8BitPerColor, PixelBlueGreenRedReserved8BitPerColor, PixelBitMask, PixelBltOnly, PixelFormatMax } EFI_GRAPHICS_PIXEL_FORMAT; typedef struct { UINT32 Version; UINT32 HorizontalResolution; UINT32 VerticalResolution; EFI_GRAPHICS_PIXEL_FORMAT PixelFormat; EFI_PIXEL_BITMASK PixelInformation; UINT32 PixelsPerScanLine; } EFI_GRAPHICS_OUTPUT_MODE_INFORMATION; /** Return the current video mode information. @param This Protocol instance pointer. @param ModeNumber The mode number to return information on. @param SizeOfInfo A pointer to the size, in bytes, of the Info buffer. @param Info A pointer to callee allocated buffer that returns information about ModeNumber. @retval EFI_SUCCESS Mode information returned. @retval EFI_BUFFER_TOO_SMALL The Info buffer was too small. @retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve the video mode. @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode () @retval EFI_INVALID_PARAMETER One of the input args was NULL. **/ typedef EFI_STATUS (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE) ( IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, IN UINT32 ModeNumber, OUT UINTN *SizeOfInfo, OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info ) ; /** Return the current video mode information. @param This Protocol instance pointer. @param ModeNumber The mode number to be set. @retval EFI_SUCCESS Graphics mode was changed. @retval EFI_DEVICE_ERROR The device had an error and could not complete the request. @retval EFI_UNSUPPORTED ModeNumber is not supported by this device. **/ typedef EFI_STATUS (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE) ( IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, IN UINT32 ModeNumber ); typedef struct { UINT8 Blue; UINT8 Green; UINT8 Red; UINT8 Reserved; } EFI_GRAPHICS_OUTPUT_BLT_PIXEL; typedef union { EFI_GRAPHICS_OUTPUT_BLT_PIXEL Pixel; UINT32 Raw; } EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION; typedef enum { EfiBltVideoFill, EfiBltVideoToBltBuffer, EfiBltBufferToVideo, EfiBltVideoToVideo, EfiGraphicsOutputBltOperationMax } EFI_GRAPHICS_OUTPUT_BLT_OPERATION; /** The following table defines actions for BltOperations: EfiBltVideoFill - Write data from the BltBuffer pixel (SourceX, SourceY) directly to every pixel of the video display rectangle (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). Only one pixel will be used from the BltBuffer. Delta is NOT used. EfiBltVideoToBltBuffer - Read data from the video display rectangle (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in the BltBuffer rectangle (DestinationX, DestinationY ) (DestinationX + Width, DestinationY + Height). If DestinationX or DestinationY is not zero then Delta must be set to the length in bytes of a row in the BltBuffer. EfiBltBufferToVideo - Write data from the BltBuffer rectangle (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the video display rectangle (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is not zero then Delta must be set to the length in bytes of a row in the BltBuffer. EfiBltVideoToVideo - Copy from the video display rectangle (SourceX, SourceY) (SourceX + Width, SourceY + Height) .to the video display rectangle (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). The BltBuffer and Delta are not used in this mode. @param This Protocol instance pointer. @param BltBuffer Buffer containing data to blit into video buffer. This buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL) @param BltOperation Operation to perform on BlitBuffer and video memory @param SourceX X coordinate of source for the BltBuffer. @param SourceY Y coordinate of source for the BltBuffer. @param DestinationX X coordinate of destination for the BltBuffer. @param DestinationY Y coordinate of destination for the BltBuffer. @param Width Width of rectangle in BltBuffer in pixels. @param Height Hight of rectangle in BltBuffer in pixels. @param Delta OPTIONAL @retval EFI_SUCCESS The Blt operation completed. @retval EFI_INVALID_PARAMETER BltOperation is not valid. @retval EFI_DEVICE_ERROR A hardware error occured writting to the video buffer. **/ typedef EFI_STATUS (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT) ( IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This, IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation, IN UINTN SourceX, IN UINTN SourceY, IN UINTN DestinationX, IN UINTN DestinationY, IN UINTN Width, IN UINTN Height, IN UINTN Delta OPTIONAL ); typedef struct { UINT32 MaxMode; UINT32 Mode; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; UINTN SizeOfInfo; EFI_PHYSICAL_ADDRESS FrameBufferBase; UINTN FrameBufferSize; } EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE; struct _EFI_GRAPHICS_OUTPUT_PROTOCOL { EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE QueryMode; EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE SetMode; EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT Blt; EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode; }; /* * EFI EDID Discovered Protocol * UEFI Specification Version 2.5 Section 11.9 */ #define EFI_EDID_DISCOVERED_PROTOCOL_GUID \ { 0x1C0C34F6, 0xD380, 0x41FA, { 0xA0, 0x49, 0x8a, 0xD0, 0x6C, 0x1A, 0x66, 0xAA} } typedef struct _EFI_EDID_DISCOVERED_PROTOCOL { UINT32 SizeOfEdid; UINT8 *Edid; } EFI_EDID_DISCOVERED_PROTOCOL; /* * EFI EDID Active Protocol * UEFI Specification Version 2.5 Section 11.9 */ #define EFI_EDID_ACTIVE_PROTOCOL_GUID \ { 0xBD8C1056, 0x9F36, 0x44EC, { 0x92, 0xA8, 0xA6, 0x33, 0x7F, 0x81, 0x79, 0x86} } typedef struct _EFI_EDID_ACTIVE_PROTOCOL { UINT32 SizeOfEdid; UINT8 *Edid; } EFI_EDID_ACTIVE_PROTOCOL; /* * EFI EDID Override Protocol * UEFI Specification Version 2.5 Section 11.9 */ #define EFI_EDID_OVERRIDE_PROTOCOL_GUID \ { 0x48ECB431, 0xFB72, 0x45C0, { 0xA9, 0x22, 0xF4, 0x58, 0xFE, 0x04, 0x0B, 0xD5} } INTERFACE_DECL(_EFI_EDID_OVERRIDE_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_EDID_OVERRIDE_PROTOCOL_GET_EDID) ( IN struct _EFI_EDID_OVERRIDE_PROTOCOL *This, IN EFI_HANDLE *ChildHandle, OUT UINT32 *Attributes, IN OUT UINTN *EdidSize, IN OUT UINT8 **Edid); typedef struct _EFI_EDID_OVERRIDE_PROTOCOL { EFI_EDID_OVERRIDE_PROTOCOL_GET_EDID GetEdid; } EFI_EDID_OVERRIDE_PROTOCOL; INTERFACE_DECL(_EFI_SERVICE_BINDING); typedef EFI_STATUS (EFIAPI *EFI_SERVICE_BINDING_CREATE_CHILD) ( IN struct _EFI_SERVICE_BINDING *This, IN EFI_HANDLE *ChildHandle ); typedef EFI_STATUS (EFIAPI *EFI_SERVICE_BINDING_DESTROY_CHILD) ( IN struct _EFI_SERVICE_BINDING *This, IN EFI_HANDLE ChildHandle ); typedef struct _EFI_SERVICE_BINDING { EFI_SERVICE_BINDING_CREATE_CHILD CreateChild; EFI_SERVICE_BINDING_DESTROY_CHILD DestroyChild; } EFI_SERVICE_BINDING; /* * EFI Driver Binding Protocol * UEFI Specification Version 2.5 Section 10.1 */ #define EFI_DRIVER_BINDING_PROTOCOL_GUID \ { 0x18A031AB, 0xB443, 0x4D1A, { 0xA5, 0xC0, 0x0C, 0x09, 0x26, 0x1E, 0x9F, 0x71} } #define DRIVER_BINDING_PROTOCOL EFI_DRIVER_BINDING_PROTOCOL_GUID INTERFACE_DECL(_EFI_DRIVER_BINDING_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_DRIVER_BINDING_PROTOCOL_SUPPORTED) ( IN struct _EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH *RemainingDevicePath OPTIONAL); typedef EFI_STATUS (EFIAPI *EFI_DRIVER_BINDING_PROTOCOL_START) ( IN struct _EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH *RemainingDevicePath OPTIONAL); typedef EFI_STATUS (EFIAPI *EFI_DRIVER_BINDING_PROTOCOL_STOP) ( IN struct _EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer OPTIONAL); typedef struct _EFI_DRIVER_BINDING_PROTOCOL { EFI_DRIVER_BINDING_PROTOCOL_SUPPORTED Supported; EFI_DRIVER_BINDING_PROTOCOL_START Start; EFI_DRIVER_BINDING_PROTOCOL_STOP Stop; UINT32 Version; EFI_HANDLE ImageHandle; EFI_HANDLE DriverBindingHandle; } EFI_DRIVER_BINDING_PROTOCOL; typedef struct _EFI_DRIVER_BINDING_PROTOCOL _EFI_DRIVER_BINDING; typedef EFI_DRIVER_BINDING_PROTOCOL EFI_DRIVER_BINDING; /* * Backwards compatibility with older GNU-EFI versions. Deprecated. */ #define EFI_DRIVER_SUPPORTED EFI_DRIVER_BINDING_PROTOCOL_SUPPORTED #define EFI_DRIVER_START EFI_DRIVER_BINDING_PROTOCOL_START #define EFI_DRIVER_STOP EFI_DRIVER_BINDING_PROTOCOL_STOP /* * EFI Component Name Protocol * Deprecated - use EFI Component Name 2 Protocol instead */ #define EFI_COMPONENT_NAME_PROTOCOL_GUID \ {0x107A772C, 0xD5E1, 0x11D4, { 0x9A, 0x46, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D} } #define COMPONENT_NAME_PROTOCOL EFI_COMPONENT_NAME_PROTOCOL_GUID INTERFACE_DECL(_EFI_COMPONENT_NAME_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_COMPONENT_NAME_GET_DRIVER_NAME) ( IN struct _EFI_COMPONENT_NAME_PROTOCOL *This, IN CHAR8 *Language, OUT CHAR16 **DriverName); typedef EFI_STATUS (EFIAPI *EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) ( IN struct _EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle OPTIONAL, IN CHAR8 *Language, OUT CHAR16 **ControllerName); typedef struct _EFI_COMPONENT_NAME_PROTOCOL { EFI_COMPONENT_NAME_GET_DRIVER_NAME GetDriverName; EFI_COMPONENT_NAME_GET_CONTROLLER_NAME GetControllerName; CHAR8 *SupportedLanguages; } EFI_COMPONENT_NAME_PROTOCOL; typedef struct _EFI_COMPONENT_NAME_PROTOCOL _EFI_COMPONENT_NAME; typedef EFI_COMPONENT_NAME_PROTOCOL EFI_COMPONENT_NAME; /* * EFI Component Name 2 Protocol * UEFI Specification Version 2.5 Section 10.5 */ #define EFI_COMPONENT_NAME2_PROTOCOL_GUID \ {0x6A7A5CFF, 0xE8D9, 0x4F70, { 0xBA, 0xDA, 0x75, 0xAB, 0x30, 0x25, 0xCE, 0x14} } #define COMPONENT_NAME2_PROTOCOL EFI_COMPONENT_NAME2_PROTOCOL_GUID INTERFACE_DECL(_EFI_COMPONENT_NAME2_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_COMPONENT_NAME2_GET_DRIVER_NAME) ( IN struct _EFI_COMPONENT_NAME2_PROTOCOL *This, IN CHAR8 *Language, OUT CHAR16 **DriverName); typedef EFI_STATUS (EFIAPI *EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) ( IN struct _EFI_COMPONENT_NAME2_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle OPTIONAL, IN CHAR8 *Language, OUT CHAR16 **ControllerName); typedef struct _EFI_COMPONENT_NAME2_PROTOCOL { EFI_COMPONENT_NAME2_GET_DRIVER_NAME GetDriverName; EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME GetControllerName; CHAR8 *SupportedLanguages; } EFI_COMPONENT_NAME2_PROTOCOL; typedef struct _EFI_COMPONENT_NAME2_PROTOCOL _EFI_COMPONENT_NAME2; typedef EFI_COMPONENT_NAME2_PROTOCOL EFI_COMPONENT_NAME2; /* * EFI Loaded Image Protocol * UEFI Specification Version 2.5 Section 8.1 */ #define EFI_LOADED_IMAGE_PROTOCOL_GUID \ { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} } #define LOADED_IMAGE_PROTOCOL EFI_LOADED_IMAGE_PROTOCOL_GUID #define EFI_LOADED_IMAGE_PROTOCOL_REVISION 0x1000 #define EFI_IMAGE_INFORMATION_REVISION EFI_LOADED_IMAGE_PROTOCOL_REVISION typedef EFI_STATUS (EFIAPI *EFI_IMAGE_UNLOAD) ( IN EFI_HANDLE ImageHandle ); typedef struct { UINT32 Revision; EFI_HANDLE ParentHandle; struct _EFI_SYSTEM_TABLE *SystemTable; // Source location of image EFI_HANDLE DeviceHandle; EFI_DEVICE_PATH *FilePath; VOID *Reserved; // Images load options UINT32 LoadOptionsSize; VOID *LoadOptions; // Location of where image was loaded VOID *ImageBase; UINT64 ImageSize; EFI_MEMORY_TYPE ImageCodeType; EFI_MEMORY_TYPE ImageDataType; // If the driver image supports a dynamic unload request EFI_IMAGE_UNLOAD Unload; } EFI_LOADED_IMAGE_PROTOCOL; typedef EFI_LOADED_IMAGE_PROTOCOL EFI_LOADED_IMAGE; #define EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL_GUID \ {0xbc62157e, 0x3e33, 0x4fec, {0x99, 0x20, 0x2d, 0x3b, 0x36, 0xd7, 0x50, 0xdf} } /* * Random Number Generator Protocol * UEFI Specification Version 2.5 Section 35.5 */ #define EFI_RNG_PROTOCOL_GUID \ { 0x3152bca5, 0xeade, 0x433d, {0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44} } typedef EFI_GUID EFI_RNG_ALGORITHM; #define EFI_RNG_ALGORITHM_SP800_90_HASH_256_GUID \ {0xa7af67cb, 0x603b, 0x4d42, {0xba, 0x21, 0x70, 0xbf, 0xb6, 0x29, 0x3f, 0x96} } #define EFI_RNG_ALGORITHM_SP800_90_HMAC_256_GUID \ {0xc5149b43, 0xae85, 0x4f53, {0x99, 0x82, 0xb9, 0x43, 0x35, 0xd3, 0xa9, 0xe7} } #define EFI_RNG_ALGORITHM_SP800_90_CTR_256_GUID \ {0x44f0de6e, 0x4d8c, 0x4045, {0xa8, 0xc7, 0x4d, 0xd1, 0x68, 0x85, 0x6b, 0x9e} } #define EFI_RNG_ALGORITHM_X9_31_3DES_GUID \ {0x63c4785a, 0xca34, 0x4012, {0xa3, 0xc8, 0x0b, 0x6a, 0x32, 0x4f, 0x55, 0x46} } #define EFI_RNG_ALGORITHM_X9_31_AES_GUID \ {0xacd03321, 0x777e, 0x4d3d, {0xb1, 0xc8, 0x20, 0xcf, 0xd8, 0x88, 0x20, 0xc9} } #define EFI_RNG_ALGORITHM_RAW \ {0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61} } INTERFACE_DECL(_EFI_RNG_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_RNG_GET_INFO) ( IN struct _EFI_RNG_PROTOCOL *This, IN OUT UINTN *RNGAlgorithmListSize, OUT EFI_RNG_ALGORITHM *RNGAlgorithmList ); typedef EFI_STATUS (EFIAPI *EFI_RNG_GET_RNG) ( IN struct _EFI_RNG_PROTOCOL *This, IN EFI_RNG_ALGORITHM *RNGAlgorithm, OPTIONAL IN UINTN RNGValueLength, OUT UINT8 *RNGValue ); typedef struct _EFI_RNG_PROTOCOL { EFI_RNG_GET_INFO GetInfo; EFI_RNG_GET_RNG GetRNG; } EFI_RNG_PROTOCOL; // // EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL // #define EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL_GUID \ { 0x6b30c738, 0xa391, 0x11d4, {0x9a, 0x3b, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } INTERFACE_DECL(_EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_PLATFORM_DRIVER_OVERRIDE_GET_DRIVER) ( IN struct _EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN OUT EFI_HANDLE *DriverImageHandle); typedef EFI_STATUS (EFIAPI *EFI_PLATFORM_DRIVER_OVERRIDE_GET_DRIVER_PATH) ( IN struct _EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN OUT EFI_DEVICE_PATH **DriverImagePath); typedef EFI_STATUS (EFIAPI *EFI_PLATFORM_DRIVER_OVERRIDE_DRIVER_LOADED) ( IN struct _EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH *DriverImagePath, IN EFI_HANDLE DriverImageHandle); typedef struct _EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL { EFI_PLATFORM_DRIVER_OVERRIDE_GET_DRIVER GetDriver; EFI_PLATFORM_DRIVER_OVERRIDE_GET_DRIVER_PATH GetDriverPath; EFI_PLATFORM_DRIVER_OVERRIDE_DRIVER_LOADED DriverLoaded; } EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL; // // EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL // #define EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL_GUID \ { 0x3bc1b285, 0x8a15, 0x4a82, {0xaa, 0xbf, 0x4d, 0x7d, 0x13, 0xfb, 0x32, 0x65} } INTERFACE_DECL(_EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_GET_DRIVER) ( IN struct _EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *This, IN OUT EFI_HANDLE *DriverImageHandle); typedef struct _EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL { EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_GET_DRIVER GetDriver; } EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL; // // EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL // #define EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL_GUID \ { 0xb1ee129e, 0xda36, 0x4181, {0x91, 0xf8, 0x04, 0xa4, 0x92, 0x37, 0x66, 0xa7} } INTERFACE_DECL(_EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL); typedef UINT32 (EFIAPI *EFI_DRIVER_FAMILY_OVERRIDE_GET_VERSION) ( IN struct _EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL *This); typedef struct _EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL { EFI_DRIVER_FAMILY_OVERRIDE_GET_VERSION GetVersion; } EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL; // // EFI_EBC_PROTOCOL // #define EFI_EBC_INTERPRETER_PROTOCOL_GUID \ {0x13ac6dd1, 0x73d0, 0x11d4, {0xb0, 0x6b, 0x00, 0xaa, 0x00, 0xbd, 0x6d, 0xe7} } #define EFI_EBC_PROTOCOL_GUID EFI_EBC_INTERPRETER_PROTOCOL_GUID INTERFACE_DECL(_EFI_EBC_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_EBC_CREATE_THUNK)( IN struct _EFI_EBC_PROTOCOL *This, IN EFI_HANDLE ImageHandle, IN VOID *EbcEntryPoint, OUT VOID **Thunk); typedef EFI_STATUS (EFIAPI *EFI_EBC_UNLOAD_IMAGE)( IN struct _EFI_EBC_PROTOCOL *This, IN EFI_HANDLE ImageHandle); typedef EFI_STATUS (EFIAPI *EBC_ICACHE_FLUSH)( IN EFI_PHYSICAL_ADDRESS Start, IN UINT64 Length); typedef EFI_STATUS (EFIAPI *EFI_EBC_REGISTER_ICACHE_FLUSH)( IN struct _EFI_EBC_PROTOCOL *This, IN EBC_ICACHE_FLUSH Flush); typedef EFI_STATUS (EFIAPI *EFI_EBC_GET_VERSION)( IN struct _EFI_EBC_PROTOCOL *This, IN OUT UINT64 *Version); typedef struct _EFI_EBC_PROTOCOL { EFI_EBC_CREATE_THUNK CreateThunk; EFI_EBC_UNLOAD_IMAGE UnloadImage; EFI_EBC_REGISTER_ICACHE_FLUSH RegisterICacheFlush; EFI_EBC_GET_VERSION GetVersion; } EFI_EBC_PROTOCOL; INTERFACE_DECL(_EFI_MEMORY_ATTRIBUTE_PROTOCOL); typedef EFI_STATUS (EFIAPI *EFI_GET_MEMORY_ATTRIBUTES)( IN struct _EFI_MEMORY_ATTRIBUTE_PROTOCOL *This, IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, OUT UINT64 *Attributes ); typedef EFI_STATUS (EFIAPI *EFI_SET_MEMORY_ATTRIBUTES)( IN struct _EFI_MEMORY_ATTRIBUTE_PROTOCOL *This, IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, IN UINT64 Attributes ); typedef EFI_STATUS (EFIAPI *EFI_CLEAR_MEMORY_ATTRIBUTES)( IN struct _EFI_MEMORY_ATTRIBUTE_PROTOCOL *This, IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, IN UINT64 Attributes ); typedef struct _EFI_MEMORY_ATTRIBUTE_PROTOCOL { EFI_GET_MEMORY_ATTRIBUTES GetMemoryAttributes; EFI_SET_MEMORY_ATTRIBUTES SetMemoryAttributes; EFI_CLEAR_MEMORY_ATTRIBUTES ClearMemoryAttributes; } EFI_MEMORY_ATTRIBUTE_PROTOCOL; #endif ncroxon-gnu-efi-157d47c/inc/efipxebc.h000066400000000000000000000403321471215650600176100ustar00rootroot00000000000000#ifndef _EFIPXEBC_H #define _EFIPXEBC_H /*++ Copyright (c) 1998 Intel Corporation Module Name: efipxebc.h Abstract: EFI PXE Base Code Protocol Revision History --*/ // // PXE Base Code protocol // #define EFI_PXE_BASE_CODE_PROTOCOL_GUID \ { 0x03c4e603, 0xac28, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } INTERFACE_DECL(_EFI_PXE_BASE_CODE_PROTOCOL); #define DEFAULT_TTL 4 #define DEFAULT_ToS 0 // // Address definitions // typedef union { UINT32 Addr[4]; EFI_IPv4_ADDRESS v4; EFI_IPv6_ADDRESS v6; } EFI_IP_ADDRESS; typedef UINT16 EFI_PXE_BASE_CODE_UDP_PORT; // // Packet definitions // typedef struct { UINT8 BootpOpcode; UINT8 BootpHwType; UINT8 BootpHwAddrLen; UINT8 BootpGateHops; UINT32 BootpIdent; UINT16 BootpSeconds; UINT16 BootpFlags; UINT8 BootpCiAddr[4]; UINT8 BootpYiAddr[4]; UINT8 BootpSiAddr[4]; UINT8 BootpGiAddr[4]; UINT8 BootpHwAddr[16]; UINT8 BootpSrvName[64]; UINT8 BootpBootFile[128]; UINT32 DhcpMagik; UINT8 DhcpOptions[56]; } EFI_PXE_BASE_CODE_DHCPV4_PACKET; typedef struct { UINT32 MessageType:8; UINT32 TransactionId:24; UINT8 DhcpOptions[1024]; } EFI_PXE_BASE_CODE_DHCPV6_PACKET; typedef union { UINT8 Raw[1472]; EFI_PXE_BASE_CODE_DHCPV4_PACKET Dhcpv4; EFI_PXE_BASE_CODE_DHCPV6_PACKET Dhcpv6; } EFI_PXE_BASE_CODE_PACKET; typedef struct { UINT8 Type; UINT8 Code; UINT16 Checksum; union { UINT32 reserved; UINT32 Mtu; UINT32 Pointer; struct { UINT16 Identifier; UINT16 Sequence; } Echo; } u; UINT8 Data[494]; } EFI_PXE_BASE_CODE_ICMP_ERROR; typedef struct { UINT8 ErrorCode; CHAR8 ErrorString[127]; } EFI_PXE_BASE_CODE_TFTP_ERROR; // // IP Receive Filter definitions // #define EFI_PXE_BASE_CODE_MAX_IPCNT 8 typedef struct { UINT8 Filters; UINT8 IpCnt; UINT16 reserved; EFI_IP_ADDRESS IpList[EFI_PXE_BASE_CODE_MAX_IPCNT]; } EFI_PXE_BASE_CODE_IP_FILTER; #define EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP 0x0001 #define EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST 0x0002 #define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS 0x0004 #define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST 0x0008 // // ARP Cache definitions // typedef struct { EFI_IP_ADDRESS IpAddr; EFI_MAC_ADDRESS MacAddr; } EFI_PXE_BASE_CODE_ARP_ENTRY; typedef struct { EFI_IP_ADDRESS IpAddr; EFI_IP_ADDRESS SubnetMask; EFI_IP_ADDRESS GwAddr; } EFI_PXE_BASE_CODE_ROUTE_ENTRY; // // UDP definitions // #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP 0x0001 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT 0x0002 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP 0x0004 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT 0x0008 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER 0x0010 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT 0x0020 // // Discover() definitions // #define EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP 0 #define EFI_PXE_BASE_CODE_BOOT_TYPE_MS_WINNT_RIS 1 #define EFI_PXE_BASE_CODE_BOOT_TYPE_INTEL_LCM 2 #define EFI_PXE_BASE_CODE_BOOT_TYPE_DOSUNDI 3 #define EFI_PXE_BASE_CODE_BOOT_TYPE_NEC_ESMPRO 4 #define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_WSoD 5 #define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_LCCM 6 #define EFI_PXE_BASE_CODE_BOOT_TYPE_CA_UNICENTER_TNG 7 #define EFI_PXE_BASE_CODE_BOOT_TYPE_HP_OPENVIEW 8 #define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_9 9 #define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_10 10 #define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_11 11 #define EFI_PXE_BASE_CODE_BOOT_TYPE_NOT_USED_12 12 #define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_INSTALL 13 #define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_BOOT 14 #define EFI_PXE_BASE_CODE_BOOT_TYPE_REMBO 15 #define EFI_PXE_BASE_CODE_BOOT_TYPE_BEOBOOT 16 // // 17 through 32767 are reserved // 32768 through 65279 are for vendor use // 65280 through 65534 are reserved // #define EFI_PXE_BASE_CODE_BOOT_TYPE_PXETEST 65535 #define EFI_PXE_BASE_CODE_BOOT_LAYER_MASK 0x7FFF #define EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL 0x0000 typedef struct { UINT16 Type; BOOLEAN AcceptAnyResponse; UINT8 Reserved; EFI_IP_ADDRESS IpAddr; } EFI_PXE_BASE_CODE_SRVLIST; typedef struct { BOOLEAN UseMCast; BOOLEAN UseBCast; BOOLEAN UseUCast; BOOLEAN MustUseList; EFI_IP_ADDRESS ServerMCastIp; UINT16 IpCnt; EFI_PXE_BASE_CODE_SRVLIST SrvList[1]; } EFI_PXE_BASE_CODE_DISCOVER_INFO; // // Mtftp() definitions // typedef enum { EFI_PXE_BASE_CODE_TFTP_FIRST, EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE, EFI_PXE_BASE_CODE_TFTP_READ_FILE, EFI_PXE_BASE_CODE_TFTP_WRITE_FILE, EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY, EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE, EFI_PXE_BASE_CODE_MTFTP_READ_FILE, EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY, EFI_PXE_BASE_CODE_MTFTP_LAST } EFI_PXE_BASE_CODE_TFTP_OPCODE; typedef struct { EFI_IP_ADDRESS MCastIp; EFI_PXE_BASE_CODE_UDP_PORT CPort; EFI_PXE_BASE_CODE_UDP_PORT SPort; UINT16 ListenTimeout; UINT16 TransmitTimeout; } EFI_PXE_BASE_CODE_MTFTP_INFO; // // PXE Base Code Mode structure // #define EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES 8 #define EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES 8 typedef struct { BOOLEAN Started; BOOLEAN Ipv6Available; BOOLEAN Ipv6Supported; BOOLEAN UsingIpv6; BOOLEAN BisSupported; BOOLEAN BisDetected; BOOLEAN AutoArp; BOOLEAN SendGUID; BOOLEAN DhcpDiscoverValid; BOOLEAN DhcpAckReceived; BOOLEAN ProxyOfferReceived; BOOLEAN PxeDiscoverValid; BOOLEAN PxeReplyReceived; BOOLEAN PxeBisReplyReceived; BOOLEAN IcmpErrorReceived; BOOLEAN TftpErrorReceived; BOOLEAN MakeCallbacks; UINT8 TTL; UINT8 ToS; EFI_IP_ADDRESS StationIp; EFI_IP_ADDRESS SubnetMask; EFI_PXE_BASE_CODE_PACKET DhcpDiscover; EFI_PXE_BASE_CODE_PACKET DhcpAck; EFI_PXE_BASE_CODE_PACKET ProxyOffer; EFI_PXE_BASE_CODE_PACKET PxeDiscover; EFI_PXE_BASE_CODE_PACKET PxeReply; EFI_PXE_BASE_CODE_PACKET PxeBisReply; EFI_PXE_BASE_CODE_IP_FILTER IpFilter; UINT32 ArpCacheEntries; EFI_PXE_BASE_CODE_ARP_ENTRY ArpCache[EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES]; UINT32 RouteTableEntries; EFI_PXE_BASE_CODE_ROUTE_ENTRY RouteTable[EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES]; EFI_PXE_BASE_CODE_ICMP_ERROR IcmpError; EFI_PXE_BASE_CODE_TFTP_ERROR TftpError; } EFI_PXE_BASE_CODE_MODE; // // PXE Base Code Interface Function definitions // typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_START) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This, IN BOOLEAN UseIpv6 ); typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_STOP) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This ); typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_DHCP) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This, IN BOOLEAN SortOffers ); typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_DISCOVER) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This, IN UINT16 Type, IN UINT16 *Layer, IN BOOLEAN UseBis, IN OUT EFI_PXE_BASE_CODE_DISCOVER_INFO *Info OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_MTFTP) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This, IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, IN OUT VOID *BufferPtr OPTIONAL, IN BOOLEAN Overwrite, IN OUT UINT64 *BufferSize, IN UINTN *BlockSize OPTIONAL, IN EFI_IP_ADDRESS *ServerIp, IN UINT8 *Filename, IN EFI_PXE_BASE_CODE_MTFTP_INFO *Info OPTIONAL, IN BOOLEAN DontUseBuffer ); typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_UDP_WRITE) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This, IN UINT16 OpFlags, IN EFI_IP_ADDRESS *DestIp, IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort, IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL IN EFI_IP_ADDRESS *SrcIp, OPTIONAL IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL IN UINTN *HeaderSize, OPTIONAL IN VOID *HeaderPtr, OPTIONAL IN UINTN *BufferSize, IN VOID *BufferPtr ); typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_UDP_READ) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This, IN UINT16 OpFlags, IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort, OPTIONAL IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL IN UINTN *HeaderSize, OPTIONAL IN VOID *HeaderPtr, OPTIONAL IN OUT UINTN *BufferSize, IN VOID *BufferPtr ); typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_SET_IP_FILTER) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This, IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter ); typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_ARP) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This, IN EFI_IP_ADDRESS *IpAddr, IN EFI_MAC_ADDRESS *MacAddr OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_SET_PARAMETERS) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This, IN BOOLEAN *NewAutoArp, OPTIONAL IN BOOLEAN *NewSendGUID, OPTIONAL IN UINT8 *NewTTL, OPTIONAL IN UINT8 *NewToS, OPTIONAL IN BOOLEAN *NewMakeCallback OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_SET_STATION_IP) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This, IN EFI_IP_ADDRESS *NewStationIp, OPTIONAL IN EFI_IP_ADDRESS *NewSubnetMask OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_PXE_BASE_CODE_SET_PACKETS) ( IN struct _EFI_PXE_BASE_CODE_PROTOCOL *This, BOOLEAN *NewDhcpDiscoverValid, OPTIONAL BOOLEAN *NewDhcpAckReceived, OPTIONAL BOOLEAN *NewProxyOfferReceived, OPTIONAL BOOLEAN *NewPxeDiscoverValid, OPTIONAL BOOLEAN *NewPxeReplyReceived, OPTIONAL BOOLEAN *NewPxeBisReplyReceived,OPTIONAL IN EFI_PXE_BASE_CODE_PACKET *NewDhcpDiscover, OPTIONAL IN EFI_PXE_BASE_CODE_PACKET *NewDhcpAck, OPTIONAL IN EFI_PXE_BASE_CODE_PACKET *NewProxyOffer, OPTIONAL IN EFI_PXE_BASE_CODE_PACKET *NewPxeDiscover, OPTIONAL IN EFI_PXE_BASE_CODE_PACKET *NewPxeReply, OPTIONAL IN EFI_PXE_BASE_CODE_PACKET *NewPxeBisReply OPTIONAL ); // // PXE Base Code Protocol structure // #define EFI_PXE_BASE_CODE_PROTOCOL_REVISION 0x00010000 #define EFI_PXE_BASE_CODE_INTERFACE_REVISION EFI_PXE_BASE_CODE_PROTOCOL_REVISION typedef struct _EFI_PXE_BASE_CODE_PROTOCOL { UINT64 Revision; EFI_PXE_BASE_CODE_START Start; EFI_PXE_BASE_CODE_STOP Stop; EFI_PXE_BASE_CODE_DHCP Dhcp; EFI_PXE_BASE_CODE_DISCOVER Discover; EFI_PXE_BASE_CODE_MTFTP Mtftp; EFI_PXE_BASE_CODE_UDP_WRITE UdpWrite; EFI_PXE_BASE_CODE_UDP_READ UdpRead; EFI_PXE_BASE_CODE_SET_IP_FILTER SetIpFilter; EFI_PXE_BASE_CODE_ARP Arp; EFI_PXE_BASE_CODE_SET_PARAMETERS SetParameters; EFI_PXE_BASE_CODE_SET_STATION_IP SetStationIp; EFI_PXE_BASE_CODE_SET_PACKETS SetPackets; EFI_PXE_BASE_CODE_MODE *Mode; } EFI_PXE_BASE_CODE_PROTOCOL; // Note: Because it conflicted with the EDK2 struct name, the // 'EFI_PXE_BASE_CODE_PROTOCOL' GUID definition, from older // versions of gnu-efi, is now obsoleted. // Use 'EFI_PXE_BASE_CODE_PROTOCOL_GUID' instead. typedef struct _EFI_PXE_BASE_CODE_PROTOCOL _EFI_PXE_BASE_CODE; typedef struct _EFI_PXE_BASE_CODE_PROTOCOL EFI_PXE_BASE_CODE; // // Call Back Definitions // #define EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_GUID \ { 0x245dca21, 0xfb7b, 0x11d3, {0x8f, 0x01, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } // // Revision Number // #define EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION 0x00010000 #define EFI_PXE_BASE_CODE_CALLBACK_INTERFACE_REVISION EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION INTERFACE_DECL(_EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL); typedef enum { EFI_PXE_BASE_CODE_FUNCTION_FIRST, EFI_PXE_BASE_CODE_FUNCTION_DHCP, EFI_PXE_BASE_CODE_FUNCTION_DISCOVER, EFI_PXE_BASE_CODE_FUNCTION_MTFTP, EFI_PXE_BASE_CODE_FUNCTION_UDP_WRITE, EFI_PXE_BASE_CODE_FUNCTION_UDP_READ, EFI_PXE_BASE_CODE_FUNCTION_ARP, EFI_PXE_BASE_CODE_FUNCTION_IGMP, EFI_PXE_BASE_CODE_PXE_FUNCTION_LAST } EFI_PXE_BASE_CODE_FUNCTION; typedef enum { EFI_PXE_BASE_CODE_CALLBACK_STATUS_FIRST, EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT, EFI_PXE_BASE_CODE_CALLBACK_STATUS_LAST } EFI_PXE_BASE_CODE_CALLBACK_STATUS; typedef EFI_PXE_BASE_CODE_CALLBACK_STATUS (EFIAPI *EFI_PXE_CALLBACK) ( IN struct _EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *This, IN EFI_PXE_BASE_CODE_FUNCTION Function, IN BOOLEAN Received, IN UINT32 PacketLen, IN EFI_PXE_BASE_CODE_PACKET *Packet OPTIONAL ); typedef struct _EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL { UINT64 Revision; EFI_PXE_CALLBACK Callback; } EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL; // Note: Because it conflicted with the EDK2 struct name, the // 'EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL' GUID definition, from // older versions of gnu-efi, is now obsoleted. // Use 'EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_GUID' instead. typedef struct _EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL _EFI_PXE_BASE_CODE_CALLBACK; typedef EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL EFI_PXE_BASE_CODE_CALLBACK; #endif /* _EFIPXEBC_H */ ncroxon-gnu-efi-157d47c/inc/efirtlib.h000066400000000000000000000057351471215650600176330ustar00rootroot00000000000000#ifndef _EFI_RT_LIB_INCLUDE_ #define _EFI_RT_LIB_INCLUDE_ /*++ Copyright (c) 1998 Intel Corporation Module Name: efilib.h Abstract: EFI Runtime library functions Revision History --*/ #include "efidebug.h" #include "efipart.h" #if defined(_M_X64) || defined(__x86_64__) || defined(__amd64__) #include "x86_64/efilibplat.h" #elif defined(_M_IX86) || defined(__i386__) #include "ia32/efilibplat.h" #elif defined(_M_IA64) || defined(__ia64__) #include "ia64/efilibplat.h" #elif defined (_M_ARM64) || defined(__aarch64__) #include "aarch64/efilibplat.h" #elif defined (_M_ARM) || defined(__arm__) #include "arm/efilibplat.h" #elif defined (_M_MIPS64) || defined(__mips64__) || defined(__mips64) #include "mips64el/efilibplat.h" #elif defined (__riscv) && __riscv_xlen == 64 #include "riscv64/efilibplat.h" #endif VOID RUNTIMEFUNCTION RtZeroMem ( IN VOID *Buffer, IN UINTN Size ); VOID EFIAPI RUNTIMEFUNCTION RtSetMem ( IN VOID *Buffer, IN UINTN Size, IN UINT8 Value ); VOID EFIAPI RUNTIMEFUNCTION RtCopyMem ( IN VOID *Dest, IN VOID *Src, IN UINTN len ); VOID EFIAPI RUNTIMEFUNCTION RtCopyMemC ( IN VOID *Dest, IN CONST VOID *Src, IN UINTN len ); INTN RUNTIMEFUNCTION RtCompareMem ( IN CONST VOID *Dest, IN CONST VOID *Src, IN UINTN len ); INTN RUNTIMEFUNCTION RtStrCmp ( IN CONST CHAR16 *s1, IN CONST CHAR16 *s2 ); VOID RUNTIMEFUNCTION RtStrCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ); VOID RUNTIMEFUNCTION RtStrnCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ); CHAR16 * RUNTIMEFUNCTION RtStpCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ); CHAR16 * RUNTIMEFUNCTION RtStpnCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ); VOID RUNTIMEFUNCTION RtStrCat ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ); VOID RUNTIMEFUNCTION RtStrnCat ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ); UINTN RUNTIMEFUNCTION RtStrLen ( IN CONST CHAR16 *s1 ); UINTN RUNTIMEFUNCTION RtStrnLen ( IN CONST CHAR16 *s1, IN UINTN Len ); UINTN RUNTIMEFUNCTION RtStrSize ( IN CONST CHAR16 *s1 ); BOOLEAN EFIAPI RUNTIMEFUNCTION RtCompareGuid ( IN CONST EFI_GUID *Guid1, IN CONST EFI_GUID *Guid2 ); UINT8 RUNTIMEFUNCTION RtDecimaltoBCD( IN UINT8 BcdValue ); UINT8 RUNTIMEFUNCTION RtBCDtoDecimal( IN UINT8 BcdValue ); // // Virtual mapping transition support. (Only used during // the virtual address change transisition) // VOID RUNTIMEFUNCTION RtLibEnableVirtualMappings ( VOID ); VOID RUNTIMEFUNCTION RtConvertList ( IN UINTN DebugDisposition, IN OUT LIST_ENTRY *ListHead ); VOID RUNTIMEFUNCTION RtAcquireLock ( IN FLOCK *Lock ); VOID RUNTIMEFUNCTION RtReleaseLock ( IN FLOCK *Lock ); #endif ncroxon-gnu-efi-157d47c/inc/efiser.h000066400000000000000000000070131471215650600172770ustar00rootroot00000000000000#ifndef _EFI_SER_H #define _EFI_SER_H /*++ Copyright (c) 1998 Intel Corporation Module Name: efiser.h Abstract: EFI serial protocol Revision History --*/ // // Serial protocol // #define EFI_SERIAL_IO_PROTOCOL_GUID \ { 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD} } #define SERIAL_IO_PROTOCOL EFI_SERIAL_IO_PROTOCOL_GUID INTERFACE_DECL(_EFI_SERIAL_IO_PROTOCOL); typedef enum { DefaultParity, NoParity, EvenParity, OddParity, MarkParity, SpaceParity } EFI_PARITY_TYPE; typedef enum { DefaultStopBits, OneStopBit, // 1 stop bit OneFiveStopBits, // 1.5 stop bits TwoStopBits // 2 stop bits } EFI_STOP_BITS_TYPE; #define EFI_SERIAL_CLEAR_TO_SEND 0x0010 // RO #define EFI_SERIAL_DATA_SET_READY 0x0020 // RO #define EFI_SERIAL_RING_INDICATE 0x0040 // RO #define EFI_SERIAL_CARRIER_DETECT 0x0080 // RO #define EFI_SERIAL_REQUEST_TO_SEND 0x0002 // WO #define EFI_SERIAL_DATA_TERMINAL_READY 0x0001 // WO #define EFI_SERIAL_INPUT_BUFFER_EMPTY 0x0100 // RO #define EFI_SERIAL_OUTPUT_BUFFER_EMPTY 0x0200 // RO #define EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE 0x1000 // RW #define EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE 0x2000 // RW #define EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE 0x4000 // RW typedef EFI_STATUS (EFIAPI *EFI_SERIAL_RESET) ( IN struct _EFI_SERIAL_IO_PROTOCOL *This ); typedef EFI_STATUS (EFIAPI *EFI_SERIAL_SET_ATTRIBUTES) ( IN struct _EFI_SERIAL_IO_PROTOCOL *This, IN UINT64 BaudRate, IN UINT32 ReceiveFifoDepth, IN UINT32 Timeout, IN EFI_PARITY_TYPE Parity, IN UINT8 DataBits, IN EFI_STOP_BITS_TYPE StopBits ); typedef EFI_STATUS (EFIAPI *EFI_SERIAL_SET_CONTROL_BITS) ( IN struct _EFI_SERIAL_IO_PROTOCOL *This, IN UINT32 Control ); typedef EFI_STATUS (EFIAPI *EFI_SERIAL_GET_CONTROL_BITS) ( IN struct _EFI_SERIAL_IO_PROTOCOL *This, OUT UINT32 *Control ); typedef EFI_STATUS (EFIAPI *EFI_SERIAL_WRITE) ( IN struct _EFI_SERIAL_IO_PROTOCOL *This, IN OUT UINTN *BufferSize, IN VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_SERIAL_READ) ( IN struct _EFI_SERIAL_IO_PROTOCOL *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer ); typedef struct { UINT32 ControlMask; // current Attributes UINT32 Timeout; UINT64 BaudRate; UINT32 ReceiveFifoDepth; UINT32 DataBits; UINT32 Parity; UINT32 StopBits; } SERIAL_IO_MODE; #define SERIAL_IO_INTERFACE_REVISION 0x00010000 typedef struct _EFI_SERIAL_IO_PROTOCOL { UINT32 Revision; EFI_SERIAL_RESET Reset; EFI_SERIAL_SET_ATTRIBUTES SetAttributes; EFI_SERIAL_SET_CONTROL_BITS SetControl; EFI_SERIAL_GET_CONTROL_BITS GetControl; EFI_SERIAL_WRITE Write; EFI_SERIAL_READ Read; SERIAL_IO_MODE *Mode; } EFI_SERIAL_IO_PROTOCOL; typedef struct _EFI_SERIAL_IO_PROTOCOL _SERIAL_IO_INTERFACE; typedef EFI_SERIAL_IO_PROTOCOL SERIAL_IO_INTERFACE; #endif ncroxon-gnu-efi-157d47c/inc/efisetjmp.h000066400000000000000000000004051471215650600200060ustar00rootroot00000000000000#ifndef GNU_EFI_SETJMP_H #define GNU_EFI_SETJMP_H #include "eficompiler.h" #include "efisetjmp_arch.h" extern UINTN setjmp(jmp_buf env) __attribute__((returns_twice)); extern VOID longjmp(jmp_buf env, UINTN value) EFI_NORETURN; #endif /* GNU_EFI_SETJMP_H */ ncroxon-gnu-efi-157d47c/inc/efishell.h000066400000000000000000000266351471215650600176300ustar00rootroot00000000000000/** EFI Shell protocol as defined in the UEFI Shell Specification 2.2. (C) Copyright 2014 Hewlett-Packard Development Company, L.P.
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent This file is based on MdePkg/Include/Protocol/Shell.h from EDK2 Ported to gnu-efi by Jiaqing Zhao **/ #ifndef _EFI_SHELL_H #define _EFI_SHELL_H #include "efilink.h" #define EFI_SHELL_PROTOCOL_GUID \ { 0x6302d008, 0x7f9b, 0x4f30, { 0x87, 0xac, 0x60, 0xc9, 0xfe, 0xf5, 0xda, 0x4e } } INTERFACE_DECL(_EFI_SHELL_PROTOCOL); typedef enum { SHELL_SUCCESS = 0, SHELL_LOAD_ERROR = 1, SHELL_INVALID_PARAMETER = 2, SHELL_UNSUPPORTED = 3, SHELL_BAD_BUFFER_SIZE = 4, SHELL_BUFFER_TOO_SMALL = 5, SHELL_NOT_READY = 6, SHELL_DEVICE_ERROR = 7, SHELL_WRITE_PROTECTED = 8, SHELL_OUT_OF_RESOURCES = 9, SHELL_VOLUME_CORRUPTED = 10, SHELL_VOLUME_FULL = 11, SHELL_NO_MEDIA = 12, SHELL_MEDIA_CHANGED = 13, SHELL_NOT_FOUND = 14, SHELL_ACCESS_DENIED = 15, SHELL_TIMEOUT = 18, SHELL_NOT_STARTED = 19, SHELL_ALREADY_STARTED = 20, SHELL_ABORTED = 21, SHELL_INCOMPATIBLE_VERSION = 25, SHELL_SECURITY_VIOLATION = 26, SHELL_NOT_EQUAL = 27 } SHELL_STATUS; typedef VOID *SHELL_FILE_HANDLE; typedef struct { EFI_LIST_ENTRY Link; EFI_STATUS Status; CONST CHAR16 *FullName; CONST CHAR16 *FileName; SHELL_FILE_HANDLE Handle; EFI_FILE_INFO *Info; } EFI_SHELL_FILE_INFO; typedef BOOLEAN (EFIAPI *EFI_SHELL_BATCH_IS_ACTIVE) ( VOID ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_CLOSE_FILE) ( IN SHELL_FILE_HANDLE FileHandle ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_CREATE_FILE) ( IN CONST CHAR16 *FileName, IN UINT64 FileAttribs, OUT SHELL_FILE_HANDLE *FileHandle ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_DELETE_FILE) ( IN SHELL_FILE_HANDLE FileHandle ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_DELETE_FILE_BY_NAME) ( IN CONST CHAR16 *FileName ); typedef VOID (EFIAPI *EFI_SHELL_DISABLE_PAGE_BREAK) ( VOID ); typedef VOID (EFIAPI *EFI_SHELL_ENABLE_PAGE_BREAK) ( VOID ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_EXECUTE) ( IN EFI_HANDLE *ParentImageHandle, IN CHAR16 *CommandLine OPTIONAL, IN CHAR16 **Environment OPTIONAL, OUT EFI_STATUS *StatusCode OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_FIND_FILES) ( IN CONST CHAR16 *FilePattern, OUT EFI_SHELL_FILE_INFO **FileList ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_FIND_FILES_IN_DIR) ( IN SHELL_FILE_HANDLE FileDirHandle, OUT EFI_SHELL_FILE_INFO **FileList ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_FLUSH_FILE) ( IN SHELL_FILE_HANDLE FileHandle ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_FREE_FILE_LIST) ( IN EFI_SHELL_FILE_INFO **FileList ); typedef CONST CHAR16 * (EFIAPI *EFI_SHELL_GET_ALIAS) ( IN CONST CHAR16 *Alias, OUT BOOLEAN *Volatile OPTIONAL ); typedef CONST CHAR16 * (EFIAPI *EFI_SHELL_GET_CUR_DIR) ( IN CONST CHAR16 *FileSystemMapping OPTIONAL ); typedef UINT32 EFI_SHELL_DEVICE_NAME_FLAGS; #define EFI_DEVICE_NAME_USE_COMPONENT_NAME 0x00000001 #define EFI_DEVICE_NAME_USE_DEVICE_PATH 0x00000002 typedef EFI_STATUS (EFIAPI *EFI_SHELL_GET_DEVICE_NAME) ( IN EFI_HANDLE DeviceHandle, IN EFI_SHELL_DEVICE_NAME_FLAGS Flags, IN CHAR8 *Language, OUT CHAR16 **BestDeviceName ); typedef CONST EFI_DEVICE_PATH_PROTOCOL * (EFIAPI *EFI_SHELL_GET_DEVICE_PATH_FROM_MAP) ( IN CONST CHAR16 *Mapping ); typedef EFI_DEVICE_PATH_PROTOCOL * (EFIAPI *EFI_SHELL_GET_DEVICE_PATH_FROM_FILE_PATH) ( IN CONST CHAR16 *Path ); typedef CONST CHAR16 * (EFIAPI *EFI_SHELL_GET_ENV) ( IN CONST CHAR16 *Name ); typedef CONST CHAR16 * (EFIAPI *EFI_SHELL_GET_ENV_EX) ( IN CONST CHAR16 *Name, OUT UINT32 *Attributes OPTIONAL ); typedef EFI_FILE_INFO * (EFIAPI *EFI_SHELL_GET_FILE_INFO) ( IN SHELL_FILE_HANDLE FileHandle ); typedef CHAR16 * (EFIAPI *EFI_SHELL_GET_FILE_PATH_FROM_DEVICE_PATH) ( IN CONST EFI_DEVICE_PATH_PROTOCOL *Path ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_GET_FILE_POSITION) ( IN SHELL_FILE_HANDLE FileHandle, OUT UINT64 *Position ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_GET_FILE_SIZE) ( IN SHELL_FILE_HANDLE FileHandle, OUT UINT64 *Size ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_GET_GUID_FROM_NAME) ( IN CONST CHAR16 *GuidName, OUT EFI_GUID *Guid ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_GET_GUID_NAME)( IN CONST EFI_GUID *Guid, OUT CONST CHAR16 **GuidName ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_GET_HELP_TEXT) ( IN CONST CHAR16 *Command, IN CONST CHAR16 *Sections, OUT CHAR16 **HelpText ); typedef CONST CHAR16 * (EFIAPI *EFI_SHELL_GET_MAP_FROM_DEVICE_PATH) ( IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath ); typedef BOOLEAN (EFIAPI *EFI_SHELL_GET_PAGE_BREAK) ( VOID ); typedef BOOLEAN (EFIAPI *EFI_SHELL_IS_ROOT_SHELL) ( VOID ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_OPEN_FILE_BY_NAME) ( IN CONST CHAR16 *FileName, OUT SHELL_FILE_HANDLE *FileHandle, IN UINT64 OpenMode ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_OPEN_FILE_LIST) ( IN CHAR16 *Path, IN UINT64 OpenMode, IN OUT EFI_SHELL_FILE_INFO **FileList ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_OPEN_ROOT) ( IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, OUT SHELL_FILE_HANDLE *FileHandle ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_OPEN_ROOT_BY_HANDLE) ( IN EFI_HANDLE DeviceHandle, OUT SHELL_FILE_HANDLE *FileHandle ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_READ_FILE) ( IN SHELL_FILE_HANDLE FileHandle, IN OUT UINTN *ReadSize, IN OUT VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_REGISTER_GUID_NAME) ( IN CONST EFI_GUID *Guid, IN CONST CHAR16 *GuidName ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_REMOVE_DUP_IN_FILE_LIST) ( IN EFI_SHELL_FILE_INFO **FileList ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_SET_ALIAS) ( IN CONST CHAR16 *Command, IN CONST CHAR16 *Alias, IN BOOLEAN Replace, IN BOOLEAN Volatile ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_SET_CUR_DIR) ( IN CONST CHAR16 *FileSystem OPTIONAL, IN CONST CHAR16 *Dir ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_SET_ENV) ( IN CONST CHAR16 *Name, IN CONST CHAR16 *Value, IN BOOLEAN Volatile ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_SET_FILE_INFO) ( IN SHELL_FILE_HANDLE FileHandle, IN CONST EFI_FILE_INFO *FileInfo ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_SET_FILE_POSITION) ( IN SHELL_FILE_HANDLE FileHandle, IN UINT64 Position ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_SET_MAP) ( IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN CONST CHAR16 *Mapping ); typedef EFI_STATUS (EFIAPI *EFI_SHELL_WRITE_FILE) ( IN SHELL_FILE_HANDLE FileHandle, IN OUT UINTN *BufferSize, IN VOID *Buffer ); typedef struct _EFI_SHELL_PROTOCOL { EFI_SHELL_EXECUTE Execute; EFI_SHELL_GET_ENV GetEnv; EFI_SHELL_SET_ENV SetEnv; EFI_SHELL_GET_ALIAS GetAlias; EFI_SHELL_SET_ALIAS SetAlias; EFI_SHELL_GET_HELP_TEXT GetHelpText; EFI_SHELL_GET_DEVICE_PATH_FROM_MAP GetDevicePathFromMap; EFI_SHELL_GET_MAP_FROM_DEVICE_PATH GetMapFromDevicePath; EFI_SHELL_GET_DEVICE_PATH_FROM_FILE_PATH GetDevicePathFromFilePath; EFI_SHELL_GET_FILE_PATH_FROM_DEVICE_PATH GetFilePathFromDevicePath; EFI_SHELL_SET_MAP SetMap; EFI_SHELL_GET_CUR_DIR GetCurDir; EFI_SHELL_SET_CUR_DIR SetCurDir; EFI_SHELL_OPEN_FILE_LIST OpenFileList; EFI_SHELL_FREE_FILE_LIST FreeFileList; EFI_SHELL_REMOVE_DUP_IN_FILE_LIST RemoveDupInFileList; EFI_SHELL_BATCH_IS_ACTIVE BatchIsActive; EFI_SHELL_IS_ROOT_SHELL IsRootShell; EFI_SHELL_ENABLE_PAGE_BREAK EnablePageBreak; EFI_SHELL_DISABLE_PAGE_BREAK DisablePageBreak; EFI_SHELL_GET_PAGE_BREAK GetPageBreak; EFI_SHELL_GET_DEVICE_NAME GetDeviceName; EFI_SHELL_GET_FILE_INFO GetFileInfo; EFI_SHELL_SET_FILE_INFO SetFileInfo; EFI_SHELL_OPEN_FILE_BY_NAME OpenFileByName; EFI_SHELL_CLOSE_FILE CloseFile; EFI_SHELL_CREATE_FILE CreateFile; EFI_SHELL_READ_FILE ReadFile; EFI_SHELL_WRITE_FILE WriteFile; EFI_SHELL_DELETE_FILE DeleteFile; EFI_SHELL_DELETE_FILE_BY_NAME DeleteFileByName; EFI_SHELL_GET_FILE_POSITION GetFilePosition; EFI_SHELL_SET_FILE_POSITION SetFilePosition; EFI_SHELL_FLUSH_FILE FlushFile; EFI_SHELL_FIND_FILES FindFiles; EFI_SHELL_FIND_FILES_IN_DIR FindFilesInDir; EFI_SHELL_GET_FILE_SIZE GetFileSize; EFI_SHELL_OPEN_ROOT OpenRoot; EFI_SHELL_OPEN_ROOT_BY_HANDLE OpenRootByHandle; EFI_EVENT ExecutionBreak; UINT32 MajorVersion; UINT32 MinorVersion; // Added for Shell 2.1 EFI_SHELL_REGISTER_GUID_NAME RegisterGuidName; EFI_SHELL_GET_GUID_NAME GetGuidName; EFI_SHELL_GET_GUID_FROM_NAME GetGuidFromName; EFI_SHELL_GET_ENV_EX GetEnvEx; } EFI_SHELL_PROTOCOL; #define EFI_SHELL_PARAMETERS_PROTOCOL_GUID \ { 0x752f3136, 0x4e16, 0x4fdc, { 0xa2, 0x2a, 0xe5, 0xf4, 0x68, 0x12, 0xf4, 0xca } } INTERFACE_DECL(_EFI_SHELL_PARAMETERS_PROTOCOL); typedef struct _EFI_SHELL_PARAMETERS_PROTOCOL { CHAR16 **Argv; UINTN Argc; SHELL_FILE_HANDLE StdIn; SHELL_FILE_HANDLE StdOut; SHELL_FILE_HANDLE StdErr; } EFI_SHELL_PARAMETERS_PROTOCOL; #define EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL_GUID \ { 0x3c7200e9, 0x005f, 0x4ea4, { 0x87, 0xde, 0xa3, 0xdf, 0xac, 0x8a, 0x27, 0xc3 } } INTERFACE_DECL(_EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL); typedef SHELL_STATUS (EFIAPI *SHELL_COMMAND_HANDLER)( IN struct _EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL *This, IN EFI_SYSTEM_TABLE *SystemTable, IN EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters, IN EFI_SHELL_PROTOCOL *Shell ); typedef CHAR16* (EFIAPI *SHELL_COMMAND_GETHELP)( IN struct _EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL *This, IN CONST CHAR8 *Language ); typedef struct _EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL { CONST CHAR16 *CommandName; SHELL_COMMAND_HANDLER Handler; SHELL_COMMAND_GETHELP GetHelp; } EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL; #endif ncroxon-gnu-efi-157d47c/inc/efishellintf.h000066400000000000000000000046361471215650600205060ustar00rootroot00000000000000/** @file SHELL_INTERFACE_PROTOCOL from EDK shell (no spec). Shell Interface - additional information (over image_info) provided to an application started by the shell. ConIo provides a file-style interface to the console. The shell interface's and data (including ConIo) are only valid during the applications Entry Point. Once the application returns from it's entry point the data is freed by the invoking shell. Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ /* * This is based on ShellPkg/Include/Protocol/EfiShellInterface.h from EDK II. */ #ifndef _SHELLINTERFACE_H_ #define _SHELLINTERFACE_H_ #define SHELL_INTERFACE_PROTOCOL_GUID \ { \ 0x47c7b223, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} \ } /// /// Bit definitions for EFI_SHELL_ARG_INFO /// typedef enum { ARG_NO_ATTRIB = 0x0, ARG_IS_QUOTED = 1<<0, ARG_PARTIALLY_QUOTED = 1<<1, ARG_FIRST_HALF_QUOTED = 1<<2, ARG_FIRST_CHAR_IS_ESC = 1<<3 } EFI_SHELL_ARG_INFO_TYPES; /// /// Attributes for an argument. /// typedef struct _EFI_SHELL_ARG_INFO { UINT32 Attributes; } EFI_SHELL_ARG_INFO; /// /// This protocol provides access to additional information about a shell application. /// typedef struct { /// /// Handle back to original image handle & image information. /// EFI_HANDLE ImageHandle; EFI_LOADED_IMAGE *Info; /// /// Parsed arg list converted more C-like format. /// CHAR16 **Argv; UINTN Argc; /// /// Storage for file redirection args after parsing. /// CHAR16 **RedirArgv; UINTN RedirArgc; /// /// A file style handle for console io. /// EFI_FILE *StdIn; EFI_FILE *StdOut; EFI_FILE *StdErr; /// /// List of attributes for each argument. /// EFI_SHELL_ARG_INFO *ArgInfo; /// /// Whether we are echoing. /// BOOLEAN EchoOn; } EFI_SHELL_INTERFACE; #endif ncroxon-gnu-efi-157d47c/inc/efistdarg.h000066400000000000000000000010201471215650600177620ustar00rootroot00000000000000#ifndef _EFISTDARG_H_ #define _EFISTDARG_H_ /*++ Copyright (c) 1998 Intel Corporation Module Name: devpath.h Abstract: Defines for parsing the EFI Device Path structures Revision History --*/ #if !defined(GNU_EFI_USE_EXTERNAL_STDARG) && !defined(_MSC_VER) typedef __builtin_va_list va_list; # define va_start(v,l) __builtin_va_start(v,l) # define va_end(v) __builtin_va_end(v) # define va_arg(v,l) __builtin_va_arg(v,l) # define va_copy(d,s) __builtin_va_copy(d,s) #else # include #endif #endif ncroxon-gnu-efi-157d47c/inc/efitcp.h000066400000000000000000000236251471215650600173030ustar00rootroot00000000000000#ifndef _EFI_TCP_H #define _EFI_TCP_H /*++ Copyright (c) 2013 Intel Corporation --*/ #define EFI_TCP4_SERVICE_BINDING_PROTOCOL \ { 0x00720665, 0x67eb, 0x4a99, {0xba, 0xf7, 0xd3, 0xc3, 0x3a, 0x1c,0x7c, 0xc9}} #define EFI_TCP4_PROTOCOL \ { 0x65530bc7, 0xa359, 0x410f, {0xb0, 0x10, 0x5a, 0xad, 0xc7, 0xec, 0x2b, 0x62}} #define EFI_TCP6_SERVICE_BINDING_PROTOCOL \ { 0xec20eb79, 0x6c1a, 0x4664, {0x9a, 0xd, 0xd2, 0xe4, 0xcc, 0x16, 0xd6, 0x64}} #define EFI_TCP6_PROTOCOL \ { 0x46e44855, 0xbd60, 0x4ab7, {0xab, 0xd, 0xa6, 0x79, 0xb9, 0x44, 0x7d, 0x77}} INTERFACE_DECL(_EFI_TCP4); INTERFACE_DECL(_EFI_TCP6); typedef struct { BOOLEAN UseDefaultAddress; EFI_IPv4_ADDRESS StationAddress; EFI_IPv4_ADDRESS SubnetMask; UINT16 StationPort; EFI_IPv4_ADDRESS RemoteAddress; UINT16 RemotePort; BOOLEAN ActiveFlag; } EFI_TCP4_ACCESS_POINT; typedef struct { UINT32 ReceiveBufferSize; UINT32 SendBufferSize; UINT32 MaxSynBackLog; UINT32 ConnectionTimeout; UINT32 DataRetries; UINT32 FinTimeout; UINT32 TimeWaitTimeout; UINT32 KeepAliveProbes; UINT32 KeepAliveTime; UINT32 KeepAliveInterval; BOOLEAN EnableNagle; BOOLEAN EnableTimeStamp; BOOLEAN EnableWindowScaling; BOOLEAN EnableSelectiveAck; BOOLEAN EnablePAthMtuDiscovery; } EFI_TCP4_OPTION; typedef struct { // Receiving Filters // I/O parameters UINT8 TypeOfService; UINT8 TimeToLive; // Access Point EFI_TCP4_ACCESS_POINT AccessPoint; // TCP Control Options EFI_TCP4_OPTION *ControlOption; } EFI_TCP4_CONFIG_DATA; typedef enum { Tcp4StateClosed = 0, Tcp4StateListen = 1, Tcp4StateSynSent = 2, Tcp4StateSynReceived = 3, Tcp4StateEstablished = 4, Tcp4StateFinWait1 = 5, Tcp4StateFinWait2 = 6, Tcp4StateClosing = 7, Tcp4StateTimeWait = 8, Tcp4StateCloseWait = 9, Tcp4StateLastAck = 10 } EFI_TCP4_CONNECTION_STATE; typedef EFI_STATUS (EFIAPI *EFI_TCP4_GET_MODE_DATA) ( IN struct _EFI_TCP4 *This, OUT EFI_TCP4_CONNECTION_STATE *Tcp4State OPTIONAL, OUT EFI_TCP4_CONFIG_DATA *Tcp4ConfigData OPTIONAL, OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_TCP4_CONFIGURE) ( IN struct _EFI_TCP4 *This, IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_TCP4_ROUTES) ( IN struct _EFI_TCP4 *This, IN BOOLEAN DeleteRoute, IN EFI_IPv4_ADDRESS *SubnetAddress, IN EFI_IPv4_ADDRESS *SubnetMask, IN EFI_IPv4_ADDRESS *GatewayAddress ); typedef struct { EFI_EVENT Event; EFI_STATUS Status; } EFI_TCP4_COMPLETION_TOKEN; typedef struct { EFI_TCP4_COMPLETION_TOKEN CompletionToken; } EFI_TCP4_CONNECTION_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_TCP4_CONNECT) ( IN struct _EFI_TCP4 *This, IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken ); typedef struct { EFI_TCP4_COMPLETION_TOKEN CompletionToken; EFI_HANDLE NewChildHandle; } EFI_TCP4_LISTEN_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_TCP4_ACCEPT) ( IN struct _EFI_TCP4 *This, IN EFI_TCP4_LISTEN_TOKEN *ListenToken ); #define EFI_CONNECTION_FIN EFIERR(104) #define EFI_CONNECTION_RESET EFIERR(105) #define EFI_CONNECTION_REFUSED EFIERR(106) typedef struct { UINT32 FragmentLength; VOID *FragmentBuffer; } EFI_TCP4_FRAGMENT_DATA; typedef struct { BOOLEAN UrgentFlag; UINT32 DataLength; UINT32 FragmentCount; EFI_TCP4_FRAGMENT_DATA FragmentTable[1]; } EFI_TCP4_RECEIVE_DATA; typedef struct { BOOLEAN Push; BOOLEAN Urgent; UINT32 DataLength; UINT32 FragmentCount; EFI_TCP4_FRAGMENT_DATA FragmentTable[1]; } EFI_TCP4_TRANSMIT_DATA; typedef struct { EFI_TCP4_COMPLETION_TOKEN CompletionToken; union { EFI_TCP4_RECEIVE_DATA *RxData; EFI_TCP4_TRANSMIT_DATA *TxData; } Packet; } EFI_TCP4_IO_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_TCP4_TRANSMIT) ( IN struct _EFI_TCP4 *This, IN EFI_TCP4_IO_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_TCP4_RECEIVE) ( IN struct _EFI_TCP4 *This, IN EFI_TCP4_IO_TOKEN *Token ); typedef struct { EFI_TCP4_COMPLETION_TOKEN CompletionToken; BOOLEAN AbortOnClose; } EFI_TCP4_CLOSE_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_TCP4_CLOSE)( IN struct _EFI_TCP4 *This, IN EFI_TCP4_CLOSE_TOKEN *CloseToken ); typedef EFI_STATUS (EFIAPI *EFI_TCP4_CANCEL)( IN struct _EFI_TCP4 *This, IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_TCP4_POLL) ( IN struct _EFI_TCP4 *This ); typedef struct _EFI_TCP4 { EFI_TCP4_GET_MODE_DATA GetModeData; EFI_TCP4_CONFIGURE Configure; EFI_TCP4_ROUTES Routes; EFI_TCP4_CONNECT Connect; EFI_TCP4_ACCEPT Accept; EFI_TCP4_TRANSMIT Transmit; EFI_TCP4_RECEIVE Receive; EFI_TCP4_CLOSE Close; EFI_TCP4_CANCEL Cancel; EFI_TCP4_POLL Poll; } EFI_TCP4; typedef enum { Tcp6StateClosed = 0, Tcp6StateListen = 1, Tcp6StateSynSent = 2, Tcp6StateSynReceived = 3, Tcp6StateEstablished = 4, Tcp6StateFinWait1 = 5, Tcp6StateFinWait2 = 6, Tcp6StateClosing = 7, Tcp6StateTimeWait = 8, Tcp6StateCloseWait = 9, Tcp6StateLastAck = 10 } EFI_TCP6_CONNECTION_STATE; typedef struct { EFI_IPv6_ADDRESS StationAddress; UINT16 StationPort; EFI_IPv6_ADDRESS RemoteAddress; UINT16 RemotePort; BOOLEAN ActiveFlag; } EFI_TCP6_ACCESS_POINT; typedef struct { UINT32 ReceiveBufferSize; UINT32 SendBufferSize; UINT32 MaxSynBackLog; UINT32 ConnectionTimeout; UINT32 DataRetries; UINT32 FinTimeout; UINT32 TimeWaitTimeout; UINT32 KeepAliveProbes; UINT32 KeepAliveTime; UINT32 KeepAliveInterval; BOOLEAN EnableNagle; BOOLEAN EnableTimeStamp; BOOLEAN EnableWindbowScaling; BOOLEAN EnableSelectiveAck; BOOLEAN EnablePathMtuDiscovery; } EFI_TCP6_OPTION; typedef struct { UINT8 TrafficClass; UINT8 HopLimit; EFI_TCP6_ACCESS_POINT AccessPoint; EFI_TCP6_OPTION *ControlOption; } EFI_TCP6_CONFIG_DATA; typedef EFI_STATUS (EFIAPI *EFI_TCP6_GET_MODE_DATA) ( IN struct _EFI_TCP6 *This, OUT EFI_TCP6_CONNECTION_STATE *Tcp6State OPTIONAL, OUT EFI_TCP6_CONFIG_DATA *Tcp6ConfigData OPTIONAL, OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL, OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_TCP6_CONFIGURE) ( IN struct _EFI_TCP6 *This, IN EFI_TCP6_CONFIG_DATA *Tcp6ConfigData OPTIONAL ); typedef struct { EFI_EVENT Event; EFI_STATUS Status; } EFI_TCP6_COMPLETION_TOKEN; typedef struct { EFI_TCP6_COMPLETION_TOKEN CompletionToken; } EFI_TCP6_CONNECTION_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_TCP6_CONNECT) ( IN struct _EFI_TCP6 *This, IN EFI_TCP6_CONNECTION_TOKEN *ConnectionToken ); typedef struct { EFI_TCP6_COMPLETION_TOKEN CompletionToken; EFI_HANDLE NewChildHandle; } EFI_TCP6_LISTEN_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_TCP6_ACCEPT) ( IN struct _EFI_TCP6 *This, IN EFI_TCP6_LISTEN_TOKEN *ListenToken ); typedef struct { UINT32 FragmentLength; VOID *FragmentBuffer; } EFI_TCP6_FRAGMENT_DATA; typedef struct { BOOLEAN UrgentFlag; UINT32 DataLength; UINT32 FragmentCount; EFI_TCP6_FRAGMENT_DATA FragmentTable[1]; } EFI_TCP6_RECEIVE_DATA; typedef struct { BOOLEAN Push; BOOLEAN Urgent; UINT32 DataLength; UINT32 FragmentCount; EFI_TCP6_FRAGMENT_DATA FragmentTable[1]; } EFI_TCP6_TRANSMIT_DATA; typedef struct { EFI_TCP6_COMPLETION_TOKEN CompletionToken; union { EFI_TCP6_RECEIVE_DATA *RxData; EFI_TCP6_TRANSMIT_DATA *TxData; } Packet; } EFI_TCP6_IO_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_TCP6_TRANSMIT) ( IN struct _EFI_TCP6 *This, IN EFI_TCP6_IO_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_TCP6_RECEIVE) ( IN struct _EFI_TCP6 *This, IN EFI_TCP6_IO_TOKEN *Token ); typedef struct { EFI_TCP6_COMPLETION_TOKEN CompletionToken; BOOLEAN AbortOnClose; } EFI_TCP6_CLOSE_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_TCP6_CLOSE)( IN struct _EFI_TCP6 *This, IN EFI_TCP6_CLOSE_TOKEN *CloseToken ); typedef EFI_STATUS (EFIAPI *EFI_TCP6_CANCEL)( IN struct _EFI_TCP6 *This, IN EFI_TCP6_COMPLETION_TOKEN *Token OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_TCP6_POLL) ( IN struct _EFI_TCP6 *This ); typedef struct _EFI_TCP6 { EFI_TCP6_GET_MODE_DATA GetModeData; EFI_TCP6_CONFIGURE Configure; EFI_TCP6_CONNECT Connect; EFI_TCP6_ACCEPT Accept; EFI_TCP6_TRANSMIT Transmit; EFI_TCP6_RECEIVE Receive; EFI_TCP6_CLOSE Close; EFI_TCP6_CANCEL Cancel; EFI_TCP6_POLL Poll; } EFI_TCP6; #endif /* _EFI_TCP_H */ ncroxon-gnu-efi-157d47c/inc/efiudp.h000066400000000000000000000161031471215650600172760ustar00rootroot00000000000000#ifndef _EFI_UDP_H #define _EFI_UDP_H /*++ Copyright (c) 2013 Intel Corporation --*/ #define EFI_UDP4_SERVICE_BINDING_PROTOCOL \ { 0x83f01464, 0x99bd, 0x45e5, {0xb3, 0x83, 0xaf, 0x63, 0x05, 0xd8, 0xe9, 0xe6} } #define EFI_UDP4_PROTOCOL \ { 0x3ad9df29, 0x4501, 0x478d, {0xb1, 0xf8, 0x7f, 0x7f, 0xe7, 0x0e, 0x50, 0xf3} } #define EFI_UDP6_SERVICE_BINDING_PROTOCOL \ { 0x66ed4721, 0x3c98, 0x4d3e, {0x81, 0xe3, 0xd0, 0x3d, 0xd3, 0x9a, 0x72, 0x54} } #define EFI_UDP6_PROTOCOL \ { 0x4f948815, 0xb4b9, 0x43cb, {0x8a, 0x33, 0x90, 0xe0, 0x60, 0xb3,0x49, 0x55} } INTERFACE_DECL(_EFI_UDP4); INTERFACE_DECL(_EFI_UDP6); typedef struct { BOOLEAN AcceptBroadcast; BOOLEAN AcceptPromiscuous; BOOLEAN AcceptAnyPort; BOOLEAN AllowDuplicatePort; UINT8 TypeOfService; UINT8 TimeToLive; BOOLEAN DoNotFragment; UINT32 ReceiveTimeout; UINT32 TransmitTimeout; BOOLEAN UseDefaultAddress; EFI_IPv4_ADDRESS StationAddress; EFI_IPv4_ADDRESS SubnetMask; UINT16 StationPort; EFI_IPv4_ADDRESS RemoteAddress; UINT16 RemotePort; } EFI_UDP4_CONFIG_DATA; typedef EFI_STATUS (EFIAPI *EFI_UDP4_GET_MODE_DATA) ( IN struct _EFI_UDP4 *This, OUT EFI_UDP4_CONFIG_DATA *Udp4ConfigData OPTIONAL, OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_UDP4_CONFIGURE) ( IN struct _EFI_UDP4 *This, IN EFI_UDP4_CONFIG_DATA *UdpConfigData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_UDP4_GROUPS) ( IN struct _EFI_UDP4 *This, IN BOOLEAN JoinFlag, IN EFI_IPv4_ADDRESS *MulticastAddress OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_UDP4_ROUTES) ( IN struct _EFI_UDP4 *This, IN BOOLEAN DeleteRoute, IN EFI_IPv4_ADDRESS *SubnetAddress, IN EFI_IPv4_ADDRESS *SubnetMask, IN EFI_IPv4_ADDRESS *GatewayAddress ); #define EFI_NETWORK_UNREACHABLE EFIERR(100) #define EFI_HOST_UNREACHABLE EFIERR(101) #define EFI_PROTOCOL_UNREACHABLE EFIERR(102) #define EFI_PORT_UNREACHABLE EFIERR(103) typedef struct { EFI_IPv4_ADDRESS SourceAddress; UINT16 SourcePort; EFI_IPv4_ADDRESS DestinationAddress; UINT16 DestinationPort; } EFI_UDP4_SESSION_DATA; typedef struct { UINT32 FragmentLength; VOID *FragmentBuffer; } EFI_UDP4_FRAGMENT_DATA; typedef struct { EFI_TIME TimeStamp; EFI_EVENT RecycleSignal; EFI_UDP4_SESSION_DATA UdpSession; UINT32 DataLength; UINT32 FragmentCount; EFI_UDP4_FRAGMENT_DATA FragmentTable[1]; } EFI_UDP4_RECEIVE_DATA; typedef struct { EFI_UDP4_SESSION_DATA *UdpSessionData; EFI_IPv4_ADDRESS *GatewayAddress; UINT32 DataLength; UINT32 FragmentCount; EFI_UDP4_FRAGMENT_DATA FragmentTable[1]; } EFI_UDP4_TRANSMIT_DATA; typedef struct { EFI_EVENT Event; EFI_STATUS Status; union { EFI_UDP4_RECEIVE_DATA *RxData; EFI_UDP4_TRANSMIT_DATA *TxData; } Packet; } EFI_UDP4_COMPLETION_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_UDP4_TRANSMIT) ( IN struct _EFI_UDP4 *This, IN EFI_UDP4_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_UDP4_RECEIVE) ( IN struct _EFI_UDP4 *This, IN EFI_UDP4_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_UDP4_CANCEL)( IN struct _EFI_UDP4 *This, IN EFI_UDP4_COMPLETION_TOKEN *Token OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_UDP4_POLL) ( IN struct _EFI_UDP4 *This ); typedef struct _EFI_UDP4 { EFI_UDP4_GET_MODE_DATA GetModeData; EFI_UDP4_CONFIGURE Configure; EFI_UDP4_GROUPS Groups; EFI_UDP4_ROUTES Routes; EFI_UDP4_TRANSMIT Transmit; EFI_UDP4_RECEIVE Receive; EFI_UDP4_CANCEL Cancel; EFI_UDP4_POLL Poll; } EFI_UDP4; typedef struct { BOOLEAN AcceptPromiscuous; BOOLEAN AcceptAnyPort; BOOLEAN AllowDuplicatePort; UINT8 TrafficClass; UINT8 HopLimit; UINT32 ReceiveTimeout; UINT32 TransmitTimeout; EFI_IPv6_ADDRESS StationAddress; UINT16 StationPort; EFI_IPv6_ADDRESS RemoteAddress; UINT16 RemotePort; } EFI_UDP6_CONFIG_DATA; typedef EFI_STATUS (EFIAPI *EFI_UDP6_GET_MODE_DATA) ( IN struct _EFI_UDP6 *This, OUT EFI_UDP6_CONFIG_DATA *Udp6ConfigData OPTIONAL, OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL, OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_UDP6_CONFIGURE) ( IN struct _EFI_UDP6 *This, IN EFI_UDP6_CONFIG_DATA *UdpConfigData OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_UDP6_GROUPS) ( IN struct _EFI_UDP6 *This, IN BOOLEAN JoinFlag, IN EFI_IPv6_ADDRESS *MulticastAddress OPTIONAL ); typedef struct { EFI_IPv6_ADDRESS SourceAddress; UINT16 SourcePort; EFI_IPv6_ADDRESS DestinationAddress; UINT16 DestinationPort; } EFI_UDP6_SESSION_DATA; typedef struct { UINT32 FragmentLength; VOID *FragmentBuffer; } EFI_UDP6_FRAGMENT_DATA; typedef struct { EFI_TIME TimeStamp; EFI_EVENT RecycleSignal; EFI_UDP6_SESSION_DATA UdpSession; UINT32 DataLength; UINT32 FragmentCount; EFI_UDP6_FRAGMENT_DATA FragmentTable[1]; } EFI_UDP6_RECEIVE_DATA; typedef struct { EFI_UDP6_SESSION_DATA *UdpSessionData; UINT32 DataLength; UINT32 FragmentCount; EFI_UDP6_FRAGMENT_DATA FragmentTable[1]; } EFI_UDP6_TRANSMIT_DATA; typedef struct { EFI_EVENT Event; EFI_STATUS Status; union { EFI_UDP6_RECEIVE_DATA *RxData; EFI_UDP6_TRANSMIT_DATA *TxData; } Packet; } EFI_UDP6_COMPLETION_TOKEN; typedef EFI_STATUS (EFIAPI *EFI_UDP6_TRANSMIT) ( IN struct _EFI_UDP6 *This, IN EFI_UDP6_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_UDP6_RECEIVE) ( IN struct _EFI_UDP6 *This, IN EFI_UDP6_COMPLETION_TOKEN *Token ); typedef EFI_STATUS (EFIAPI *EFI_UDP6_CANCEL)( IN struct _EFI_UDP6 *This, IN EFI_UDP6_COMPLETION_TOKEN *Token OPTIONAL ); typedef EFI_STATUS (EFIAPI *EFI_UDP6_POLL) ( IN struct _EFI_UDP6 *This ); typedef struct _EFI_UDP6 { EFI_UDP6_GET_MODE_DATA GetModeData; EFI_UDP6_CONFIGURE Configure; EFI_UDP6_GROUPS Groups; EFI_UDP6_TRANSMIT Transmit; EFI_UDP6_RECEIVE Receive; EFI_UDP6_CANCEL Cancel; EFI_UDP6_POLL Poll; } EFI_UDP6; #endif /* _EFI_UDP_H */ ncroxon-gnu-efi-157d47c/inc/efiui.h000066400000000000000000000027051471215650600171260ustar00rootroot00000000000000#ifndef _EFI_UI_H #define _EFI_UI_H /*++ Copyright (c) 200 Intel Corporation Module Name: EfiUi.h Abstract: Protocol used to build User Interface (UI) stuff. This protocol is just data. It is a multi dimentional array. For each string there is an array of UI_STRING_ENTRY. Each string is for a different language translation of the same string. The list is terminated by a NULL UiString. There can be any number of UI_STRING_ENTRY arrays. A NULL array terminates the list. A NULL array entry contains all zeros. Thus the shortest possible EFI_UI_PROTOCOL has three UI_STRING_ENTRY. The String, it's NULL terminator, and the NULL terminator for the entire thing. Revision History --*/ #define EFI_UI_INTERFACE_PROTOCOL_GUID \ { 0x32dd7981, 0x2d27, 0x11d4, {0xbc, 0x8b, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} } #define EFI_UI_PROTOCOL EFI_UI_INTERFACE_PROTOCOL_GUID typedef enum { UiDeviceString, UiVendorString, UiMaxString } UI_STRING_TYPE; typedef struct { ISO_639_2 *LangCode; CHAR16 *UiString; } UI_STRING_ENTRY; #define EFI_UI_INTERFACE_PROTOCOL_VERSION 0x00010000 #define EFI_UI_VERSION EFI_UI_INTERFACE_PROTOCOL_VERSION typedef struct _EFI_UI_INTERFACE_PROTOCOL { UINT32 Version; UI_STRING_ENTRY *Entry; } EFI_UI_INTERFACE_PROTOCOL; typedef struct _EFI_UI_INTERFACE_PROTOCOL _UI_INTERFACE; typedef EFI_UI_INTERFACE_PROTOCOL UI_INTERFACE; #endif ncroxon-gnu-efi-157d47c/inc/ia32/000077500000000000000000000000001471215650600164065ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/ia32/efibind.h000066400000000000000000000213551471215650600201650ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: efefind.h Abstract: EFI to compile bindings Revision History --*/ #ifndef __GNUC__ #pragma pack() #endif // // Basic int types of various widths // #if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L ) && !defined(__cplusplus) // No ANSI C 1999/2000 stdint.h integer width declarations #if defined(_MSC_EXTENSIONS) // Use Microsoft C compiler integer width declarations typedef unsigned __int64 uint64_t; typedef __int64 int64_t; typedef unsigned __int32 uint32_t; typedef __int32 int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef char int8_t; #elif defined(__GNUC__) typedef int __attribute__((__mode__(__DI__))) int64_t; typedef unsigned int __attribute__((__mode__(__DI__))) uint64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef signed char int8_t; #elif defined(UNIX_LP64) /* Use LP64 programming model from C_FLAGS for integer width declarations */ typedef unsigned long uint64_t; typedef long int64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef char int8_t; #else /* Assume P64 programming model from C_FLAGS for integer width declarations */ typedef unsigned long long uint64_t __attribute__((aligned (8))); typedef long long int64_t __attribute__((aligned (8))); typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef char int8_t; #endif typedef uint32_t uintptr_t; typedef int32_t intptr_t; #else #include #endif // // Basic EFI types of various widths // #include typedef uint16_t CHAR16; #define WCHAR CHAR16 typedef uint64_t UINT64; typedef int64_t INT64; #ifndef _BASETSD_H_ typedef uint32_t UINT32; typedef int32_t INT32; #endif typedef uint16_t UINT16; typedef int16_t INT16; typedef uint8_t UINT8; typedef unsigned char CHAR8; typedef int8_t INT8; #undef VOID typedef void VOID; typedef int32_t INTN; typedef uint32_t UINTN; #ifdef EFI_NT_EMULATOR #define POST_CODE(_Data) #else #ifdef EFI_DEBUG #define POST_CODE(_Data) __asm mov eax,(_Data) __asm out 0x80,al #else #define POST_CODE(_Data) #endif #endif #define EFIERR(a) (0x80000000 | a) #define EFI_ERROR_MASK 0x80000000 #define EFIERR_OEM(a) (0xc0000000 | a) #define BAD_POINTER 0xFBFBFBFB #define MAX_ADDRESS 0xFFFFFFFF #ifdef EFI_NT_EMULATOR #define BREAKPOINT() __asm { int 3 } #else #define BREAKPOINT() while (TRUE); // Make it hang on Bios[Dbg]32 #endif // // Pointers must be aligned to these address to function // #define MIN_ALIGNMENT_SIZE 4 #define ALIGN_VARIABLE(Value ,Adjustment) \ (UINTN)Adjustment = 0; \ if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ Value = (UINTN)Value + (UINTN)Adjustment // // Define macros to build data structure signatures from characters. // #define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) #define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) // // To export & import functions in the EFI emulator environment // #ifdef EFI_NT_EMULATOR #define EXPORTAPI __declspec( dllexport ) #else #define EXPORTAPI #endif // // EFIAPI - prototype calling convention for EFI function pointers // BOOTSERVICE - prototype for implementation of a boot service interface // RUNTIMESERVICE - prototype for implementation of a runtime service interface // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service // RUNTIME_CODE - pragma macro for declaring runtime code // #ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options #ifdef _MSC_EXTENSIONS #define EFIAPI __cdecl // Force C calling convention for Microsoft C compiler #else #define EFIAPI // Substitute expresion to force C calling convention #endif #endif #define BOOTSERVICE //#define RUNTIMESERVICE(proto,a) alloc_text("rtcode",a); proto a //#define RUNTIMEFUNCTION(proto,a) alloc_text("rtcode",a); proto a #define RUNTIMESERVICE #define RUNTIMEFUNCTION #define RUNTIME_CODE(a) alloc_text("rtcode", a) #define BEGIN_RUNTIME_DATA() data_seg("rtdata") #define END_RUNTIME_DATA() data_seg("") #define VOLATILE volatile #define MEMORY_FENCE() #ifdef EFI_NT_EMULATOR // // To help ensure proper coding of integrated drivers, they are // compiled as DLLs. In NT they require a dll init entry pointer. // The macro puts a stub entry point into the DLL so it will load. // #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ UINTN \ __stdcall \ _DllMainCRTStartup ( \ UINTN Inst, \ UINTN reason_for_call, \ VOID *rserved \ ) \ { \ return 1; \ } \ \ int \ EXPORTAPI \ __cdecl \ InitializeDriver ( \ void *ImageHandle, \ void *SystemTable \ ) \ { \ return InitFunction(ImageHandle, SystemTable); \ } #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ (_if)->LoadInternal(type, name, NULL) #else // EFI_NT_EMULATOR // // When build similiar to FW, then link everything together as // one big module. For the MSVC toolchain, we simply tell the // linker what our driver init function is using /ENTRY. // #if defined(_MSC_EXTENSIONS) #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ __pragma(comment(linker, "/ENTRY:" # InitFunction)) #else #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ UINTN \ InitializeDriver ( \ VOID *ImageHandle, \ VOID *SystemTable \ ) \ { \ return InitFunction(ImageHandle, \ SystemTable); \ } \ \ EFI_STATUS efi_main( \ EFI_HANDLE image, \ EFI_SYSTEM_TABLE *systab \ ) __attribute__((weak, \ alias ("InitializeDriver"))); #endif #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ (_if)->LoadInternal(type, name, entry) #endif // EFI_FW_NT // // Some compilers don't support the forward reference construct: // typedef struct XXXXX // // The following macro provide a workaround for such cases. // #ifdef NO_INTERFACE_DECL #define INTERFACE_DECL(x) #else #if defined(__GNUC__) || defined(_MSC_EXTENSIONS) #define INTERFACE_DECL(x) struct x #else #define INTERFACE_DECL(x) typedef struct x #endif #endif /* No efi call wrapper for IA32 architecture */ #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) #define EFI_FUNCTION #ifdef _MSC_EXTENSIONS #pragma warning ( disable : 4731 ) // Suppress warnings about modification of EBP #endif ncroxon-gnu-efi-157d47c/inc/ia32/efilibplat.h000066400000000000000000000004131471215650600206700ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: efilibplat.h Abstract: EFI to compile bindings Revision History --*/ VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); ncroxon-gnu-efi-157d47c/inc/ia32/efisetjmp_arch.h000066400000000000000000000003761471215650600215500ustar00rootroot00000000000000#ifndef GNU_EFI_IA32_SETJMP_H #define GNU_EFI_IA32_SETJMP_H #define JMPBUF_ALIGN 4 typedef struct { UINT32 Ebx; UINT32 Esi; UINT32 Edi; UINT32 Ebp; UINT32 Esp; UINT32 Eip; } EFI_ALIGN(JMPBUF_ALIGN) jmp_buf[1]; #endif /* GNU_EFI_IA32_SETJMP_H */ ncroxon-gnu-efi-157d47c/inc/ia32/pe.h000066400000000000000000000574461471215650600172030ustar00rootroot00000000000000/* PE32+ header file */ #ifndef _PE_H #define _PE_H #define IMAGE_DOS_SIGNATURE 0x5A4D // MZ #define IMAGE_OS2_SIGNATURE 0x454E // NE #define IMAGE_OS2_SIGNATURE_LE 0x454C // LE #define IMAGE_NT_SIGNATURE 0x00004550 // PE00 #define IMAGE_EDOS_SIGNATURE 0x44454550 // PEED typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header UINT16 e_magic; // Magic number UINT16 e_cblp; // Bytes on last page of file UINT16 e_cp; // Pages in file UINT16 e_crlc; // Relocations UINT16 e_cparhdr; // Size of header in paragraphs UINT16 e_minalloc; // Minimum extra paragraphs needed UINT16 e_maxalloc; // Maximum extra paragraphs needed UINT16 e_ss; // Initial (relative) SS value UINT16 e_sp; // Initial SP value UINT16 e_csum; // Checksum UINT16 e_ip; // Initial IP value UINT16 e_cs; // Initial (relative) CS value UINT16 e_lfarlc; // File address of relocation table UINT16 e_ovno; // Overlay number UINT16 e_res[4]; // Reserved words UINT16 e_oemid; // OEM identifier (for e_oeminfo) UINT16 e_oeminfo; // OEM information; e_oemid specific UINT16 e_res2[10]; // Reserved words UINT32 e_lfanew; // File address of new exe header } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; typedef struct _IMAGE_OS2_HEADER { // OS/2 .EXE header UINT16 ne_magic; // Magic number UINT8 ne_ver; // Version number UINT8 ne_rev; // Revision number UINT16 ne_enttab; // Offset of Entry Table UINT16 ne_cbenttab; // Number of bytes in Entry Table UINT32 ne_crc; // Checksum of whole file UINT16 ne_flags; // Flag UINT16 UINT16 ne_autodata; // Automatic data segment number UINT16 ne_heap; // Initial heap allocation UINT16 ne_stack; // Initial stack allocation UINT32 ne_csip; // Initial CS:IP setting UINT32 ne_sssp; // Initial SS:SP setting UINT16 ne_cseg; // Count of file segments UINT16 ne_cmod; // Entries in Module Reference Table UINT16 ne_cbnrestab; // Size of non-resident name table UINT16 ne_segtab; // Offset of Segment Table UINT16 ne_rsrctab; // Offset of Resource Table UINT16 ne_restab; // Offset of resident name table UINT16 ne_modtab; // Offset of Module Reference Table UINT16 ne_imptab; // Offset of Imported Names Table UINT32 ne_nrestab; // Offset of Non-resident Names Table UINT16 ne_cmovent; // Count of movable entries UINT16 ne_align; // Segment alignment shift count UINT16 ne_cres; // Count of resource segments UINT8 ne_exetyp; // Target Operating system UINT8 ne_flagsothers; // Other .EXE flags UINT16 ne_pretthunks; // offset to return thunks UINT16 ne_psegrefbytes; // offset to segment ref. bytes UINT16 ne_swaparea; // Minimum code swap area size UINT16 ne_expver; // Expected Windows version number } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER; // // File header format. // typedef struct _IMAGE_FILE_HEADER { UINT16 Machine; UINT16 NumberOfSections; UINT32 TimeDateStamp; UINT32 PointerToSymbolTable; UINT32 NumberOfSymbols; UINT16 SizeOfOptionalHeader; UINT16 Characteristics; } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; #define IMAGE_SIZEOF_FILE_HEADER 20 #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file. #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references). #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file. #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file. #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed. #define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine. #define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file #define IMAGE_FILE_SYSTEM 0x1000 // System File. #define IMAGE_FILE_DLL 0x2000 // File is a DLL. #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed. #define IMAGE_FILE_MACHINE_UNKNOWN 0 #define IMAGE_FILE_MACHINE_I386 0x14c // Intel 386. #define IMAGE_FILE_MACHINE_R3000 0x162 // MIPS little-endian, 0540 big-endian #define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian #define IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP #define IMAGE_FILE_MACHINE_ARMTHUMB_MIXED 0x1c2 // Arm/Thumb #define IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM PowerPC Little-Endian #define IMAGE_FILE_MACHINE_IA64 0x200 // IA-64 #define IMAGE_FILE_MACHINE_TAHOE 0x7cc // Intel EM machine #define IMAGE_FILE_MACHINE_EBC 0xebc // EFI Byte Code #define IMAGE_FILE_MACHINE_X64 0x8664 // x86_64 // // Directory format. // typedef struct _IMAGE_DATA_DIRECTORY { UINT32 VirtualAddress; UINT32 Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 // // Optional header format. // typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // UINT16 Magic; UINT8 MajorLinkerVersion; UINT8 MinorLinkerVersion; UINT32 SizeOfCode; UINT32 SizeOfInitializedData; UINT32 SizeOfUninitializedData; UINT32 AddressOfEntryPoint; UINT32 BaseOfCode; UINT32 BaseOfData; // // NT additional fields. // UINT32 ImageBase; UINT32 SectionAlignment; UINT32 FileAlignment; UINT16 MajorOperatingSystemVersion; UINT16 MinorOperatingSystemVersion; UINT16 MajorImageVersion; UINT16 MinorImageVersion; UINT16 MajorSubsystemVersion; UINT16 MinorSubsystemVersion; UINT32 Reserved1; UINT32 SizeOfImage; UINT32 SizeOfHeaders; UINT32 CheckSum; UINT16 Subsystem; UINT16 DllCharacteristics; UINT32 SizeOfStackReserve; UINT32 SizeOfStackCommit; UINT32 SizeOfHeapReserve; UINT32 SizeOfHeapCommit; UINT32 LoaderFlags; UINT32 NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; typedef struct _IMAGE_ROM_OPTIONAL_HEADER { UINT16 Magic; UINT8 MajorLinkerVersion; UINT8 MinorLinkerVersion; UINT32 SizeOfCode; UINT32 SizeOfInitializedData; UINT32 SizeOfUninitializedData; UINT32 AddressOfEntryPoint; UINT32 BaseOfCode; UINT32 BaseOfData; UINT32 BaseOfBss; UINT32 GprMask; UINT32 CprMask[4]; UINT32 GpValue; } IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER; #define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56 #define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28 #define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224 #define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 typedef struct _IMAGE_NT_HEADERS { UINT32 Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER OptionalHeader; } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS; typedef struct _IMAGE_ROM_HEADERS { IMAGE_FILE_HEADER FileHeader; IMAGE_ROM_OPTIONAL_HEADER OptionalHeader; } IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS; #define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \ ((UINT32)ntheader + \ FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \ ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader \ )) // Subsystem Values #define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem. #define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem. #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem. #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem. #define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem. #define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image run in the Posix character subsystem. // Directory Entries #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // Description String #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // Machine Value (MIPS GP) #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory // // Section header format. // #define IMAGE_SIZEOF_SHORT_NAME 8 typedef struct _IMAGE_SECTION_HEADER { UINT8 Name[IMAGE_SIZEOF_SHORT_NAME]; union { UINT32 PhysicalAddress; UINT32 VirtualSize; } Misc; UINT32 VirtualAddress; UINT32 SizeOfRawData; UINT32 PointerToRawData; UINT32 PointerToRelocations; UINT32 PointerToLinenumbers; UINT16 NumberOfRelocations; UINT16 NumberOfLinenumbers; UINT32 Characteristics; } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; #define IMAGE_SIZEOF_SECTION_HEADER 40 #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved. #define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code. #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data. #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data. #define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved. #define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information. #define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image. #define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat. #define IMAGE_SCN_ALIGN_1BYTES 0x00100000 // #define IMAGE_SCN_ALIGN_2BYTES 0x00200000 // #define IMAGE_SCN_ALIGN_4BYTES 0x00300000 // #define IMAGE_SCN_ALIGN_8BYTES 0x00400000 // #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified. #define IMAGE_SCN_ALIGN_32BYTES 0x00600000 // #define IMAGE_SCN_ALIGN_64BYTES 0x00700000 // #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded. #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable. #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable. #define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable. #define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable. #define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable. #define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable. // // Symbol format. // #define IMAGE_SIZEOF_SYMBOL 18 // // Section values. // // Symbols have a section number of the section in which they are // defined. Otherwise, section numbers have the following meanings: // #define IMAGE_SYM_UNDEFINED (UINT16)0 // Symbol is undefined or is common. #define IMAGE_SYM_ABSOLUTE (UINT16)-1 // Symbol is an absolute value. #define IMAGE_SYM_DEBUG (UINT16)-2 // Symbol is a special debug item. // // Type (fundamental) values. // #define IMAGE_SYM_TYPE_NULL 0 // no type. #define IMAGE_SYM_TYPE_VOID 1 // #define IMAGE_SYM_TYPE_CHAR 2 // type character. #define IMAGE_SYM_TYPE_SHORT 3 // type short integer. #define IMAGE_SYM_TYPE_INT 4 // #define IMAGE_SYM_TYPE_LONG 5 // #define IMAGE_SYM_TYPE_FLOAT 6 // #define IMAGE_SYM_TYPE_DOUBLE 7 // #define IMAGE_SYM_TYPE_STRUCT 8 // #define IMAGE_SYM_TYPE_UNION 9 // #define IMAGE_SYM_TYPE_ENUM 10 // enumeration. #define IMAGE_SYM_TYPE_MOE 11 // member of enumeration. #define IMAGE_SYM_TYPE_BYTE 12 // #define IMAGE_SYM_TYPE_WORD 13 // #define IMAGE_SYM_TYPE_UINT 14 // #define IMAGE_SYM_TYPE_DWORD 15 // // // Type (derived) values. // #define IMAGE_SYM_DTYPE_NULL 0 // no derived type. #define IMAGE_SYM_DTYPE_POINTER 1 // pointer. #define IMAGE_SYM_DTYPE_FUNCTION 2 // function. #define IMAGE_SYM_DTYPE_ARRAY 3 // array. // // Storage classes. // #define IMAGE_SYM_CLASS_END_OF_FUNCTION (BYTE )-1 #define IMAGE_SYM_CLASS_NULL 0 #define IMAGE_SYM_CLASS_AUTOMATIC 1 #define IMAGE_SYM_CLASS_EXTERNAL 2 #define IMAGE_SYM_CLASS_STATIC 3 #define IMAGE_SYM_CLASS_REGISTER 4 #define IMAGE_SYM_CLASS_EXTERNAL_DEF 5 #define IMAGE_SYM_CLASS_LABEL 6 #define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7 #define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8 #define IMAGE_SYM_CLASS_ARGUMENT 9 #define IMAGE_SYM_CLASS_STRUCT_TAG 10 #define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11 #define IMAGE_SYM_CLASS_UNION_TAG 12 #define IMAGE_SYM_CLASS_TYPE_DEFINITION 13 #define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14 #define IMAGE_SYM_CLASS_ENUM_TAG 15 #define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16 #define IMAGE_SYM_CLASS_REGISTER_PARAM 17 #define IMAGE_SYM_CLASS_BIT_FIELD 18 #define IMAGE_SYM_CLASS_BLOCK 100 #define IMAGE_SYM_CLASS_FUNCTION 101 #define IMAGE_SYM_CLASS_END_OF_STRUCT 102 #define IMAGE_SYM_CLASS_FILE 103 // new #define IMAGE_SYM_CLASS_SECTION 104 #define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105 // type packing constants #define N_BTMASK 017 #define N_TMASK 060 #define N_TMASK1 0300 #define N_TMASK2 0360 #define N_BTSHFT 4 #define N_TSHIFT 2 // MACROS // // Communal selection types. // #define IMAGE_COMDAT_SELECT_NODUPLICATES 1 #define IMAGE_COMDAT_SELECT_ANY 2 #define IMAGE_COMDAT_SELECT_SAME_SIZE 3 #define IMAGE_COMDAT_SELECT_EXACT_MATCH 4 #define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5 #define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1 #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 #define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3 // // Relocation format. // typedef struct _IMAGE_RELOCATION { UINT32 VirtualAddress; UINT32 SymbolTableIndex; UINT16 Type; } IMAGE_RELOCATION; #define IMAGE_SIZEOF_RELOCATION 10 // // I386 relocation types. // #define IMAGE_REL_I386_ABSOLUTE 0 // Reference is absolute, no relocation is necessary #define IMAGE_REL_I386_DIR16 01 // Direct 16-bit reference to the symbols virtual address #define IMAGE_REL_I386_REL16 02 // PC-relative 16-bit reference to the symbols virtual address #define IMAGE_REL_I386_DIR32 06 // Direct 32-bit reference to the symbols virtual address #define IMAGE_REL_I386_DIR32NB 07 // Direct 32-bit reference to the symbols virtual address, base not included #define IMAGE_REL_I386_SEG12 011 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address #define IMAGE_REL_I386_SECTION 012 #define IMAGE_REL_I386_SECREL 013 #define IMAGE_REL_I386_REL32 024 // PC-relative 32-bit reference to the symbols virtual address // // MIPS relocation types. // #define IMAGE_REL_MIPS_ABSOLUTE 0 // Reference is absolute, no relocation is necessary #define IMAGE_REL_MIPS_REFHALF 01 #define IMAGE_REL_MIPS_REFWORD 02 #define IMAGE_REL_MIPS_JMPADDR 03 #define IMAGE_REL_MIPS_REFHI 04 #define IMAGE_REL_MIPS_REFLO 05 #define IMAGE_REL_MIPS_GPREL 06 #define IMAGE_REL_MIPS_LITERAL 07 #define IMAGE_REL_MIPS_SECTION 012 #define IMAGE_REL_MIPS_SECREL 013 #define IMAGE_REL_MIPS_REFWORDNB 042 #define IMAGE_REL_MIPS_PAIR 045 // // Alpha Relocation types. // #define IMAGE_REL_ALPHA_ABSOLUTE 0x0 #define IMAGE_REL_ALPHA_REFLONG 0x1 #define IMAGE_REL_ALPHA_REFQUAD 0x2 #define IMAGE_REL_ALPHA_GPREL32 0x3 #define IMAGE_REL_ALPHA_LITERAL 0x4 #define IMAGE_REL_ALPHA_LITUSE 0x5 #define IMAGE_REL_ALPHA_GPDISP 0x6 #define IMAGE_REL_ALPHA_BRADDR 0x7 #define IMAGE_REL_ALPHA_HINT 0x8 #define IMAGE_REL_ALPHA_INLINE_REFLONG 0x9 #define IMAGE_REL_ALPHA_REFHI 0xA #define IMAGE_REL_ALPHA_REFLO 0xB #define IMAGE_REL_ALPHA_PAIR 0xC #define IMAGE_REL_ALPHA_MATCH 0xD #define IMAGE_REL_ALPHA_SECTION 0xE #define IMAGE_REL_ALPHA_SECREL 0xF #define IMAGE_REL_ALPHA_REFLONGNB 0x10 // // IBM PowerPC relocation types. // #define IMAGE_REL_PPC_ABSOLUTE 0x0000 // NOP #define IMAGE_REL_PPC_ADDR64 0x0001 // 64-bit address #define IMAGE_REL_PPC_ADDR32 0x0002 // 32-bit address #define IMAGE_REL_PPC_ADDR24 0x0003 // 26-bit address, shifted left 2 (branch absolute) #define IMAGE_REL_PPC_ADDR16 0x0004 // 16-bit address #define IMAGE_REL_PPC_ADDR14 0x0005 // 16-bit address, shifted left 2 (load doubleword) #define IMAGE_REL_PPC_REL24 0x0006 // 26-bit PC-relative offset, shifted left 2 (branch relative) #define IMAGE_REL_PPC_REL14 0x0007 // 16-bit PC-relative offset, shifted left 2 (br cond relative) #define IMAGE_REL_PPC_TOCREL16 0x0008 // 16-bit offset from TOC base #define IMAGE_REL_PPC_TOCREL14 0x0009 // 16-bit offset from TOC base, shifted left 2 (load doubleword) #define IMAGE_REL_PPC_ADDR32NB 0x000A // 32-bit addr w/o image base #define IMAGE_REL_PPC_SECREL 0x000B // va of containing section (as in an image sectionhdr) #define IMAGE_REL_PPC_SECTION 0x000C // sectionheader number #define IMAGE_REL_PPC_IFGLUE 0x000D // substitute TOC restore instruction iff symbol is glue code #define IMAGE_REL_PPC_IMGLUE 0x000E // symbol is glue code; virtual address is TOC restore instruction #define IMAGE_REL_PPC_TYPEMASK 0x00FF // mask to isolate above values in IMAGE_RELOCATION.Type // Flag bits in IMAGE_RELOCATION.TYPE #define IMAGE_REL_PPC_NEG 0x0100 // subtract reloc value rather than adding it #define IMAGE_REL_PPC_BRTAKEN 0x0200 // fix branch prediction bit to predict branch taken #define IMAGE_REL_PPC_BRNTAKEN 0x0400 // fix branch prediction bit to predict branch not taken #define IMAGE_REL_PPC_TOCDEFN 0x0800 // toc slot defined in file (or, data in toc) // // Based relocation format. // typedef struct _IMAGE_BASE_RELOCATION { UINT32 VirtualAddress; UINT32 SizeOfBlock; // UINT16 TypeOffset[1]; } IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION; #define IMAGE_SIZEOF_BASE_RELOCATION 8 // // Based relocation types. // #define IMAGE_REL_BASED_ABSOLUTE 0 #define IMAGE_REL_BASED_HIGH 1 #define IMAGE_REL_BASED_LOW 2 #define IMAGE_REL_BASED_HIGHLOW 3 #define IMAGE_REL_BASED_HIGHADJ 4 #define IMAGE_REL_BASED_MIPS_JMPADDR 5 #define IMAGE_REL_BASED_IA64_IMM64 9 #define IMAGE_REL_BASED_DIR64 10 // // Line number format. // typedef struct _IMAGE_LINENUMBER { union { UINT32 SymbolTableIndex; // Symbol table index of function name if Linenumber is 0. UINT32 VirtualAddress; // Virtual address of line number. } Type; UINT16 Linenumber; // Line number. } IMAGE_LINENUMBER; #define IMAGE_SIZEOF_LINENUMBER 6 // // Archive format. // #define IMAGE_ARCHIVE_START_SIZE 8 #define IMAGE_ARCHIVE_START "!\n" #define IMAGE_ARCHIVE_END "`\n" #define IMAGE_ARCHIVE_PAD "\n" #define IMAGE_ARCHIVE_LINKER_MEMBER "/ " #define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// " typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER { UINT8 Name[16]; // File member name - `/' terminated. UINT8 Date[12]; // File member date - decimal. UINT8 UserID[6]; // File member user id - decimal. UINT8 GroupID[6]; // File member group id - decimal. UINT8 Mode[8]; // File member mode - octal. UINT8 Size[10]; // File member size - decimal. UINT8 EndHeader[2]; // String to end header. } IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER; #define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60 // // DLL support. // // // Export Format // typedef struct _IMAGE_EXPORT_DIRECTORY { UINT32 Characteristics; UINT32 TimeDateStamp; UINT16 MajorVersion; UINT16 MinorVersion; UINT32 Name; UINT32 Base; UINT32 NumberOfFunctions; UINT32 NumberOfNames; UINT32 *AddressOfFunctions; UINT32 *AddressOfNames; UINT32 *AddressOfNameOrdinals; } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; // // Import Format // typedef struct _IMAGE_IMPORT_BY_NAME { UINT16 Hint; UINT8 Name[1]; } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME; typedef struct _IMAGE_THUNK_DATA { union { UINT32 Function; UINT32 Ordinal; PIMAGE_IMPORT_BY_NAME AddressOfData; } u1; } IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA; #define IMAGE_ORDINAL_FLAG 0x80000000 #define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0) #define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff) typedef struct _IMAGE_IMPORT_DESCRIPTOR { UINT32 Characteristics; UINT32 TimeDateStamp; UINT32 ForwarderChain; UINT32 Name; PIMAGE_THUNK_DATA FirstThunk; } IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR; #endif ncroxon-gnu-efi-157d47c/inc/ia64/000077500000000000000000000000001471215650600164135ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/ia64/efibind.h000066400000000000000000000163721471215650600201750ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: efefind.h Abstract: EFI to compile bindings Revision History --*/ #pragma pack() // // Basic int types of various widths // #if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L ) && !defined(__cplusplus) // No ANSI C 1999/2000 stdint.h integer width declarations #ifdef _MSC_EXTENSIONS // Use Microsoft C compiler integer width declarations typedef unsigned __int64 uint64_t; typedef __int64 int64_t; typedef unsigned __int32 uint32_t; typedef __int32 int32_t; typedef unsigned __int16 uint16_t; typedef __int16 int16_t; typedef unsigned __int8 uint8_t; typedef __int8 int8_t; #elif defined(UNIX_LP64) // Use LP64 programming model from C_FLAGS for integer width declarations typedef unsigned long uint64_t; typedef long int64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef char int8_t; #else // Assume P64 programming model from C_FLAGS for integer width declarations typedef unsigned long long uint64_t; typedef long long int64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef char int8_t; #endif typedef uint64_t uintptr_t; typedef int64_t intptr_t; #else #include #endif // // Basic EFI types of various widths // #include typedef uint16_t CHAR16; #define WCHAR CHAR16 typedef uint64_t UINT64; typedef int64_t INT64; typedef uint32_t UINT32; typedef int32_t INT32; typedef uint16_t UINT16; typedef int16_t INT16; typedef uint8_t UINT8; typedef unsigned char CHAR8; typedef int8_t INT8; #undef VOID typedef void VOID; typedef int64_t INTN; typedef uint64_t UINTN; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // BugBug: Code to debug // #define BIT63 0x8000000000000000 #define PLATFORM_IOBASE_ADDRESS (0xffffc000000 | BIT63) #define PORT_TO_MEMD(_Port) (PLATFORM_IOBASE_ADDRESS | ( ( ( (_Port) & 0xfffc) << 10 ) | ( (_Port) & 0x0fff) ) ) // // Macro's with casts make this much easier to use and read. // #define PORT_TO_MEM8D(_Port) (*(UINT8 *)(PORT_TO_MEMD(_Port))) #define POST_CODE(_Data) (PORT_TO_MEM8D(0x80) = (_Data)) // // BugBug: End Debug Code!!! //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #define EFIERR(a) (0x8000000000000000 | a) #define EFI_ERROR_MASK 0x8000000000000000 #define EFIERR_OEM(a) (0xc000000000000000 | a) #define BAD_POINTER 0xFBFBFBFBFBFBFBFB #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF #define BREAKPOINT() while (TRUE) // // Pointers must be aligned to these address to function // you will get an alignment fault if this value is less than 8 // #define MIN_ALIGNMENT_SIZE 8 #define ALIGN_VARIABLE(Value , Adjustment) \ (UINTN) Adjustment = 0; \ if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ Value = (UINTN)Value + (UINTN)Adjustment // // Define macros to create data structure signatures. // #define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) #define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) // // To export & import functions in the EFI emulator environment // #define EXPORTAPI // // EFIAPI - prototype calling convention for EFI function pointers // BOOTSERVICE - prototype for implementation of a boot service interface // RUNTIMESERVICE - prototype for implementation of a runtime service interface // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service // RUNTIME_CODE - pragma macro for declaring runtime code // #ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options #ifdef _MSC_EXTENSIONS #define EFIAPI __cdecl // Force C calling convention for Microsoft C compiler #else #define EFIAPI // Substitute expresion to force C calling convention #endif #endif #define BOOTSERVICE #define RUNTIMESERVICE #define RUNTIMEFUNCTION #define RUNTIME_CODE(a) alloc_text("rtcode", a) #define BEGIN_RUNTIME_DATA() data_seg("rtdata") #define END_RUNTIME_DATA() data_seg("") #define VOLATILE volatile // // BugBug: Need to find out if this is portable accross compliers. // #ifdef __GNUC__ #define MEMORY_FENCE() __asm__ __volatile__ ("mf.a" ::: "memory") #else void __mf (void); #pragma intrinsic (__mf) #define MEMORY_FENCE() __mf() #endif // // When build similiar to FW, then link everything together as // one big module. For the MSVC toolchain, we simply tell the // linker what our driver init function is using /ENTRY. // #if defined(_MSC_EXTENSIONS) #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ __pragma(comment(linker, "/ENTRY:" # InitFunction)) #else #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ UINTN \ InitializeDriver ( \ VOID *ImageHandle, \ VOID *SystemTable \ ) \ { \ return InitFunction(ImageHandle, \ SystemTable); \ } \ \ EFI_STATUS efi_main( \ EFI_HANDLE image, \ EFI_SYSTEM_TABLE *systab \ ) __attribute__((weak, \ alias ("InitializeDriver"))); #endif #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ (_if)->LoadInternal(type, name, entry) // // Some compilers don't support the forward reference construct: // typedef struct XXXXX // // The following macro provide a workaround for such cases. // #ifdef NO_INTERFACE_DECL #define INTERFACE_DECL(x) #else #if defined(__GNUC__) || defined(_MSC_EXTENSIONS) #define INTERFACE_DECL(x) struct x #else #define INTERFACE_DECL(x) typedef struct x #endif #endif /* No efi call wrapper for IA32 architecture */ #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) #define EFI_FUNCTION ncroxon-gnu-efi-157d47c/inc/ia64/efilibplat.h000066400000000000000000000021451471215650600207010ustar00rootroot00000000000000#ifndef _EFI_LIB_PLAT_H #define _EFI_LIB_PLAT_H /*++ Copyright (c) 1998 Intel Corporation Module Name: efilibplat.h Abstract: EFI to compile bindings Revision History --*/ #include "salproc.h" VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); VOID LibInitSalAndPalProc( OUT PLABEL *SalPlabel, OUT UINT64 *PalEntry ); EFI_STATUS LibGetSalIoPortMapping ( OUT UINT64 *IoPortMapping ); EFI_STATUS LibGetSalIpiBlock ( OUT UINT64 *IpiBlock ); EFI_STATUS LibGetSalWakeupVector ( OUT UINT64 *WakeVector ); VOID * LibSearchSalSystemTable ( IN UINT8 EntryType ); VOID LibSalProc ( IN UINT64 Arg1, IN UINT64 Arg2, IN UINT64 Arg3, IN UINT64 Arg4, IN UINT64 Arg5, IN UINT64 Arg6, IN UINT64 Arg7, IN UINT64 Arg8, OUT rArg *Results OPTIONAL ); VOID LibPalProc ( IN UINT64 Arg1, IN UINT64 Arg2, IN UINT64 Arg3, IN UINT64 Arg4, OUT rArg *Results OPTIONAL ); #endif ncroxon-gnu-efi-157d47c/inc/ia64/efisetjmp_arch.h000066400000000000000000000013651471215650600215540ustar00rootroot00000000000000#ifndef GNU_EFI_IA64_SETJMP_H #define GNU_EFI_IA64_SETJMP_H #define JMPBUF_ALIGN 0x10 typedef struct { UINT64 F2[2]; UINT64 F3[2]; UINT64 F4[2]; UINT64 F5[2]; UINT64 F16[2]; UINT64 F17[2]; UINT64 F18[2]; UINT64 F19[2]; UINT64 F20[2]; UINT64 F21[2]; UINT64 F22[2]; UINT64 F23[2]; UINT64 F24[2]; UINT64 F25[2]; UINT64 F26[2]; UINT64 F27[2]; UINT64 F28[2]; UINT64 F29[2]; UINT64 F30[2]; UINT64 F31[2]; UINT64 R4; UINT64 R5; UINT64 R6; UINT64 R7; UINT64 SP; UINT64 BR0; UINT64 BR1; UINT64 BR2; UINT64 BR3; UINT64 BR4; UINT64 BR5; UINT64 InitialUNAT; UINT64 AfterSpillUNAT; UINT64 PFS; UINT64 BSP; UINT64 Predicates; UINT64 LoopCount; UINT64 FPSR; } EFI_ALIGN(JMPBUF_ALIGN) jmp_buf[1]; #endif /* GNU_EFI_IA64_SETJMP_H */ ncroxon-gnu-efi-157d47c/inc/ia64/pe.h000066400000000000000000000604461471215650600172020ustar00rootroot00000000000000/* PE32+ header file */ #ifndef _PE_H #define _PE_H #define IMAGE_DOS_SIGNATURE 0x5A4D // MZ #define IMAGE_OS2_SIGNATURE 0x454E // NE #define IMAGE_OS2_SIGNATURE_LE 0x454C // LE #define IMAGE_NT_SIGNATURE 0x00004550 // PE00 #define IMAGE_EDOS_SIGNATURE 0x44454550 // PEED /***************************************************************************** * The following stuff comes from winnt.h from the ia64sdk, plus the Plabel for * loading EM executables. *****************************************************************************/ // // Intel IA64 specific // #define IMAGE_REL_BASED_IA64_IMM64 9 #define IMAGE_REL_BASED_IA64_DIR64 10 struct Plabel { UINT64 EntryPoint; UINT64 NewGP; }; typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header UINT16 e_magic; // Magic number UINT16 e_cblp; // Bytes on last page of file UINT16 e_cp; // Pages in file UINT16 e_crlc; // Relocations UINT16 e_cparhdr; // Size of header in paragraphs UINT16 e_minalloc; // Minimum extra paragraphs needed UINT16 e_maxalloc; // Maximum extra paragraphs needed UINT16 e_ss; // Initial (relative) SS value UINT16 e_sp; // Initial SP value UINT16 e_csum; // Checksum UINT16 e_ip; // Initial IP value UINT16 e_cs; // Initial (relative) CS value UINT16 e_lfarlc; // File address of relocation table UINT16 e_ovno; // Overlay number UINT16 e_res[4]; // Reserved words UINT16 e_oemid; // OEM identifier (for e_oeminfo) UINT16 e_oeminfo; // OEM information; e_oemid specific UINT16 e_res2[10]; // Reserved words UINT32 e_lfanew; // File address of new exe header } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; typedef struct _IMAGE_OS2_HEADER { // OS/2 .EXE header UINT16 ne_magic; // Magic number UINT8 ne_ver; // Version number UINT8 ne_rev; // Revision number UINT16 ne_enttab; // Offset of Entry Table UINT16 ne_cbenttab; // Number of bytes in Entry Table UINT32 ne_crc; // Checksum of whole file UINT16 ne_flags; // Flag UINT16 UINT16 ne_autodata; // Automatic data segment number UINT16 ne_heap; // Initial heap allocation UINT16 ne_stack; // Initial stack allocation UINT32 ne_csip; // Initial CS:IP setting UINT32 ne_sssp; // Initial SS:SP setting UINT16 ne_cseg; // Count of file segments UINT16 ne_cmod; // Entries in Module Reference Table UINT16 ne_cbnrestab; // Size of non-resident name table UINT16 ne_segtab; // Offset of Segment Table UINT16 ne_rsrctab; // Offset of Resource Table UINT16 ne_restab; // Offset of resident name table UINT16 ne_modtab; // Offset of Module Reference Table UINT16 ne_imptab; // Offset of Imported Names Table UINT32 ne_nrestab; // Offset of Non-resident Names Table UINT16 ne_cmovent; // Count of movable entries UINT16 ne_align; // Segment alignment shift count UINT16 ne_cres; // Count of resource segments UINT8 ne_exetyp; // Target Operating system UINT8 ne_flagsothers; // Other .EXE flags UINT16 ne_pretthunks; // offset to return thunks UINT16 ne_psegrefbytes; // offset to segment ref. bytes UINT16 ne_swaparea; // Minimum code swap area size UINT16 ne_expver; // Expected Windows version number } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER; // // File header format. // typedef struct _IMAGE_FILE_HEADER { UINT16 Machine; UINT16 NumberOfSections; UINT32 TimeDateStamp; UINT32 PointerToSymbolTable; UINT32 NumberOfSymbols; UINT16 SizeOfOptionalHeader; UINT16 Characteristics; } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; #define IMAGE_SIZEOF_FILE_HEADER 20 #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file. #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references). #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file. #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file. #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed. #define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine. #define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file #define IMAGE_FILE_SYSTEM 0x1000 // System File. #define IMAGE_FILE_DLL 0x2000 // File is a DLL. #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed. #define IMAGE_FILE_MACHINE_UNKNOWN 0 #define IMAGE_FILE_MACHINE_I386 0x14c // Intel 386. #define IMAGE_FILE_MACHINE_R3000 0x162 // MIPS little-endian, 0540 big-endian #define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian #define IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP #define IMAGE_FILE_MACHINE_ARMTHUMB_MIXED 0x1c2 // Arm/Thumb #define IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM PowerPC Little-Endian #define IMAGE_FILE_MACHINE_IA64 0x200 // IA-64 #define IMAGE_FILE_MACHINE_TAHOE 0x7cc // Intel EM machine #define IMAGE_FILE_MACHINE_EBC 0xebc // EFI Byte Code #define IMAGE_FILE_MACHINE_X64 0x8664 // x86_64 // // Directory format. // typedef struct _IMAGE_DATA_DIRECTORY { UINT32 VirtualAddress; UINT32 Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 typedef struct _IMAGE_ROM_OPTIONAL_HEADER { UINT16 Magic; UINT8 MajorLinkerVersion; UINT8 MinorLinkerVersion; UINT32 SizeOfCode; UINT32 SizeOfInitializedData; UINT32 SizeOfUninitializedData; UINT32 AddressOfEntryPoint; UINT32 BaseOfCode; UINT32 BaseOfData; UINT32 BaseOfBss; UINT32 GprMask; UINT32 CprMask[4]; UINT32 GpValue; } IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER; typedef struct _IMAGE_OPTIONAL_HEADER { UINT16 Magic; UINT8 MajorLinkerVersion; UINT8 MinorLinkerVersion; UINT32 SizeOfCode; UINT32 SizeOfInitializedData; UINT32 SizeOfUninitializedData; UINT32 AddressOfEntryPoint; UINT32 BaseOfCode; // UINT32 BaseOfData; UINT64 ImageBase; UINT32 SectionAlignment; UINT32 FileAlignment; UINT16 MajorOperatingSystemVersion; UINT16 MinorOperatingSystemVersion; UINT16 MajorImageVersion; UINT16 MinorImageVersion; UINT16 MajorSubsystemVersion; UINT16 MinorSubsystemVersion; UINT32 Win32VersionValue; UINT32 SizeOfImage; UINT32 SizeOfHeaders; UINT32 CheckSum; UINT16 Subsystem; UINT16 DllCharacteristics; UINT64 SizeOfStackReserve; UINT64 SizeOfStackCommit; UINT64 SizeOfHeapReserve; UINT64 SizeOfHeapCommit; UINT32 LoaderFlags; UINT32 NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; #define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56 #define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28 #define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224 #define IMAGE_SIZEOF_NT_OPTIONAL64_HEADER 244 #define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b #define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 typedef struct _IMAGE_NT_HEADERS { UINT32 Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER OptionalHeader; } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS; typedef struct _IMAGE_ROM_HEADERS { IMAGE_FILE_HEADER FileHeader; IMAGE_ROM_OPTIONAL_HEADER OptionalHeader; } IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS; #define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \ ((UINT32)ntheader + \ FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \ ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader \ )) // Subsystem Values #define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem. #define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem. #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem. #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem. #define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem. #define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image run in the Posix character subsystem. // Directory Entries #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // Description String #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // Machine Value (MIPS GP) #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory // // Section header format. // #define IMAGE_SIZEOF_SHORT_NAME 8 typedef struct _IMAGE_SECTION_HEADER { UINT8 Name[IMAGE_SIZEOF_SHORT_NAME]; union { UINT32 PhysicalAddress; UINT32 VirtualSize; } Misc; UINT32 VirtualAddress; UINT32 SizeOfRawData; UINT32 PointerToRawData; UINT32 PointerToRelocations; UINT32 PointerToLinenumbers; UINT16 NumberOfRelocations; UINT16 NumberOfLinenumbers; UINT32 Characteristics; } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; #define IMAGE_SIZEOF_SECTION_HEADER 40 #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved. #define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code. #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data. #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data. #define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved. #define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information. #define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image. #define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat. #define IMAGE_SCN_ALIGN_1BYTES 0x00100000 // #define IMAGE_SCN_ALIGN_2BYTES 0x00200000 // #define IMAGE_SCN_ALIGN_4BYTES 0x00300000 // #define IMAGE_SCN_ALIGN_8BYTES 0x00400000 // #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified. #define IMAGE_SCN_ALIGN_32BYTES 0x00600000 // #define IMAGE_SCN_ALIGN_64BYTES 0x00700000 // #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded. #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable. #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable. #define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable. #define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable. #define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable. #define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable. // // Symbol format. // #define IMAGE_SIZEOF_SYMBOL 18 // // Section values. // // Symbols have a section number of the section in which they are // defined. Otherwise, section numbers have the following meanings: // #define IMAGE_SYM_UNDEFINED (UINT16)0 // Symbol is undefined or is common. #define IMAGE_SYM_ABSOLUTE (UINT16)-1 // Symbol is an absolute value. #define IMAGE_SYM_DEBUG (UINT16)-2 // Symbol is a special debug item. // // Type (fundamental) values. // #define IMAGE_SYM_TYPE_NULL 0 // no type. #define IMAGE_SYM_TYPE_VOID 1 // #define IMAGE_SYM_TYPE_CHAR 2 // type character. #define IMAGE_SYM_TYPE_SHORT 3 // type short integer. #define IMAGE_SYM_TYPE_INT 4 // #define IMAGE_SYM_TYPE_LONG 5 // #define IMAGE_SYM_TYPE_FLOAT 6 // #define IMAGE_SYM_TYPE_DOUBLE 7 // #define IMAGE_SYM_TYPE_STRUCT 8 // #define IMAGE_SYM_TYPE_UNION 9 // #define IMAGE_SYM_TYPE_ENUM 10 // enumeration. #define IMAGE_SYM_TYPE_MOE 11 // member of enumeration. #define IMAGE_SYM_TYPE_BYTE 12 // #define IMAGE_SYM_TYPE_WORD 13 // #define IMAGE_SYM_TYPE_UINT 14 // #define IMAGE_SYM_TYPE_DWORD 15 // // // Type (derived) values. // #define IMAGE_SYM_DTYPE_NULL 0 // no derived type. #define IMAGE_SYM_DTYPE_POINTER 1 // pointer. #define IMAGE_SYM_DTYPE_FUNCTION 2 // function. #define IMAGE_SYM_DTYPE_ARRAY 3 // array. // // Storage classes. // #define IMAGE_SYM_CLASS_END_OF_FUNCTION (BYTE )-1 #define IMAGE_SYM_CLASS_NULL 0 #define IMAGE_SYM_CLASS_AUTOMATIC 1 #define IMAGE_SYM_CLASS_EXTERNAL 2 #define IMAGE_SYM_CLASS_STATIC 3 #define IMAGE_SYM_CLASS_REGISTER 4 #define IMAGE_SYM_CLASS_EXTERNAL_DEF 5 #define IMAGE_SYM_CLASS_LABEL 6 #define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7 #define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8 #define IMAGE_SYM_CLASS_ARGUMENT 9 #define IMAGE_SYM_CLASS_STRUCT_TAG 10 #define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11 #define IMAGE_SYM_CLASS_UNION_TAG 12 #define IMAGE_SYM_CLASS_TYPE_DEFINITION 13 #define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14 #define IMAGE_SYM_CLASS_ENUM_TAG 15 #define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16 #define IMAGE_SYM_CLASS_REGISTER_PARAM 17 #define IMAGE_SYM_CLASS_BIT_FIELD 18 #define IMAGE_SYM_CLASS_BLOCK 100 #define IMAGE_SYM_CLASS_FUNCTION 101 #define IMAGE_SYM_CLASS_END_OF_STRUCT 102 #define IMAGE_SYM_CLASS_FILE 103 // new #define IMAGE_SYM_CLASS_SECTION 104 #define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105 // type packing constants #define N_BTMASK 017 #define N_TMASK 060 #define N_TMASK1 0300 #define N_TMASK2 0360 #define N_BTSHFT 4 #define N_TSHIFT 2 // MACROS // // Communal selection types. // #define IMAGE_COMDAT_SELECT_NODUPLICATES 1 #define IMAGE_COMDAT_SELECT_ANY 2 #define IMAGE_COMDAT_SELECT_SAME_SIZE 3 #define IMAGE_COMDAT_SELECT_EXACT_MATCH 4 #define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5 #define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1 #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 #define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3 // // Relocation format. // typedef struct _IMAGE_RELOCATION { UINT32 VirtualAddress; UINT32 SymbolTableIndex; UINT16 Type; } IMAGE_RELOCATION; #define IMAGE_SIZEOF_RELOCATION 10 // // I386 relocation types. // #define IMAGE_REL_I386_ABSOLUTE 0 // Reference is absolute, no relocation is necessary #define IMAGE_REL_I386_DIR16 01 // Direct 16-bit reference to the symbols virtual address #define IMAGE_REL_I386_REL16 02 // PC-relative 16-bit reference to the symbols virtual address #define IMAGE_REL_I386_DIR32 06 // Direct 32-bit reference to the symbols virtual address #define IMAGE_REL_I386_DIR32NB 07 // Direct 32-bit reference to the symbols virtual address, base not included #define IMAGE_REL_I386_SEG12 011 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address #define IMAGE_REL_I386_SECTION 012 #define IMAGE_REL_I386_SECREL 013 #define IMAGE_REL_I386_REL32 024 // PC-relative 32-bit reference to the symbols virtual address // // MIPS relocation types. // #define IMAGE_REL_MIPS_ABSOLUTE 0 // Reference is absolute, no relocation is necessary #define IMAGE_REL_MIPS_REFHALF 01 #define IMAGE_REL_MIPS_REFWORD 02 #define IMAGE_REL_MIPS_JMPADDR 03 #define IMAGE_REL_MIPS_REFHI 04 #define IMAGE_REL_MIPS_REFLO 05 #define IMAGE_REL_MIPS_GPREL 06 #define IMAGE_REL_MIPS_LITERAL 07 #define IMAGE_REL_MIPS_SECTION 012 #define IMAGE_REL_MIPS_SECREL 013 #define IMAGE_REL_MIPS_REFWORDNB 042 #define IMAGE_REL_MIPS_PAIR 045 // // Alpha Relocation types. // #define IMAGE_REL_ALPHA_ABSOLUTE 0x0 #define IMAGE_REL_ALPHA_REFLONG 0x1 #define IMAGE_REL_ALPHA_REFQUAD 0x2 #define IMAGE_REL_ALPHA_GPREL32 0x3 #define IMAGE_REL_ALPHA_LITERAL 0x4 #define IMAGE_REL_ALPHA_LITUSE 0x5 #define IMAGE_REL_ALPHA_GPDISP 0x6 #define IMAGE_REL_ALPHA_BRADDR 0x7 #define IMAGE_REL_ALPHA_HINT 0x8 #define IMAGE_REL_ALPHA_INLINE_REFLONG 0x9 #define IMAGE_REL_ALPHA_REFHI 0xA #define IMAGE_REL_ALPHA_REFLO 0xB #define IMAGE_REL_ALPHA_PAIR 0xC #define IMAGE_REL_ALPHA_MATCH 0xD #define IMAGE_REL_ALPHA_SECTION 0xE #define IMAGE_REL_ALPHA_SECREL 0xF #define IMAGE_REL_ALPHA_REFLONGNB 0x10 // // IBM PowerPC relocation types. // #define IMAGE_REL_PPC_ABSOLUTE 0x0000 // NOP #define IMAGE_REL_PPC_ADDR64 0x0001 // 64-bit address #define IMAGE_REL_PPC_ADDR32 0x0002 // 32-bit address #define IMAGE_REL_PPC_ADDR24 0x0003 // 26-bit address, shifted left 2 (branch absolute) #define IMAGE_REL_PPC_ADDR16 0x0004 // 16-bit address #define IMAGE_REL_PPC_ADDR14 0x0005 // 16-bit address, shifted left 2 (load doubleword) #define IMAGE_REL_PPC_REL24 0x0006 // 26-bit PC-relative offset, shifted left 2 (branch relative) #define IMAGE_REL_PPC_REL14 0x0007 // 16-bit PC-relative offset, shifted left 2 (br cond relative) #define IMAGE_REL_PPC_TOCREL16 0x0008 // 16-bit offset from TOC base #define IMAGE_REL_PPC_TOCREL14 0x0009 // 16-bit offset from TOC base, shifted left 2 (load doubleword) #define IMAGE_REL_PPC_ADDR32NB 0x000A // 32-bit addr w/o image base #define IMAGE_REL_PPC_SECREL 0x000B // va of containing section (as in an image sectionhdr) #define IMAGE_REL_PPC_SECTION 0x000C // sectionheader number #define IMAGE_REL_PPC_IFGLUE 0x000D // substitute TOC restore instruction iff symbol is glue code #define IMAGE_REL_PPC_IMGLUE 0x000E // symbol is glue code; virtual address is TOC restore instruction #define IMAGE_REL_PPC_TYPEMASK 0x00FF // mask to isolate above values in IMAGE_RELOCATION.Type // Flag bits in IMAGE_RELOCATION.TYPE #define IMAGE_REL_PPC_NEG 0x0100 // subtract reloc value rather than adding it #define IMAGE_REL_PPC_BRTAKEN 0x0200 // fix branch prediction bit to predict branch taken #define IMAGE_REL_PPC_BRNTAKEN 0x0400 // fix branch prediction bit to predict branch not taken #define IMAGE_REL_PPC_TOCDEFN 0x0800 // toc slot defined in file (or, data in toc) // // Based relocation format. // typedef struct _IMAGE_BASE_RELOCATION { UINT32 VirtualAddress; UINT32 SizeOfBlock; // UINT16 TypeOffset[1]; } IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION; #define IMAGE_SIZEOF_BASE_RELOCATION 8 // // Based relocation types. // #define IMAGE_REL_BASED_ABSOLUTE 0 #define IMAGE_REL_BASED_HIGH 1 #define IMAGE_REL_BASED_LOW 2 #define IMAGE_REL_BASED_HIGHLOW 3 #define IMAGE_REL_BASED_HIGHADJ 4 #define IMAGE_REL_BASED_MIPS_JMPADDR 5 #define IMAGE_REL_BASED_IA64_IMM64 9 #define IMAGE_REL_BASED_DIR64 10 // // Line number format. // typedef struct _IMAGE_LINENUMBER { union { UINT32 SymbolTableIndex; // Symbol table index of function name if Linenumber is 0. UINT32 VirtualAddress; // Virtual address of line number. } Type; UINT16 Linenumber; // Line number. } IMAGE_LINENUMBER; #define IMAGE_SIZEOF_LINENUMBER 6 // // Archive format. // #define IMAGE_ARCHIVE_START_SIZE 8 #define IMAGE_ARCHIVE_START "!\n" #define IMAGE_ARCHIVE_END "`\n" #define IMAGE_ARCHIVE_PAD "\n" #define IMAGE_ARCHIVE_LINKER_MEMBER "/ " #define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// " typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER { UINT8 Name[16]; // File member name - `/' terminated. UINT8 Date[12]; // File member date - decimal. UINT8 UserID[6]; // File member user id - decimal. UINT8 GroupID[6]; // File member group id - decimal. UINT8 Mode[8]; // File member mode - octal. UINT8 Size[10]; // File member size - decimal. UINT8 EndHeader[2]; // String to end header. } IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER; #define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60 // // DLL support. // // // Export Format // typedef struct _IMAGE_EXPORT_DIRECTORY { UINT32 Characteristics; UINT32 TimeDateStamp; UINT16 MajorVersion; UINT16 MinorVersion; UINT32 Name; UINT32 Base; UINT32 NumberOfFunctions; UINT32 NumberOfNames; UINT32 AddressOfFunctions; UINT32 AddressOfNames; UINT32 AddressOfNameOrdinals; } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; // // Import Format // typedef struct _IMAGE_IMPORT_BY_NAME { UINT16 Hint; UINT8 Name[1]; } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME; typedef struct _IMAGE_THUNK_DATA { union { UINT32 Function; UINT32 Ordinal; PIMAGE_IMPORT_BY_NAME AddressOfData; } u1; } IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA; #define IMAGE_ORDINAL_FLAG 0x80000000 #define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0) #define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff) typedef struct _IMAGE_IMPORT_DESCRIPTOR { UINT32 Characteristics; UINT32 TimeDateStamp; UINT32 ForwarderChain; UINT32 Name; PIMAGE_THUNK_DATA FirstThunk; } IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR; #endif ncroxon-gnu-efi-157d47c/inc/ia64/salproc.h000066400000000000000000000124311471215650600202300ustar00rootroot00000000000000#ifndef _SAL_PROC_H #define _SAL_PROC_H // // //Copyright (c) 1999 Intel Corporation // //Module Name: // // SalProc.h // //Abstract: // // Main SAL interface routins for IA-64 calls. // // //Revision History // // // return value that mimicks r8,r9,r10 & r11 registers typedef struct { UINT64 p0; UINT64 p1; UINT64 p2; UINT64 p3; } rArg; #define SAL_PCI_CONFIG_READ 0x01000010 #define SAL_PCI_CONFIG_WRITE 0x01000011 typedef VOID (*PFN)(); typedef rArg (*PFN_SAL_PROC)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64); typedef rArg (*PFN_SAL_CALLBACK)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64); typedef struct _PLABEL { UINT64 ProcEntryPoint; UINT64 GP; } PLABEL; typedef struct tagIA32_BIOS_REGISTER_STATE { // general registers UINT32 eax; UINT32 ecx; UINT32 edx; UINT32 ebx; // stack registers UINT32 esp; UINT32 ebp; UINT32 esi; UINT32 edi; // eflags UINT32 eflags; // instruction pointer UINT32 eip; UINT16 cs; UINT16 ds; UINT16 es; UINT16 fs; UINT16 gs; UINT16 ss; // Reserved UINT32 Reserved1; UINT64 Reserved2; } IA32_BIOS_REGISTER_STATE; VOID EFIInitMsg(VOID); EFI_STATUS PlRegisterAndStartTimer( IN UINTN Period ); EFI_STATUS PlDeRegisterAndCancelTimer(VOID); VOID SalProc ( IN UINT64 Arg1, IN UINT64 Arg2, IN UINT64 Arg3, IN UINT64 Arg4, IN UINT64 Arg5, IN UINT64 Arg6, IN UINT64 Arg7, IN UINT64 Arg8, OUT rArg *Results OPTIONAL ); VOID SalCallBack ( IN UINT64 Arg1, IN UINT64 Arg2, IN UINT64 Arg3, IN UINT64 Arg4, IN UINT64 Arg5, IN UINT64 Arg6, IN UINT64 Arg7, IN UINT64 Arg8, OUT rArg *Results OPTIONAL ); VOID RUNTIMEFUNCTION RtSalCallBack ( IN UINT64 Arg1, IN UINT64 Arg2, IN UINT64 Arg3, IN UINT64 Arg4, IN UINT64 Arg5, IN UINT64 Arg6, IN UINT64 Arg7, IN UINT64 Arg8, OUT rArg *Results OPTIONAL ); extern PLABEL RtGlobalSalProcEntry; extern PLABEL RtGlobalSALCallBack; #pragma pack(1) // // SAL System Table // typedef struct { UINT32 Signature; UINT32 Length; UINT16 Revision; UINT16 EntryCount; UINT8 CheckSum; UINT8 Reserved[7]; UINT16 SALA_Ver; UINT16 SALB_Ver; UINT8 OemId[32]; UINT8 ProductID[32]; UINT8 Reserved2[8]; } SAL_SYSTEM_TABLE_HDR; #define SAL_ST_ENTRY_POINT 0 #define SAL_ST_MEMORY_DESCRIPTOR 1 #define SAL_ST_PLATFORM_FEATURES 2 #define SAL_ST_TR_USAGE 3 #define SAL_ST_PTC 4 #define SAL_ST_AP_WAKEUP 5 typedef struct { UINT8 Type; // Type == 0 UINT8 Reserved[7]; UINT64 PalProcEntry; UINT64 SalProcEntry; UINT64 GlobalDataPointer; UINT64 Reserved2[2]; } SAL_ST_ENTRY_POINT_DESCRIPTOR; typedef struct { UINT8 Type; // Type == 1 UINT8 NeedVirtualRegistration; UINT8 MemoryAttributes; UINT8 PageAccessRights; UINT8 SupportedAttributes; UINT8 Reserved; UINT16 MemoryType; UINT64 PhysicalMemoryAddress; UINT32 Length; UINT32 Reserved1; UINT64 OemReserved; } SAL_ST_MEMORY_DESCRIPTOR_ENTRY; // // MemoryType info // #define SAL_SAPIC_IPI_BLOCK 0x0002 #define SAL_IO_PORT_MAPPING 0x0003 typedef struct { UINT8 Type; // Type == 2 UINT8 PlatformFeatures; UINT8 Reserved[14]; } SAL_ST_MEMORY_DECRIPTOR; typedef struct { UINT8 Type; // Type == 3 UINT8 TRType; UINT8 TRNumber; UINT8 Reserved[5]; UINT64 VirtualAddress; UINT64 EncodedPageSize; UINT64 Reserved1; } SAL_ST_TR_DECRIPTOR; typedef struct { UINT64 NumberOfProcessors; UINT64 LocalIDRegister; } SAL_COHERENCE_DOMAIN_INFO; typedef struct { UINT8 Type; // Type == 4 UINT8 Reserved[3]; UINT32 NumberOfDomains; SAL_COHERENCE_DOMAIN_INFO *DomainInformation; } SAL_ST_CACHE_COHERENCE_DECRIPTOR; typedef struct { UINT8 Type; // Type == 5 UINT8 WakeUpType; UINT8 Reserved[6]; UINT64 ExternalInterruptVector; } SAL_ST_AP_WAKEUP_DECRIPTOR; typedef struct { SAL_SYSTEM_TABLE_HDR Header; SAL_ST_ENTRY_POINT_DESCRIPTOR Entry0; } SAL_SYSTEM_TABLE_ASCENDING_ORDER; #define FIT_ENTRY_PTR (0x100000000 - 32) // 4GB - 24 #define FIT_PALA_ENTRY (0x100000000 - 48) // 4GB - 32 #define FIT_PALB_TYPE 01 typedef struct { UINT64 Address; UINT8 Size[3]; UINT8 Reserved; UINT16 Revision; UINT8 Type:7; UINT8 CheckSumValid:1; UINT8 CheckSum; } FIT_ENTRY; #pragma pack() typedef rArg (*CALL_SAL_PROC)( IN UINT64 Arg1, IN UINT64 Arg2, IN UINT64 Arg3, IN UINT64 Arg4, IN UINT64 Arg5, IN UINT64 Arg6, IN UINT64 Arg7, IN UINT64 Arg8 ); typedef rArg (*CALL_PAL_PROC)( IN UINT64 Arg1, IN UINT64 Arg2, IN UINT64 Arg3, IN UINT64 Arg4 ); extern CALL_SAL_PROC GlobalSalProc; extern CALL_PAL_PROC GlobalPalProc; extern PLABEL SalProcPlabel; extern PLABEL PalProcPlabel; #endif ncroxon-gnu-efi-157d47c/inc/legacy.h000066400000000000000000000035461471215650600172750ustar00rootroot00000000000000#ifndef _EFI_LEGACY_H #define _EFI_LEGACY_H /* ABIs: Default ABI will be highest number Older versions can be selected via compiler defines */ /* Option to set all compat to GNU-EFI 3.0 To keep existing apps working without change Default to current ABI */ #ifdef GNU_EFI_3_0_COMPAT #define GNU_EFI_USE_REALLOCATEPOOL_ABI 0 #define GNU_EFI_USE_COPYMEM_ABI 0 #define GNU_EFI_USE_COMPAREGUID_ABI 0 #endif /* ReallocatePool */ #ifndef GNU_EFI_USE_REALLOCATEPOOL_ABI #define GNU_EFI_USE_REALLOCATEPOOL_ABI 1 #endif #if GNU_EFI_USE_REALLOCATEPOOL_ABI == 0 #define ReallocatePool ReallocatePool_0 #else #define ReallocatePool ReallocatePool_1 #endif /* prevent circular headers */ VOID * EFIAPI ReallocatePool_1 ( IN UINTN OldSize, IN UINTN NewSize, IN VOID *OldPool OPTIONAL ); STATIC inline VOID * EFIAPI ReallocatePool_0 ( IN VOID *OldPool, IN UINTN OldSize, IN UINTN NewSize ) { return ReallocatePool_1(OldSize, NewSize, OldPool); } /* end ReallocatePool */ /* CopyMem */ /* CopyMemC isn't deprecated - serves different purpose to CopyMem */ #ifndef GNU_EFI_USE_COPYMEM_ABI #define GNU_EFI_USE_COPYMEM_ABI 1 #endif #if GNU_EFI_USE_COPYMEM_ABI == 0 #define CopyMem CopyMemC #else #define CopyMem CopyMem_1 #endif /* end CopyMem */ /* CompareGuid */ #ifndef GNU_EFI_USE_COMPAREGUID_ABI #define GNU_EFI_USE_COMPAREGUID_ABI 1 #endif #if GNU_EFI_USE_COMPAREGUID_ABI == 0 #define CompareGuid CompareGuid_0 #else #define CompareGuid CompareGuid_1 #endif /* prevent circular headers */ BOOLEAN EFIAPI CompareGuid_1 ( IN CONST EFI_GUID *Guid1, IN CONST EFI_GUID *Guid2 ); STATIC inline INTN EFIAPI CompareGuid_0 ( IN EFI_GUID *Guid1, IN EFI_GUID *Guid2) { if (CompareGuid_1(Guid1, Guid2)) { return 0; } else { return 1; } } #endif ncroxon-gnu-efi-157d47c/inc/lib.h000066400000000000000000000033731471215650600165750ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: lib.h Abstract: EFI library header files Revision History --*/ #ifdef __GNUC__ #pragma GCC visibility push(hidden) #endif #include "efi.h" #include "efilib.h" #include "efirtlib.h" // // Include non architectural protocols // #include "protocol/efivar.h" #include "protocol/legacyboot.h" #include "protocol/intload.h" #include "protocol/vgaclass.h" #include "protocol/eficonsplit.h" #include "protocol/adapterdebug.h" #include "protocol/intload.h" #include "efigpt.h" #include "libsmbios.h" // // Prototypes // VOID InitializeGuid ( VOID ); INTN EFIAPI LibStubStriCmp ( IN EFI_UNICODE_COLLATION_INTERFACE *This, IN CHAR16 *S1, IN CHAR16 *S2 ); BOOLEAN EFIAPI LibStubMetaiMatch ( IN EFI_UNICODE_COLLATION_INTERFACE *This, IN CHAR16 *String, IN CHAR16 *Pattern ); VOID EFIAPI LibStubStrLwrUpr ( IN EFI_UNICODE_COLLATION_INTERFACE *This, IN CHAR16 *Str ); BOOLEAN LibMatchDevicePaths ( IN EFI_DEVICE_PATH *Multi, IN EFI_DEVICE_PATH *Single ); EFI_DEVICE_PATH * LibDuplicateDevicePathInstance ( IN EFI_DEVICE_PATH *DevPath ); // // Globals // extern BOOLEAN LibInitialized; extern BOOLEAN LibFwInstance; extern EFI_HANDLE LibImageHandle; extern SIMPLE_TEXT_OUTPUT_INTERFACE *LibRuntimeDebugOut; extern EFI_UNICODE_COLLATION_INTERFACE *UnicodeInterface; extern EFI_UNICODE_COLLATION_INTERFACE LibStubUnicodeInterface; extern EFI_RAISE_TPL LibRuntimeRaiseTPL; extern EFI_RESTORE_TPL LibRuntimeRestoreTPL; ncroxon-gnu-efi-157d47c/inc/libsmbios.h000066400000000000000000000067551471215650600200210ustar00rootroot00000000000000#ifndef _LIB_SMBIOS_H #define _LIB_SMBIOS_H /*++ Copyright (c) 2000 Intel Corporation Module Name: LibSmbios.h Abstract: Lib include for SMBIOS services. Used to get system serial number and GUID Revision History --*/ // // Define SMBIOS tables. // #pragma pack(1) typedef struct { UINT8 AnchorString[4]; UINT8 EntryPointStructureChecksum; UINT8 EntryPointLength; UINT8 MajorVersion; UINT8 MinorVersion; UINT16 MaxStructureSize; UINT8 EntryPointRevision; UINT8 FormattedArea[5]; UINT8 IntermediateAnchorString[5]; UINT8 IntermediateChecksum; UINT16 TableLength; UINT32 TableAddress; UINT16 NumberOfSmbiosStructures; UINT8 SmbiosBcdRevision; } SMBIOS_TABLE_ENTRY_POINT; #define SMBIOS_STRUCTURE_TABLE SMBIOS_TABLE_ENTRY_POINT typedef struct { UINT8 AnchorString[5]; UINT8 EntryPointStructureChecksum; UINT8 EntryPointLength; UINT8 MajorVersion; UINT8 MinorVersion; UINT8 DocRev; UINT8 EntryPointRevision; UINT8 Reserved; UINT32 TableMaximumSize; UINT64 TableAddress; } SMBIOS_TABLE_3_0_ENTRY_POINT; #define SMBIOS3_STRUCTURE_TABLE SMBIOS_TABLE_3_0_ENTRY_POINT // // Please note that SMBIOS structures can be odd byte aligned since the // unformated section of each record is a set of arbitrary size strings. // typedef struct { UINT8 Type; UINT8 Length; UINT8 Handle[2]; } SMBIOS_STRUCTURE; #define SMBIOS_HEADER SMBIOS_STRUCTURE typedef UINT8 SMBIOS_STRING; typedef struct { SMBIOS_HEADER Hdr; SMBIOS_STRING Vendor; SMBIOS_STRING BiosVersion; UINT8 BiosSegment[2]; SMBIOS_STRING BiosReleaseDate; UINT8 BiosSize; UINT8 BiosCharacteristics[8]; } SMBIOS_TYPE0; typedef struct { SMBIOS_HEADER Hdr; SMBIOS_STRING Manufacturer; SMBIOS_STRING ProductName; SMBIOS_STRING Version; SMBIOS_STRING SerialNumber; // // always byte copy this data to prevent alignment faults! // EFI_GUID Uuid; UINT8 WakeUpType; } SMBIOS_TYPE1; typedef struct { SMBIOS_HEADER Hdr; SMBIOS_STRING Manufacturer; SMBIOS_STRING ProductName; SMBIOS_STRING Version; SMBIOS_STRING SerialNumber; } SMBIOS_TYPE2; typedef struct { SMBIOS_HEADER Hdr; SMBIOS_STRING Manufacturer; UINT8 Type; SMBIOS_STRING Version; SMBIOS_STRING SerialNumber; SMBIOS_STRING AssetTag; UINT8 BootupState; UINT8 PowerSupplyState; UINT8 ThermalState; UINT8 SecurityStatus; UINT8 OemDefined[4]; } SMBIOS_TYPE3; typedef struct { SMBIOS_HEADER Hdr; UINT8 Socket; UINT8 ProcessorType; UINT8 ProcessorFamily; SMBIOS_STRING ProcessorManufacture; UINT8 ProcessorId[8]; SMBIOS_STRING ProcessorVersion; UINT8 Voltage; UINT8 ExternalClock[2]; UINT8 MaxSpeed[2]; UINT8 CurrentSpeed[2]; UINT8 Status; UINT8 ProcessorUpgrade; UINT8 L1CacheHandle[2]; UINT8 L2CacheHandle[2]; UINT8 L3CacheHandle[2]; } SMBIOS_TYPE4; typedef union { SMBIOS_HEADER *Hdr; SMBIOS_TYPE0 *Type0; SMBIOS_TYPE1 *Type1; SMBIOS_TYPE2 *Type2; SMBIOS_TYPE3 *Type3; SMBIOS_TYPE4 *Type4; UINT8 *Raw; } SMBIOS_STRUCTURE_POINTER; #pragma pack() #endif ncroxon-gnu-efi-157d47c/inc/loongarch64/000077500000000000000000000000001471215650600177765ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/loongarch64/efibind.h000066400000000000000000000120441471215650600215500ustar00rootroot00000000000000/* * Copyright (C) 2014 - 2015 Linaro Ltd. * Author: Ard Biesheuvel * Copyright (C) 2017 Lemote Co. * Author: Heiher * Copyright (C) 2021 Loongson Technology Corporation Limited. * Author: zhoumingtao * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L ) && !defined(__cplusplus) // ANSI C 1999/2000 stdint.h integer width declarations typedef unsigned long uint64_t; typedef long int64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef signed char int8_t; typedef uint64_t uintptr_t; typedef int64_t intptr_t; #else #include #endif // // Basic EFI types of various widths // #include typedef uint16_t CHAR16; #define WCHAR CHAR16 typedef uint64_t UINT64; typedef int64_t INT64; typedef uint32_t UINT32; typedef int32_t INT32; typedef uint16_t UINT16; typedef int16_t INT16; typedef uint8_t UINT8; typedef unsigned char CHAR8; typedef int8_t INT8; #undef VOID typedef void VOID; typedef int64_t INTN; typedef uint64_t UINTN; #define EFIERR(a) (0x8000000000000000 | a) #define EFI_ERROR_MASK 0x8000000000000000 #define EFIERR_OEM(a) (0xc000000000000000 | a) #define BAD_POINTER 0xFBFBFBFBFBFBFBFB #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF #define BREAKPOINT() while (TRUE); // Make it hang on Bios[Dbg]32 // // Pointers must be aligned to these address to function // #define MIN_ALIGNMENT_SIZE 8 #define ALIGN_VARIABLE(Value ,Adjustment) \ (UINTN)Adjustment = 0; \ if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ Value = (UINTN)Value + (UINTN)Adjustment // // Define macros to build data structure signatures from characters. // #define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) #define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) // // EFIAPI - prototype calling convention for EFI function pointers // BOOTSERVICE - prototype for implementation of a boot service interface // RUNTIMESERVICE - prototype for implementation of a runtime service interface // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service // RUNTIME_CODE - pragma macro for declaring runtime code // #ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options #define EFIAPI // Substitute expresion to force C calling convention #endif #define BOOTSERVICE #define RUNTIMESERVICE #define RUNTIMEFUNCTION #define RUNTIME_CODE(a) alloc_text("rtcode", a) #define BEGIN_RUNTIME_DATA() data_seg("rtdata") #define END_RUNTIME_DATA() data_seg("") #define VOLATILE volatile #define MEMORY_FENCE __sync_synchronize // // When build similiar to FW, then link everything together as // one big module. // #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ UINTN \ InitializeDriver ( \ VOID *ImageHandle, \ VOID *SystemTable \ ) \ { \ return InitFunction(ImageHandle, \ SystemTable); \ } \ \ EFI_STATUS efi_main( \ EFI_HANDLE image, \ EFI_SYSTEM_TABLE *systab \ ) __attribute__((weak, \ alias ("InitializeDriver"))); #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ (_if)->LoadInternal(type, name, entry) // // Some compilers don't support the forward reference construct: // typedef struct XXXXX // // The following macro provide a workaround for such cases. #define INTERFACE_DECL(x) struct x #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) #define EFI_FUNCTION ncroxon-gnu-efi-157d47c/inc/loongarch64/efilibplat.h000066400000000000000000000004061471215650600222620ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: efilibplat.h Abstract: EFI to compile bindings Revision History --*/ VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); ncroxon-gnu-efi-157d47c/inc/loongarch64/efisetjmp_arch.h000066400000000000000000000005451471215650600231360ustar00rootroot00000000000000#ifndef GNU_EFI_LOONGARCH64_SETJMP_H #define GNU_EFI_LOONGARCH64_SETJMP_H #define JMPBUF_ALIGN 8 typedef struct { /* GP regs */ UINT64 RA; UINT64 SP; UINT64 FP; UINT64 S0; UINT64 S1; UINT64 S2; UINT64 S3; UINT64 S4; UINT64 S5; UINT64 S6; UINT64 S7; UINT64 S8; } EFI_ALIGN(JMPBUF_ALIGN) jmp_buf[1]; #endif /* GNU_EFI_LOONGARCH64_SETJMP_H */ ncroxon-gnu-efi-157d47c/inc/mips64el/000077500000000000000000000000001471215650600173135ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/mips64el/efibind.h000066400000000000000000000121641471215650600210700ustar00rootroot00000000000000/* * Copyright (C) 2014 - 2015 Linaro Ltd. * Author: Ard Biesheuvel * Copyright (C) 2017 Lemote Co. * Author: Heiher * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L ) && !defined(__cplusplus) // ANSI C 1999/2000 stdint.h integer width declarations typedef unsigned long uint64_t; typedef long int64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef signed char int8_t; // unqualified 'char' is unsigned on ARM typedef uint64_t uintptr_t; typedef int64_t intptr_t; #else #include #endif // // Basic EFI types of various widths // #include typedef uint16_t CHAR16; #define WCHAR CHAR16 typedef uint64_t UINT64; typedef int64_t INT64; typedef uint32_t UINT32; typedef int32_t INT32; typedef uint16_t UINT16; typedef int16_t INT16; typedef uint8_t UINT8; typedef unsigned char CHAR8; typedef int8_t INT8; #undef VOID typedef void VOID; typedef int64_t INTN; typedef uint64_t UINTN; #define EFIERR(a) (0x8000000000000000 | a) #define EFI_ERROR_MASK 0x8000000000000000 #define EFIERR_OEM(a) (0xc000000000000000 | a) #define BAD_POINTER 0xFBFBFBFBFBFBFBFB #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF #define BREAKPOINT() while (TRUE); // Make it hang on Bios[Dbg]32 // // Pointers must be aligned to these address to function // #define MIN_ALIGNMENT_SIZE 8 #define ALIGN_VARIABLE(Value ,Adjustment) \ (UINTN)Adjustment = 0; \ if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ Value = (UINTN)Value + (UINTN)Adjustment // // Define macros to build data structure signatures from characters. // #define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) #define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) // // EFIAPI - prototype calling convention for EFI function pointers // BOOTSERVICE - prototype for implementation of a boot service interface // RUNTIMESERVICE - prototype for implementation of a runtime service interface // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service // RUNTIME_CODE - pragma macro for declaring runtime code // #ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options #define EFIAPI // Substitute expresion to force C calling convention #endif #define BOOTSERVICE #define RUNTIMESERVICE #define RUNTIMEFUNCTION #define RUNTIME_CODE(a) alloc_text("rtcode", a) #define BEGIN_RUNTIME_DATA() data_seg("rtdata") #define END_RUNTIME_DATA() data_seg("") #define VOLATILE volatile #define MEMORY_FENCE __sync_synchronize // // When build similiar to FW, then link everything together as // one big module. // #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ UINTN \ InitializeDriver ( \ VOID *ImageHandle, \ VOID *SystemTable \ ) \ { \ return InitFunction(ImageHandle, \ SystemTable); \ } \ \ EFI_STATUS efi_main( \ EFI_HANDLE image, \ EFI_SYSTEM_TABLE *systab \ ) __attribute__((weak, \ alias ("InitializeDriver"))); #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ (_if)->LoadInternal(type, name, entry) // // Some compilers don't support the forward reference construct: // typedef struct XXXXX // // The following macro provide a workaround for such cases. #define INTERFACE_DECL(x) struct x #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) #define EFI_FUNCTION static inline UINT64 swap_uint64 (UINT64 v) { __asm__ volatile ( "dsbh %[v], %[v] \n\t" "dshd %[v], %[v] \n\t" :[v]"+r"(v) ); return v; } ncroxon-gnu-efi-157d47c/inc/mips64el/efilibplat.h000066400000000000000000000004071471215650600216000ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: efilibplat.h Abstract: EFI to compile bindings Revision History --*/ VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); ncroxon-gnu-efi-157d47c/inc/mips64el/efisetjmp_arch.h000066400000000000000000000007631471215650600224550ustar00rootroot00000000000000#ifndef GNU_EFI_MIPS64EL_SETJMP_H #define GNU_EFI_MIPS64EL_SETJMP_H #define JMPBUF_ALIGN 8 typedef struct { /* GP regs */ UINT64 RA; UINT64 SP; UINT64 FP; UINT64 GP; UINT64 S0; UINT64 S1; UINT64 S2; UINT64 S3; UINT64 S4; UINT64 S5; UINT64 S6; UINT64 S7; #ifdef __mips_hard_float /* FP regs */ UINT64 F24; UINT64 F25; UINT64 F26; UINT64 F27; UINT64 F28; UINT64 F29; UINT64 F30; UINT64 F31; #endif } EFI_ALIGN(JMPBUF_ALIGN) jmp_buf[1]; #endif /* GNU_EFI_MIPS64EL_SETJMP_H */ ncroxon-gnu-efi-157d47c/inc/pci22.h000066400000000000000000000110121471215650600167330ustar00rootroot00000000000000#ifndef _PCI22_H #define _PCI22_H /*++ Copyright (c) 1999 Intel Corporation Module Name: pci22.h Abstract: Support for PCI 2.2 standard. Revision History --*/ #ifdef SOFT_SDV #define PCI_MAX_BUS 1 #else #define PCI_MAX_BUS 255 #endif #define PCI_MAX_DEVICE 31 #define PCI_MAX_FUNC 7 // // Command // #define PCI_VGA_PALETTE_SNOOP_DISABLED 0x20 #pragma pack(1) typedef struct { UINT16 VendorId; UINT16 DeviceId; UINT16 Command; UINT16 Status; UINT8 RevisionID; UINT8 ClassCode[3]; UINT8 CacheLineSize; UINT8 LaytencyTimer; UINT8 HeaderType; UINT8 BIST; } PCI_DEVICE_INDEPENDENT_REGION; typedef struct { UINT32 Bar[6]; UINT32 CISPtr; UINT16 SubsystemVendorID; UINT16 SubsystemID; UINT32 ExpansionRomBar; UINT32 Reserved[2]; UINT8 InterruptLine; UINT8 InterruptPin; UINT8 MinGnt; UINT8 MaxLat; } PCI_DEVICE_HEADER_TYPE_REGION; typedef struct { PCI_DEVICE_INDEPENDENT_REGION Hdr; PCI_DEVICE_HEADER_TYPE_REGION Device; } PCI_TYPE00; typedef struct { UINT32 Bar[2]; UINT8 PrimaryBus; UINT8 SecondaryBus; UINT8 SubordinateBus; UINT8 SecondaryLatencyTimer; UINT8 IoBase; UINT8 IoLimit; UINT16 SecondaryStatus; UINT16 MemoryBase; UINT16 MemoryLimit; UINT16 PrefetchableMemoryBase; UINT16 PrefetchableMemoryLimit; UINT32 PrefetchableBaseUpper32; UINT32 PrefetchableLimitUpper32; UINT16 IoBaseUpper16; UINT16 IoLimitUpper16; UINT32 Reserved; UINT32 ExpansionRomBAR; UINT8 InterruptLine; UINT8 InterruptPin; UINT16 BridgeControl; } PCI_BRIDGE_CONTROL_REGISTER; #define PCI_CLASS_DISPLAY_CTRL 0x03 #define PCI_CLASS_VGA 0x00 #define PCI_CLASS_BRIDGE 0x06 #define PCI_CLASS_ISA 0x01 #define PCI_CLASS_ISA_POSITIVE_DECODE 0x80 #define PCI_CLASS_NETWORK 0x02 #define PCI_CLASS_ETHERNET 0x00 #define HEADER_TYPE_DEVICE 0x00 #define HEADER_TYPE_PCI_TO_PCI_BRIDGE 0x01 #define HEADER_TYPE_MULTI_FUNCTION 0x80 #define HEADER_LAYOUT_CODE 0x7f #define IS_PCI_BRIDGE(_p) ((((_p)->Hdr.HeaderType) & HEADER_LAYOUT_CODE) == HEADER_TYPE_PCI_TO_PCI_BRIDGE) #define IS_PCI_MULTI_FUNC(_p) (((_p)->Hdr.HeaderType) & HEADER_TYPE_MULTI_FUNCTION) typedef struct { PCI_DEVICE_INDEPENDENT_REGION Hdr; PCI_BRIDGE_CONTROL_REGISTER Bridge; } PCI_TYPE01; typedef struct { UINT8 Register; UINT8 Function; UINT8 Device; UINT8 Bus; UINT8 Reserved[4]; } DEFIO_PCI_ADDR; typedef struct { UINT32 Reg : 8; UINT32 Func : 3; UINT32 Dev : 5; UINT32 Bus : 8; UINT32 Reserved: 7; UINT32 Enable : 1; } PCI_CONFIG_ACCESS_CF8; #pragma pack() #define EFI_ROOT_BRIDGE_LIST 'eprb' typedef struct { UINTN Signature; UINT16 BridgeNumber; UINT16 PrimaryBus; UINT16 SubordinateBus; EFI_DEVICE_PATH *DevicePath; LIST_ENTRY Link; } PCI_ROOT_BRIDGE_ENTRY; #define PCI_EXPANSION_ROM_HEADER_SIGNATURE 0xaa55 #define EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE 0x0EF1 #define PCI_DATA_STRUCTURE_SIGNATURE EFI_SIGNATURE_32('P','C','I','R') #pragma pack(1) typedef struct { UINT16 Signature; // 0xaa55 UINT8 Reserved[0x16]; UINT16 PcirOffset; } PCI_EXPANSION_ROM_HEADER; typedef struct { UINT16 Signature; // 0xaa55 UINT16 InitializationSize; UINT16 EfiSignature; // 0x0EF1 UINT16 EfiSubsystem; UINT16 EfiMachineType; UINT8 Reserved[0x0A]; UINT16 EfiImageHeaderOffset; UINT16 PcirOffset; } EFI_PCI_EXPANSION_ROM_HEADER; typedef struct { UINT32 Signature; // "PCIR" UINT16 VendorId; UINT16 DeviceId; UINT16 Reserved0; UINT16 Length; UINT8 Revision; UINT8 ClassCode[3]; UINT16 ImageLength; UINT16 CodeRevision; UINT8 CodeType; UINT8 Indicator; UINT16 Reserved1; } PCI_DATA_STRUCTURE; #pragma pack() #endif ncroxon-gnu-efi-157d47c/inc/protocol/000077500000000000000000000000001471215650600175115ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/protocol/adapterdebug.h000066400000000000000000000007671471215650600223230ustar00rootroot00000000000000#ifndef _ADAPTER_DEBUG_H #define _ADAPTER_DEBUG_H /*++ Copyright (c) 1999 Intel Corporation Module Name: AdapterDebug.h Abstract: Protocol to debug the EDD 3.0 enablement of BIOS option ROMs Revision History --*/ // {82F86881-282B-11d4-BC7D-0080C73C8881} #define ADAPTER_DEBUG_PROTOCOL \ { 0x82f86881, 0x282b, 0x11d4, {0xbc, 0x7d, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} } // // This protocol points to the BIOS_LEGACY_DRIVE data structure // see edd.h for more details // #endif ncroxon-gnu-efi-157d47c/inc/protocol/eficonsplit.h000066400000000000000000000010541471215650600222010ustar00rootroot00000000000000#ifndef _EFI_CONFORK_H #define _EFI_CONFORK_H /*++ Copyright (c) 1999 Intel Corporation Module Name: Abstract: Revision History --*/ // // ConOut Forker Protocol // #define TEXT_OUT_SPLITER_PROTOCOL \ { 0x56d830a0, 0x7e7a, 0x11d3, {0xbb, 0xa0, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define ERROR_OUT_SPLITER_PROTOCOL \ { 0xf0ba9039, 0x68f1, 0x425e, {0xaa, 0x7f, 0xd9, 0xaa, 0xf9, 0x1b, 0x82, 0xa1}} #define TEXT_IN_SPLITER_PROTOCOL \ { 0xf9a3c550, 0x7fb5, 0x11d3, {0xbb, 0xa0, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #endif ncroxon-gnu-efi-157d47c/inc/protocol/efidbg.h000066400000000000000000000147521471215650600211130ustar00rootroot00000000000000/* * Copyright (c) 1999, 2000 * Intel Corporation. * 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. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * * This product includes software developed by Intel Corporation and * its contributors. * * 4. Neither the name of Intel Corporation or its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION 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 INTEL CORPORATION 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. * */ #ifndef _EFIDBG_H_ #define _EFIDBG_H_ #include "eficontext.h" #include "efiser.h" typedef struct _DEBUGPORT_16550_CONFIG_DATA { UINT32 PortAddress; UINT64 BaudRate; UINT32 ReceiveFifoDepth; UINT32 Timeout; UINT8 Parity; UINT8 DataBits; UINT8 StopBits; UINT32 ControlMask; BOOLEAN RtsCtsEnable; // RTS, CTS control } DEBUGPORT_16550_CONFIG_DATA; typedef struct _DEBUGPORT_16550_DEVICE_PATH { EFI_DEVICE_PATH Header; DEBUGPORT_16550_CONFIG_DATA ConfigData; } DEBUGPORT_16550_DEVICE_PATH; typedef union { EFI_DEVICE_PATH DevPath; DEBUGPORT_16550_DEVICE_PATH Uart; // add new types of debugport device paths to this union... } DEBUGPORT_DEV_PATH; // // Debug Support protocol {2755590C-6F3C-42FA-9EA4-A3BA543CDA25} // #define DEBUG_SUPPORT_PROTOCOL \ { 0x2755590C, 0x6F3C, 0x42fa, 0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } typedef UINTN EXCEPTION_TYPE; typedef VOID (*EXCEPTION_HANDLER) ( IN EXCEPTION_TYPE ExceptionType, IN SYSTEM_CONTEXT *SystemContext ); typedef EFI_STATUS (EFIAPI *EFI_REGISTER_TIMER_TICK_CALLBACK) ( IN struct _EFI_DEBUG_SUPPORT_INTERFACE *This, IN EXCEPTION_HANDLER TimerTickCallback ); typedef EFI_STATUS (EFIAPI *EFI_REGISTER_EXCEPTION_HANDLER) ( IN struct _EFI_DEBUG_SUPPORT_INTERFACE *This, IN EXCEPTION_HANDLER ExceptionHandler, IN EXCEPTION_TYPE ExceptionType ); typedef EFI_STATUS (EFIAPI *EFI_IP_CALL_TRACE) ( IN struct _EFI_DEBUG_SUPPORT_INTERFACE *This ); #define EFI_DEBUG_SUPPORT_INTERFACE_REVISION 0x00010000 typedef struct _EFI_DEBUG_SUPPORT_INTERFACE { UINT32 Revision; EFI_REGISTER_TIMER_TICK_CALLBACK RegisterTimerTickCallback; EFI_REGISTER_EXCEPTION_HANDLER RegisterExceptionHandler; EFI_IP_CALL_TRACE IpCallTrace; } EFI_DEBUG_SUPPORT_INTERFACE; // // Debugport io protocol {EBA4E8D2-3858-41EC-A281-2647BA9660D0} // #define DEBUGPORT_IO_PROTOCOL \ { 0XEBA4E8D2, 0X3858, 0X41EC, 0XA2, 0X81, 0X26, 0X47, 0XBA, 0X96, 0X60, 0XD0 } typedef EFI_STATUS (EFIAPI *EFI_DEBUGPORT_IO_RESET) ( IN struct _EFI_DEBUGPORT_IO_INTERFACE *This ); typedef EFI_STATUS (EFIAPI *EFI_DEBUGPORT_IO_READ) ( IN struct _EFI_DEBUGPORT_IO_INTERFACE *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_DEBUGPORT_IO_WRITE) ( IN struct _EFI_DEBUGPORT_IO_INTERFACE *This, IN OUT UINTN *BufferSize, IN VOID *Buffer ); #define EFI_DEBUGPORT_IO_INTERFACE_REVISION 0x00010000 typedef struct _EFI_DEBUGPORT_IO_INTERFACE { UINT32 Revision; EFI_DEBUGPORT_IO_READ Read; EFI_DEBUGPORT_IO_WRITE Write; EFI_DEBUGPORT_IO_RESET Reset; } EFI_DEBUGPORT_IO_INTERFACE; // // Debugport UART16550 control protocol {628EA978-4C26-4605-BC02-A42A496917DD} // #define DEBUGPORT_UART16550_CONTROL_PROTOCOL \ { 0X628EA978, 0X4C26, 0X4605, 0XBC, 0X2, 0XA4, 0X2A, 0X49, 0X69, 0X17, 0XDD } // Note: The definitions for EFI_PARITY_TYPE, EFI_STOP_BITS_TYPE, and // SERIAL_IO_MODE are included from efiser.h typedef EFI_STATUS (EFIAPI *EFI_UART16550_SET_ATTRIBUTES) ( IN struct _EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE *This, IN UINT64 BaudRate, IN UINT32 ReceiveFifoDepth, IN UINT32 Timeout, IN EFI_PARITY_TYPE Parity, IN UINT8 DataBits, IN EFI_STOP_BITS_TYPE StopBits ); typedef EFI_STATUS (EFIAPI *EFI_UART16550_SET_CONTROL_BITS) ( IN struct _EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE *This, IN UINT32 Control ); typedef EFI_STATUS (EFIAPI *EFI_UART16550_GET_CONTROL_BITS) ( IN struct _EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE *This, OUT UINT32 *Control ); #define EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE_REVISION 0x00010000 typedef struct _EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE { UINT32 Revision; EFI_UART16550_SET_ATTRIBUTES SetAttributes; EFI_UART16550_SET_CONTROL_BITS SetControl; EFI_UART16550_GET_CONTROL_BITS GetControl; DEBUGPORT_16550_CONFIG_DATA *Mode; } EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE; #define DEVICE_PATH_DEBUGPORT DEBUGPORT_IO_PROTOCOL #endif /* _EFIDBG_H_ */ ncroxon-gnu-efi-157d47c/inc/protocol/efivar.h000066400000000000000000000074231471215650600211440ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: Abstract: Revision History --*/ // // The variable store protocol interface is specific to the reference // implementation. The initialization code adds variable store devices // to the system, and the FW connects to the devices to provide the // variable store interfaces through these devices. // // // Variable Store Device protocol // #define VARIABLE_STORE_PROTOCOL \ { 0xf088cd91, 0xa046, 0x11d2, {0x8e, 0x42, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } INTERFACE_DECL(_EFI_VARIABLE_STORE); typedef EFI_STATUS (EFIAPI *EFI_STORE_CLEAR) ( IN struct _EFI_VARIABLE_STORE *This, IN UINTN BankNo, IN OUT VOID *Scratch ); typedef EFI_STATUS (EFIAPI *EFI_STORE_READ) ( IN struct _EFI_VARIABLE_STORE *This, IN UINTN BankNo, IN UINTN Offset, IN UINTN BufferSize, OUT VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_STORE_UPDATE) ( IN struct _EFI_VARIABLE_STORE *This, IN UINTN BankNo, IN UINTN Offset, IN UINTN BufferSize, IN VOID *Buffer ); typedef EFI_STATUS (EFIAPI *EFI_STORE_SIZE) ( IN struct _EFI_VARIABLE_STORE *This, IN UINTN NoBanks ); typedef EFI_STATUS (EFIAPI *EFI_TRANSACTION_UPDATE) ( IN struct _EFI_VARIABLE_STORE *This, IN UINTN BankNo, IN VOID *NewContents ); typedef struct _EFI_VARIABLE_STORE { // // Number of banks and bank size // UINT32 Attributes; UINT32 BankSize; UINT32 NoBanks; // // Functions to access the storage banks // EFI_STORE_CLEAR ClearStore; EFI_STORE_READ ReadStore; EFI_STORE_UPDATE UpdateStore; EFI_STORE_SIZE SizeStore OPTIONAL; EFI_TRANSACTION_UPDATE TransactionUpdate OPTIONAL; } EFI_VARIABLE_STORE; // // // ClearStore() - A function to clear the requested storage bank. A cleared // bank contains all "on" bits. // // ReadStore() - Read data from the requested store. // // UpdateStore() - Updates data on the requested store. The FW will only // ever issue updates to clear bits in the store. Updates must be // performed in LSb to MSb order of the update buffer. // // SizeStore() - An optional function for non-runtime stores that can be // dynamically sized. The FW will only ever increase or decrease the store // by 1 banksize at a time, and it is always adding or removing a bank from // the end of the store. // // By default the FW will update variables and storage banks in an // "atomic" manner by keeping 1 old copy of the data during an update, // and recovering appropiately if the power is lost during the middle // of an operation. To do this the FW needs to have multiple banks // of storage dedicated to its use. If that's not possible, the driver // can implement an atomic bank update function and the FW will allow // 1 bank in this case. (It will allow any number of banks, // but it won't require an "extra" bank to provide its bank transaction // function). // // TransactionUpdate() - An optional function that can clear & update an // entire bank in an "atomic" fashion. If the operation fails in the // middle the driver is responsible for having either the previous copy // of the bank's data or the new copy. A copy that's partially written // is not valid as internal data settings may get lost. Supply this // function only when needed. // ncroxon-gnu-efi-157d47c/inc/protocol/ia64/000077500000000000000000000000001471215650600202545ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/protocol/ia64/eficontext.h000066400000000000000000000114471471215650600226040ustar00rootroot00000000000000/* * Copyright (c) 1999, 2000 * Intel Corporation. * 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. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * * This product includes software developed by Intel Corporation and * its contributors. * * 4. Neither the name of Intel Corporation or its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION 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 INTEL CORPORATION 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. * */ #ifndef _EFICONTEXT_H_ #define _EFICONTEXT_H_ // // IA-64 processor exception types // #define EXCPT_ALT_DTLB 4 #define EXCPT_DNESTED_TLB 5 #define EXCPT_BREAKPOINT 11 #define EXCPT_EXTERNAL_INTERRUPT 12 #define EXCPT_GEN_EXCEPT 24 #define EXCPT_NAT_CONSUMPTION 26 #define EXCPT_DEBUG_EXCEPT 29 #define EXCPT_UNALIGNED_ACCESS 30 #define EXCPT_FP_FAULT 32 #define EXCPT_FP_TRAP 33 #define EXCPT_TAKEN_BRANCH 35 #define EXCPT_SINGLE_STEP 36 // // IA-64 processor context definition - must be 512 byte aligned!!! // typedef struct { UINT64 reserved; // necessary to preserve alignment for the correct bits in UNAT and to insure F2 is 16 byte aligned... UINT64 r1; UINT64 r2; UINT64 r3; UINT64 r4; UINT64 r5; UINT64 r6; UINT64 r7; UINT64 r8; UINT64 r9; UINT64 r10; UINT64 r11; UINT64 r12; UINT64 r13; UINT64 r14; UINT64 r15; UINT64 r16; UINT64 r17; UINT64 r18; UINT64 r19; UINT64 r20; UINT64 r21; UINT64 r22; UINT64 r23; UINT64 r24; UINT64 r25; UINT64 r26; UINT64 r27; UINT64 r28; UINT64 r29; UINT64 r30; UINT64 r31; UINT64 f2[2]; UINT64 f3[2]; UINT64 f4[2]; UINT64 f5[2]; UINT64 f6[2]; UINT64 f7[2]; UINT64 f8[2]; UINT64 f9[2]; UINT64 f10[2]; UINT64 f11[2]; UINT64 f12[2]; UINT64 f13[2]; UINT64 f14[2]; UINT64 f15[2]; UINT64 f16[2]; UINT64 f17[2]; UINT64 f18[2]; UINT64 f19[2]; UINT64 f20[2]; UINT64 f21[2]; UINT64 f22[2]; UINT64 f23[2]; UINT64 f24[2]; UINT64 f25[2]; UINT64 f26[2]; UINT64 f27[2]; UINT64 f28[2]; UINT64 f29[2]; UINT64 f30[2]; UINT64 f31[2]; UINT64 pr; UINT64 b0; UINT64 b1; UINT64 b2; UINT64 b3; UINT64 b4; UINT64 b5; UINT64 b6; UINT64 b7; // application registers UINT64 ar_rsc; UINT64 ar_bsp; UINT64 ar_bspstore; UINT64 ar_rnat; UINT64 ar_fcr; UINT64 ar_eflag; UINT64 ar_csd; UINT64 ar_ssd; UINT64 ar_cflg; UINT64 ar_fsr; UINT64 ar_fir; UINT64 ar_fdr; UINT64 ar_ccv; UINT64 ar_unat; UINT64 ar_fpsr; UINT64 ar_pfs; UINT64 ar_lc; UINT64 ar_ec; // control registers UINT64 cr_dcr; UINT64 cr_itm; UINT64 cr_iva; UINT64 cr_pta; UINT64 cr_ipsr; UINT64 cr_isr; UINT64 cr_iip; UINT64 cr_ifa; UINT64 cr_itir; UINT64 cr_iipa; UINT64 cr_ifs; UINT64 cr_iim; UINT64 cr_iha; // debug registers UINT64 dbr0; UINT64 dbr1; UINT64 dbr2; UINT64 dbr3; UINT64 dbr4; UINT64 dbr5; UINT64 dbr6; UINT64 dbr7; UINT64 ibr0; UINT64 ibr1; UINT64 ibr2; UINT64 ibr3; UINT64 ibr4; UINT64 ibr5; UINT64 ibr6; UINT64 ibr7; // virtual registers UINT64 int_nat; // nat bits for R1-R31 } SYSTEM_CONTEXT; #endif /* _EFI_CONTEXT_H_ */ ncroxon-gnu-efi-157d47c/inc/protocol/intload.h000066400000000000000000000006121471215650600213130ustar00rootroot00000000000000/*++ Copyright (c) 1999 Intel Corporation Module Name: intload Abstract: EFI support for loading internally linked in apps Revision History --*/ #ifndef _INTERNAL_LOAD_INCLUDE_ #define _INTERNAL_LOAD_INCLUDE_ // {D65A6B8C-71E5-4df0-A909-F0D2992B5AA9} #define INTERNAL_SHELL_GUID \ { 0xd65a6b8c, 0x71e5, 0x4df0, {0xa9, 0x09, 0xf0, 0xd2, 0x99, 0x2b, 0x5a, 0xa9} } #endif ncroxon-gnu-efi-157d47c/inc/protocol/legacyboot.h000066400000000000000000000046761471215650600220270ustar00rootroot00000000000000/*++ Copyright (c) 1999 Intel Corporation Module Name: legacyboot Abstract: EFI support for legacy boot Revision History --*/ #ifndef _LEGACY_BOOT_INCLUDE_ #define _LEGACY_BOOT_INCLUDE_ #define LEGACY_BOOT_PROTOCOL \ { 0x376e5eb2, 0x30e4, 0x11d3, { 0xba, 0xe5, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } } #pragma pack(1) // // BBS 1.01 (See Appendix A) IPL and BCV Table Entry Data structure. // Seg:Off pointers have been converted to EFI pointers in this data structure // This is the structure that also maps to the EFI device path for the boot selection // typedef struct { UINT16 DeviceType; UINT16 StatusFlag; UINT32 Reserved; VOID *BootHandler; // Not an EFI entry point CHAR8 *DescString; } BBS_TABLE_ENTRY; #pragma pack() typedef EFI_STATUS (EFIAPI *LEGACY_BOOT_CALL) ( IN EFI_DEVICE_PATH *DevicePath ); // // BBS support functions // PnP Call numbers and BiosSelector hidden in implementation // typedef enum { IplRelative, BcvRelative } BBS_TYPE; INTERFACE_DECL(_LEGACY_BOOT_INTERFACE); // // == PnP Function 0x60 then BbsVersion == 0x0101 if this call fails then BbsVersion == 0x0000 // // // == PnP Function 0x61 // typedef EFI_STATUS (EFIAPI *GET_DEVICE_COUNT) ( IN struct _LEGACY_BOOT_INTERFACE *This, IN BBS_TYPE *TableType, OUT UINTN *DeviceCount, OUT UINTN *MaxCount ); // // == PnP Function 0x62 // typedef EFI_STATUS (EFIAPI *GET_PRIORITY_AND_TABLE) ( IN struct _LEGACY_BOOT_INTERFACE *This, IN BBS_TYPE *TableType, IN OUT UINTN *PrioritySize, // MaxCount * sizeof(UINT8) OUT UINTN *Priority, IN OUT UINTN *TableSize, // MaxCount * sizeof(BBS_TABLE_ENTRY) OUT BBS_TABLE_ENTRY *TableEntrySize ); // // == PnP Function 0x63 // typedef EFI_STATUS (EFIAPI *SET_PRIORITY) ( IN struct _LEGACY_BOOT_INTERFACE *This, IN BBS_TYPE *TableType, IN OUT UINTN *PrioritySize, OUT UINTN *Priority ); typedef struct _LEGACY_BOOT_INTERFACE { LEGACY_BOOT_CALL BootIt; // // New functions to allow BBS booting to be configured from EFI // UINTN BbsVersion; // Currently 0x0101 GET_DEVICE_COUNT GetDeviceCount; GET_PRIORITY_AND_TABLE GetPriorityAndTable; SET_PRIORITY SetPriority; } LEGACY_BOOT_INTERFACE; EFI_STATUS PlInitializeLegacyBoot ( VOID ); #endif ncroxon-gnu-efi-157d47c/inc/protocol/make.inf000066400000000000000000000001441471215650600211230ustar00rootroot00000000000000# # # [sources] efivar.h legacyboot.h VgaClass.h intload.h [ia32sources] [ia64sources] ncroxon-gnu-efi-157d47c/inc/protocol/makefile.hdr000066400000000000000000000011431471215650600217640ustar00rootroot00000000000000 # # This is a machine generated file - DO NOT EDIT # Generated by genmake.exe # Generated from make.inf # Copyright (c) 1998 Intel Corporation # INC_DEPS = $(INC_DEPS) \ $(SDK_INSTALL_DIR)\include\efi\protocol\efivar.h \ $(SDK_INSTALL_DIR)\include\efi\protocol\legacyboot.h \ $(SDK_INSTALL_DIR)\include\efi\protocol\vgaclass.h \ $(SDK_INSTALL_DIR)\include\efi\protocol\efidbg.h \ !IF "$(PROCESSOR)" == "Ia32" INC_DEPS = $(INC_DEPS) \ !ENDIF !IF "$(PROCESSOR)" == "Ia64" INC_DEPS = $(INC_DEPS) \ $(SDK_INSTALL_DIR)\include\efi\protocol\$(PROCESSOR)\eficontext.h \ !ENDIF ncroxon-gnu-efi-157d47c/inc/protocol/piflash64.h000066400000000000000000000074361471215650600214740ustar00rootroot00000000000000#ifndef _PIFLASH64_H #define _PIFLASH64_H /*++ Copyright (c) 1999 Intel Corporation Module Name: PIflash64.h Abstract: Iflash64.efi protocol to abstract iflash from the system. Revision History --*/ // // Guid that identifies the IFLASH protocol // #define IFLASH64_PROTOCOL_PROTOCOL \ { 0x65cba110, 0x74ab, 0x11d3, 0xbb, 0x89, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 }; // // Unlock FLASH from StartAddress to EndAddress and return a LockKey // typedef EFI_STATUS (EFIAPI *UNLOCK_FLASH_API)( IN struct _IFLASH64_PROTOCOL_INTERFACE *This ); // // Lock the flash represented by the LockKey // typedef EFI_STATUS (EFIAPI *LOCK_FLASH_API)( IN struct _IFLASH64_PROTOCOL_INTERFACE *This ); // // Status callback for a utility like IFLASH64 // // Token would map to a list like Ted proposed. The utility has no idea what // happens on the other side. // ErrorStatus - Level of Error or success. Independent of Token. If you // don't know the token you will at least know pass or fail. // String - Optional extra information about the error. Could be used for // debug or future expansion // // Attributes - Options screen attributes for String. Could allow the string to be different colors. // typedef EFI_STATUS (EFIAPI *UTILITY_PROGRESS_API)( IN struct _IFLASH64_PROTOCOL_INTERFACE *This, IN UINTN Token, IN EFI_STATUS ErrorStatus, IN CHAR16 *String, OPTIONAL IN UINTN *Attributes OPTIONAL ); // // Token Values // // IFlash64 Token Codes #define IFLASH_TOKEN_IFLASHSTART 0xB0 // IFlash64 has started #define IFLASH_TOKEN_READINGFILE 0xB1 // Reading File #define IFLASH_TOKEN_INITVPP 0xB2 // Initializing Vpp #define IFLASH_TOKEN_DISABLEVPP 0x10 // Disable Vpp #define IFLASH_TOKEN_FLASHUNLOCK 0xB3 // Unlocking FLASH Devices #define IFLASH_TOKEN_FLASHERASE 0xB4 // Erasing FLASH Devices #define IFLASH_TOKEN_FLASHPROGRAM 0xB5 // Programming FLASH #define IFLASH_TOKEN_FLASHVERIFY 0xB6 // Verifying FLASH #define IFLASH_TOKEN_UPDATESUCCES 0xB7 // FLASH Updage Success! #define IFLASH_TOKEN_PROGRESS_READINGFILE 0x11 // % Reading File #define IFLASH_TOKEN_PROGRESS_FLASHUNLOCK 0x13 // % Unlocking FLASH Devices #define IFLASH_TOKEN_PROGRESS_FLASHERASE 0x14 // % Erasing FLASH Devices #define IFLASH_TOKEN_PROGRESS_FLASHPROGRAM 0x15 // % Programming FLASH #define IFLASH_TOKEN_PROGRESS_FLASHVERIFY 0x16 // % Verifying FLASH #define IFLASH_TOKEN_READINGFILE_ER 0xB8 // File Read Error #define IFLASH_TOKEN_INITVPP_ER 0xB9 // Initialization of IFB Error #define IFLASH_TOKEN_FLASHUNLOCK_ER 0xBA // FLASH Unlock Error #define IFLASH_TOKEN_FLASHERASE_ER 0xBB // FLASH Erase Error #define IFLASH_TOKEN_FLASHVERIFY_ER 0xBC // FLASH Verify Error #define IFLASH_TOKEN_FLASHPROG_ER 0xBD // FLASH Program Error #define IFLASH_TABLE_END 0x00 // // If this number changes one of the existing API's has changes // #define IFLASH_PI_MAJOR_VERSION 0x01 // // This number changes when new APIs or data variables get added to the end // of the data structure // #define IFLASH_PI_MINOR_VERSION 0x01 typedef struct _IFLASH64_PROTOCOL_INTERFACE { UINT32 MajorVersion; UINT32 MinorVersion; UNLOCK_FLASH_API UnlockFlash; LOCK_FLASH_API LockFlash; UTILITY_PROGRESS_API Progress; // // Future expansion goes here // } IFLASH64_PROTOCOL_INTERFACE; #endif ncroxon-gnu-efi-157d47c/inc/protocol/readme.txt000066400000000000000000000001561471215650600215110ustar00rootroot00000000000000The protocol directory contains non Architectural Protocols that span the FW, Platform, or application space.ncroxon-gnu-efi-157d47c/inc/protocol/vgaclass.h000066400000000000000000000035721471215650600214740ustar00rootroot00000000000000#ifndef _VGA_CLASS_H #define _VGA_CLASS_H /*++ Copyright (c) 1999 Intel Corporation Module Name: VgaClass.h Abstract: Vga Mini port binding to Vga Class protocol Revision History --*/ // // VGA Device Structure // // {0E3D6310-6FE4-11d3-BB81-0080C73C8881} #define VGA_CLASS_DRIVER_PROTOCOL \ { 0xe3d6310, 0x6fe4, 0x11d3, {0xbb, 0x81, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} } typedef EFI_STATUS (* INIT_VGA_CARD) ( IN UINTN VgaMode, IN VOID *Context ); typedef struct { UINTN MaxColumns; UINTN MaxRows; } MAX_CONSOLE_GEOMETRY; #define VGA_CON_OUT_DEV_SIGNATURE EFI_SIGNATURE_32('c','v','g','a') typedef struct { UINTN Signature; EFI_HANDLE Handle; SIMPLE_TEXT_OUTPUT_INTERFACE ConOut; SIMPLE_TEXT_OUTPUT_MODE ConOutMode; EFI_DEVICE_PATH *DevicePath; UINT8 *Buffer; EFI_DEVICE_IO_INTERFACE *DeviceIo; // // Video Card Context // INIT_VGA_CARD InitVgaCard; VOID *VgaCardContext; MAX_CONSOLE_GEOMETRY *Geometry; // // Video buffer normally 0xb8000 // UINT64 VideoBuffer; // // Clear Screen & Default Attribute // UINT32 Attribute; // // -1 means search for active VGA device // EFI_PCI_ADDRESS_UNION Pci; } VGA_CON_OUT_DEV; #define VGA_CON_OUT_DEV_FROM_THIS(a) CR(a, VGA_CON_OUT_DEV, ConOut, VGA_CON_OUT_DEV_SIGNATURE) // // Vga Class Driver Protocol. // GUID defined in EFI Lib // typedef EFI_STATUS (EFIAPI *INSTALL_VGA_DRIVER) ( IN VGA_CON_OUT_DEV *ConOutDev ); typedef struct { UINT32 Version; INSTALL_VGA_DRIVER InstallGenericVgaDriver; } INSTALL_VGA_DRIVER_INTERFACE; #endif ncroxon-gnu-efi-157d47c/inc/riscv64/000077500000000000000000000000001471215650600171505ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/riscv64/efibind.h000066400000000000000000000114331471215650600207230ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause */ /* * Copyright (C) 2014 - 2015 Linaro Ltd. * Author: Ard Biesheuvel * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #include #include // // Basic EFI types of various widths // typedef uint64_t UINT64; typedef int64_t INT64; typedef uint32_t UINT32; typedef int32_t INT32; typedef uint16_t UINT16; typedef int16_t INT16; typedef uint8_t UINT8; typedef int8_t INT8; typedef unsigned char CHAR8; typedef uint16_t CHAR16; #define WCHAR CHAR16 #undef VOID typedef void VOID; typedef int64_t INTN; typedef uint64_t UINTN; #define EFI_ERROR_MASK 0x8000000000000000 #define EFIERR(a) (EFI_ERROR_MASK | a) #define EFIERR_OEM(a) (0xc000000000000000 | a) #define BAD_POINTER 0xFBFBFBFBFBFBFBFB #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF #define BREAKPOINT() while(1); // // Pointers must be aligned to these address to function // #define MIN_ALIGNMENT_SIZE 8 #define ALIGN_VARIABLE(Value, Adjustment) \ (UINTN)Adjustment = 0; \ if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ Value = (UINTN)Value + (UINTN)Adjustment // // Define macros to build data structure signatures from characters. // #define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) #define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) // // EFIAPI - prototype calling convention for EFI function pointers // BOOTSERVICE - prototype for implementation of a boot service interface // RUNTIMESERVICE - prototype for implementation of a runtime service interface // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service // RUNTIME_CODE - pragma macro for declaring runtime code // #ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options #define EFIAPI // Substitute expresion to force C calling convention #endif #define BOOTSERVICE #define RUNTIMESERVICE #define RUNTIMEFUNCTION #define RUNTIME_CODE(a) alloc_text("rtcode", a) #define BEGIN_RUNTIME_DATA() data_seg("rtdata") #define END_RUNTIME_DATA() data_seg("") #define VOLATILE volatile #define MEMORY_FENCE __sync_synchronize // // When build similiar to FW, then link everything together as // one big module. For the MSVC toolchain, we simply tell the // linker what our driver init function is using /ENTRY. // #if defined(_MSC_EXTENSIONS) #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ __pragma(comment(linker, "/ENTRY:" # InitFunction)) #else #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ UINTN \ InitializeDriver ( \ VOID *ImageHandle, \ VOID *SystemTable \ ) \ { \ return InitFunction(ImageHandle, \ SystemTable); \ } \ \ EFI_STATUS efi_main( \ EFI_HANDLE image, \ EFI_SYSTEM_TABLE *systab \ ) __attribute__((weak, \ alias ("InitializeDriver"))); #endif #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ (_if)->LoadInternal(type, name, entry) // // Some compilers don't support the forward reference construct: // typedef struct XXXXX // // The following macro provide a workaround for such cases. #define INTERFACE_DECL(x) struct x #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) #define EFI_FUNCTION ncroxon-gnu-efi-157d47c/inc/riscv64/efilibplat.h000066400000000000000000000002671471215650600214410ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause */ VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); ncroxon-gnu-efi-157d47c/inc/riscv64/efisetjmp_arch.h000066400000000000000000000011411471215650600223010ustar00rootroot00000000000000/* SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause */ #ifndef GNU_EFI_RISCV64_SETJMP_H #define GNU_EFI_RISCV64_SETJMP_H #define JMPBUF_ALIGN 8 typedef struct { /* GP regs */ UINT64 s0; UINT64 s1; UINT64 s2; UINT64 s3; UINT64 s4; UINT64 s5; UINT64 s6; UINT64 s7; UINT64 s8; UINT64 s9; UINT64 s10; UINT64 s11; UINT64 sp; UINT64 ra; /* FP regs */ UINT64 fs0; UINT64 fs1; UINT64 fs2; UINT64 fs3; UINT64 fs4; UINT64 fs5; UINT64 fs6; UINT64 fs7; UINT64 fs8; UINT64 fs9; UINT64 fs10; UINT64 fs11; } EFI_ALIGN(JMPBUF_ALIGN) jmp_buf[1]; #endif /* GNU_EFI_RISCV64_SETJMP_H */ ncroxon-gnu-efi-157d47c/inc/romload.h000066400000000000000000000013241471215650600174560ustar00rootroot00000000000000#ifndef _EFI_ROMLOAD_H #define _EFI_ROMLOAD_H #define ROM_SIGNATURE 0xaa55 #define PCIDS_SIGNATURE "PCIR" #pragma pack(push) #pragma pack(1) typedef struct { UINT8 Pcids_Sig[4]; UINT16 VendId; UINT16 DevId; UINT16 Vpd_Off; UINT16 Size; UINT8 Rev; UINT8 Class_Code[3]; UINT16 Image_Len; UINT16 Rev_Lvl; UINT8 Code_Type; UINT8 Indi; UINT16 Rsvd; }PciDataStructure; typedef struct { UINT16 Size; UINT32 Header_Sig; UINT16 SubSystem; UINT16 MachineType; UINT8 Resvd[10]; UINT16 EfiOffset; }ArchData; typedef struct { UINT16 Rom_Sig; ArchData Arch_Data; UINT16 Pcids_Off; UINT8 resvd[38]; }RomHeader; #pragma pack(pop) #endif ncroxon-gnu-efi-157d47c/inc/subst/000077500000000000000000000000001471215650600170105ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/subst/elf.h000066400000000000000000000043441471215650600177340ustar00rootroot00000000000000/* Copyright (C) 2024 GNU-EFI Contributors This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(__GNU_EFI_NO_GLIBC) #include #else typedef uint32_t Elf32_Addr; typedef int32_t Elf32_Sword; typedef uint32_t Elf32_Word; typedef uint64_t Elf64_Addr; typedef int64_t Elf64_Sxword; typedef uint64_t Elf64_Xword; typedef struct { Elf32_Addr r_offset; Elf32_Word r_info; } Elf32_Rel; typedef struct { Elf64_Addr r_offset; Elf64_Xword r_info; Elf64_Sxword r_addend; } Elf64_Rela; typedef struct { Elf32_Sword d_tag; union { Elf32_Word d_val; Elf32_Addr d_ptr; } d_un; } Elf32_Dyn; typedef struct { Elf64_Sxword d_tag; union { Elf64_Xword d_val; Elf64_Addr d_ptr; } d_un; } Elf64_Dyn; #define ELF32_R_TYPE(val) ((val) & 0xff) #define ELF64_R_TYPE(i) ((i) & 0xffffffff) #define DT_NULL 0 #define DT_REL 17 #define DT_RELSZ 18 #define DT_RELENT 19 #define DT_RELA 7 #define DT_RELASZ 8 #define DT_RELAENT 9 #define DT_PLTGOT 3 #define R_AARCH64_NONE 0 #define R_AARCH64_RELATIVE 1027 #define R_RISCV_RELATIVE 3 #define R_LARCH_NONE 0 #define R_LARCH_RELATIVE 3 #define R_X86_64_NONE 0 #define R_X86_64_RELATIVE 8 #define R_ARM_NONE 0 #define R_ARM_RELATIVE 23 #define R_386_NONE 0 #define R_386_RELATIVE 8 #define R_MIPS_NONE 0 #define R_MIPS_64 18 #define R_MIPS_REL32 3 #endif ncroxon-gnu-efi-157d47c/inc/x86_64/000077500000000000000000000000001471215650600166065ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/inc/x86_64/efibind.h000066400000000000000000000324351471215650600203660ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: efefind.h Abstract: EFI to compile bindings Revision History --*/ #ifndef X86_64_EFI_BIND #define X86_64_EFI_BIND #ifndef __GNUC__ #pragma pack() #endif #if defined(_MSC_VER) #define HAVE_USE_MS_ABI 1 #elif defined(GNU_EFI_USE_MS_ABI) #if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)))||(defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 2))) #define HAVE_USE_MS_ABI 1 #else #error Compiler is too old for GNU_EFI_USE_MS_ABI #endif #endif // // Basic int types of various widths // #if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L ) && !defined(__cplusplus) // No ANSI C 1999/2000 stdint.h integer width declarations #if defined(_MSC_EXTENSIONS) // Use Microsoft C compiler integer width declarations typedef unsigned __int64 uint64_t; typedef __int64 int64_t; typedef unsigned __int32 uint32_t; typedef __int32 int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef char int8_t; #elif defined(__GNUC__) typedef int __attribute__((__mode__(__DI__))) int64_t; typedef unsigned int __attribute__((__mode__(__DI__))) uint64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef signed char int8_t; #elif defined(UNIX_LP64) /* Use LP64 programming model from C_FLAGS for integer width declarations */ typedef unsigned long uint64_t; typedef long int64_t; typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef char int8_t; #else /* Assume P64 programming model from C_FLAGS for integer width declarations */ typedef unsigned long long uint64_t __attribute__((aligned (8))); typedef long long int64_t __attribute__((aligned (8))); typedef unsigned int uint32_t; typedef int int32_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned char uint8_t; typedef char int8_t; #endif typedef uint64_t uintptr_t; typedef int64_t intptr_t; #else #include #endif // // Basic EFI types of various widths // #include typedef uint16_t CHAR16; #define WCHAR CHAR16 typedef uint64_t UINT64; typedef int64_t INT64; #ifndef _BASETSD_H_ typedef uint32_t UINT32; typedef int32_t INT32; #endif typedef uint16_t UINT16; typedef int16_t INT16; typedef uint8_t UINT8; typedef unsigned char CHAR8; typedef int8_t INT8; #undef VOID typedef void VOID; typedef int64_t INTN; typedef uint64_t UINTN; #ifdef EFI_NT_EMULATOR #define POST_CODE(_Data) #else #ifdef EFI_DEBUG #define POST_CODE(_Data) __asm mov eax,(_Data) __asm out 0x80,al #else #define POST_CODE(_Data) #endif #endif #define EFIERR(a) (0x8000000000000000 | a) #define EFI_ERROR_MASK 0x8000000000000000 #define EFIERR_OEM(a) (0xc000000000000000 | a) #define BAD_POINTER 0xFBFBFBFBFBFBFBFB #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF #ifdef EFI_NT_EMULATOR #define BREAKPOINT() __asm { int 3 } #else #define BREAKPOINT() while (TRUE); // Make it hang on Bios[Dbg]32 #endif // // Pointers must be aligned to these address to function // #define MIN_ALIGNMENT_SIZE 4 #define ALIGN_VARIABLE(Value ,Adjustment) \ (UINTN)Adjustment = 0; \ if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ Value = (UINTN)Value + (UINTN)Adjustment // // Define macros to build data structure signatures from characters. // #define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) #define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) // // To export & import functions in the EFI emulator environment // #ifdef EFI_NT_EMULATOR #define EXPORTAPI __declspec( dllexport ) #else #define EXPORTAPI #endif // // EFIAPI - prototype calling convention for EFI function pointers // BOOTSERVICE - prototype for implementation of a boot service interface // RUNTIMESERVICE - prototype for implementation of a runtime service interface // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service // RUNTIME_CODE - pragma macro for declaring runtime code // #ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options #ifdef _MSC_EXTENSIONS #define EFIAPI __cdecl // Force C calling convention for Microsoft C compiler #elif defined(HAVE_USE_MS_ABI) // Force amd64/ms calling conventions. #define EFIAPI __attribute__((ms_abi)) #else #define EFIAPI // Substitute expresion to force C calling convention #endif #endif #define BOOTSERVICE //#define RUNTIMESERVICE(proto,a) alloc_text("rtcode",a); proto a //#define RUNTIMEFUNCTION(proto,a) alloc_text("rtcode",a); proto a #define RUNTIMESERVICE #define RUNTIMEFUNCTION #define RUNTIME_CODE(a) alloc_text("rtcode", a) #define BEGIN_RUNTIME_DATA() data_seg("rtdata") #define END_RUNTIME_DATA() data_seg("") #define VOLATILE volatile #define MEMORY_FENCE() #ifdef EFI_NT_EMULATOR // // To help ensure proper coding of integrated drivers, they are // compiled as DLLs. In NT they require a dll init entry pointer. // The macro puts a stub entry point into the DLL so it will load. // #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ UINTN \ __stdcall \ _DllMainCRTStartup ( \ UINTN Inst, \ UINTN reason_for_call, \ VOID *rserved \ ) \ { \ return 1; \ } \ \ int \ EXPORTAPI \ __cdecl \ InitializeDriver ( \ void *ImageHandle, \ void *SystemTable \ ) \ { \ return InitFunction(ImageHandle, SystemTable); \ } #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ (_if)->LoadInternal(type, name, NULL) #else // EFI_NT_EMULATOR // // When build similiar to FW, then link everything together as // one big module. For the MSVC toolchain, we simply tell the // linker what our driver init function is using /ENTRY. // #if defined(_MSC_EXTENSIONS) #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ __pragma(comment(linker, "/ENTRY:" # InitFunction)) #else #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ UINTN \ InitializeDriver ( \ VOID *ImageHandle, \ VOID *SystemTable \ ) \ { \ return InitFunction(ImageHandle, \ SystemTable); \ } \ \ EFI_STATUS efi_main( \ EFI_HANDLE image, \ EFI_SYSTEM_TABLE *systab \ ) __attribute__((weak, \ alias ("InitializeDriver"))); #endif #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ (_if)->LoadInternal(type, name, entry) #endif // EFI_NT_EMULATOR // // Some compilers don't support the forward reference construct: // typedef struct XXXXX // // The following macro provide a workaround for such cases. // #ifdef NO_INTERFACE_DECL #define INTERFACE_DECL(x) #else #if defined(__GNUC__) || defined(_MSC_EXTENSIONS) #define INTERFACE_DECL(x) struct x #else #define INTERFACE_DECL(x) typedef struct x #endif #endif /* for x86_64, EFI_FUNCTION_WRAPPER must be defined */ #if defined(HAVE_USE_MS_ABI) #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) #else /* Credits for macro-magic: https://groups.google.com/forum/?fromgroups#!topic/comp.std.c/d-6Mj5Lko_s http://efesx.com/2010/08/31/overloading-macros/ */ #define __VA_NARG__(...) \ __VA_NARG_(_0, ## __VA_ARGS__, __RSEQ_N()) #define __VA_NARG_(...) \ __VA_ARG_N(__VA_ARGS__) #define __VA_ARG_N( \ _0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,N,...) N #define __RSEQ_N() \ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 #define __VA_ARG_NSUFFIX__(prefix,...) \ __VA_ARG_NSUFFIX_N(prefix, __VA_NARG__(__VA_ARGS__)) #define __VA_ARG_NSUFFIX_N(prefix,nargs) \ __VA_ARG_NSUFFIX_N_(prefix, nargs) #define __VA_ARG_NSUFFIX_N_(prefix,nargs) \ prefix ## nargs /* Prototypes of EFI cdecl -> stdcall trampolines */ UINT64 efi_call0(void *func); UINT64 efi_call1(void *func, UINT64 arg1); UINT64 efi_call2(void *func, UINT64 arg1, UINT64 arg2); UINT64 efi_call3(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3); UINT64 efi_call4(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, UINT64 arg4); UINT64 efi_call5(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, UINT64 arg4, UINT64 arg5); UINT64 efi_call6(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, UINT64 arg4, UINT64 arg5, UINT64 arg6); UINT64 efi_call7(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7); UINT64 efi_call8(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7, UINT64 arg8); UINT64 efi_call9(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7, UINT64 arg8, UINT64 arg9); UINT64 efi_call10(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7, UINT64 arg8, UINT64 arg9, UINT64 arg10); /* Front-ends to efi_callX to avoid compiler warnings */ #define _cast64_efi_call0(f) \ efi_call0(f) #define _cast64_efi_call1(f,a1) \ efi_call1(f, (UINT64)(a1)) #define _cast64_efi_call2(f,a1,a2) \ efi_call2(f, (UINT64)(a1), (UINT64)(a2)) #define _cast64_efi_call3(f,a1,a2,a3) \ efi_call3(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3)) #define _cast64_efi_call4(f,a1,a2,a3,a4) \ efi_call4(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4)) #define _cast64_efi_call5(f,a1,a2,a3,a4,a5) \ efi_call5(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ (UINT64)(a5)) #define _cast64_efi_call6(f,a1,a2,a3,a4,a5,a6) \ efi_call6(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ (UINT64)(a5), (UINT64)(a6)) #define _cast64_efi_call7(f,a1,a2,a3,a4,a5,a6,a7) \ efi_call7(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ (UINT64)(a5), (UINT64)(a6), (UINT64)(a7)) #define _cast64_efi_call8(f,a1,a2,a3,a4,a5,a6,a7,a8) \ efi_call8(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ (UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8)) #define _cast64_efi_call9(f,a1,a2,a3,a4,a5,a6,a7,a8,a9) \ efi_call9(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ (UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8), \ (UINT64)(a9)) #define _cast64_efi_call10(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) \ efi_call10(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ (UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8), \ (UINT64)(a9), (UINT64)(a10)) /* main wrapper (va_num ignored) */ #define uefi_call_wrapper(func,va_num,...) \ __VA_ARG_NSUFFIX__(_cast64_efi_call, __VA_ARGS__) (func , ##__VA_ARGS__) #endif #if defined(HAVE_USE_MS_ABI) && !defined(_MSC_EXTENSIONS) #define EFI_FUNCTION __attribute__((ms_abi)) #else #define EFI_FUNCTION #endif #ifdef _MSC_EXTENSIONS #pragma warning ( disable : 4731 ) // Suppress warnings about modification of EBP #endif #endif ncroxon-gnu-efi-157d47c/inc/x86_64/efilibplat.h000066400000000000000000000004131471215650600210700ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: efilibplat.h Abstract: EFI to compile bindings Revision History --*/ VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ); ncroxon-gnu-efi-157d47c/inc/x86_64/efisetjmp_arch.h000066400000000000000000000005571471215650600217510ustar00rootroot00000000000000#ifndef GNU_EFI_X86_64_SETJMP_H #define GNU_EFI_X86_64_SETJMP_H #define JMPBUF_ALIGN 8 typedef struct { UINT64 Rbx; UINT64 Rsp; UINT64 Rbp; UINT64 Rdi; UINT64 Rsi; UINT64 R12; UINT64 R13; UINT64 R14; UINT64 R15; UINT64 Rip; UINT64 MxCsr; UINT8 XmmBuffer[160]; // XMM6 - XMM15 } EFI_ALIGN(JMPBUF_ALIGN) jmp_buf[1]; #endif /* GNU_EFI_X86_64_SETJMP_H */ ncroxon-gnu-efi-157d47c/inc/x86_64/pe.h000066400000000000000000000574461471215650600174030ustar00rootroot00000000000000/* PE32+ header file */ #ifndef _PE_H #define _PE_H #define IMAGE_DOS_SIGNATURE 0x5A4D // MZ #define IMAGE_OS2_SIGNATURE 0x454E // NE #define IMAGE_OS2_SIGNATURE_LE 0x454C // LE #define IMAGE_NT_SIGNATURE 0x00004550 // PE00 #define IMAGE_EDOS_SIGNATURE 0x44454550 // PEED typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header UINT16 e_magic; // Magic number UINT16 e_cblp; // Bytes on last page of file UINT16 e_cp; // Pages in file UINT16 e_crlc; // Relocations UINT16 e_cparhdr; // Size of header in paragraphs UINT16 e_minalloc; // Minimum extra paragraphs needed UINT16 e_maxalloc; // Maximum extra paragraphs needed UINT16 e_ss; // Initial (relative) SS value UINT16 e_sp; // Initial SP value UINT16 e_csum; // Checksum UINT16 e_ip; // Initial IP value UINT16 e_cs; // Initial (relative) CS value UINT16 e_lfarlc; // File address of relocation table UINT16 e_ovno; // Overlay number UINT16 e_res[4]; // Reserved words UINT16 e_oemid; // OEM identifier (for e_oeminfo) UINT16 e_oeminfo; // OEM information; e_oemid specific UINT16 e_res2[10]; // Reserved words UINT32 e_lfanew; // File address of new exe header } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; typedef struct _IMAGE_OS2_HEADER { // OS/2 .EXE header UINT16 ne_magic; // Magic number UINT8 ne_ver; // Version number UINT8 ne_rev; // Revision number UINT16 ne_enttab; // Offset of Entry Table UINT16 ne_cbenttab; // Number of bytes in Entry Table UINT32 ne_crc; // Checksum of whole file UINT16 ne_flags; // Flag UINT16 UINT16 ne_autodata; // Automatic data segment number UINT16 ne_heap; // Initial heap allocation UINT16 ne_stack; // Initial stack allocation UINT32 ne_csip; // Initial CS:IP setting UINT32 ne_sssp; // Initial SS:SP setting UINT16 ne_cseg; // Count of file segments UINT16 ne_cmod; // Entries in Module Reference Table UINT16 ne_cbnrestab; // Size of non-resident name table UINT16 ne_segtab; // Offset of Segment Table UINT16 ne_rsrctab; // Offset of Resource Table UINT16 ne_restab; // Offset of resident name table UINT16 ne_modtab; // Offset of Module Reference Table UINT16 ne_imptab; // Offset of Imported Names Table UINT32 ne_nrestab; // Offset of Non-resident Names Table UINT16 ne_cmovent; // Count of movable entries UINT16 ne_align; // Segment alignment shift count UINT16 ne_cres; // Count of resource segments UINT8 ne_exetyp; // Target Operating system UINT8 ne_flagsothers; // Other .EXE flags UINT16 ne_pretthunks; // offset to return thunks UINT16 ne_psegrefbytes; // offset to segment ref. bytes UINT16 ne_swaparea; // Minimum code swap area size UINT16 ne_expver; // Expected Windows version number } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER; // // File header format. // typedef struct _IMAGE_FILE_HEADER { UINT16 Machine; UINT16 NumberOfSections; UINT32 TimeDateStamp; UINT32 PointerToSymbolTable; UINT32 NumberOfSymbols; UINT16 SizeOfOptionalHeader; UINT16 Characteristics; } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; #define IMAGE_SIZEOF_FILE_HEADER 20 #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file. #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references). #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file. #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file. #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed. #define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine. #define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file #define IMAGE_FILE_SYSTEM 0x1000 // System File. #define IMAGE_FILE_DLL 0x2000 // File is a DLL. #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed. #define IMAGE_FILE_MACHINE_UNKNOWN 0 #define IMAGE_FILE_MACHINE_I386 0x14c // Intel 386. #define IMAGE_FILE_MACHINE_R3000 0x162 // MIPS little-endian, 0540 big-endian #define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian #define IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP #define IMAGE_FILE_MACHINE_ARMTHUMB_MIXED 0x1c2 // Arm/Thumb #define IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM PowerPC Little-Endian #define IMAGE_FILE_MACHINE_IA64 0x200 // IA-64 #define IMAGE_FILE_MACHINE_TAHOE 0x7cc // Intel EM machine #define IMAGE_FILE_MACHINE_EBC 0xebc // EFI Byte Code #define IMAGE_FILE_MACHINE_X64 0x8664 // x86_64 // // Directory format. // typedef struct _IMAGE_DATA_DIRECTORY { UINT32 VirtualAddress; UINT32 Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 // // Optional header format. // typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // UINT16 Magic; UINT8 MajorLinkerVersion; UINT8 MinorLinkerVersion; UINT32 SizeOfCode; UINT32 SizeOfInitializedData; UINT32 SizeOfUninitializedData; UINT32 AddressOfEntryPoint; UINT32 BaseOfCode; UINT32 BaseOfData; // // NT additional fields. // UINT32 ImageBase; UINT32 SectionAlignment; UINT32 FileAlignment; UINT16 MajorOperatingSystemVersion; UINT16 MinorOperatingSystemVersion; UINT16 MajorImageVersion; UINT16 MinorImageVersion; UINT16 MajorSubsystemVersion; UINT16 MinorSubsystemVersion; UINT32 Reserved1; UINT32 SizeOfImage; UINT32 SizeOfHeaders; UINT32 CheckSum; UINT16 Subsystem; UINT16 DllCharacteristics; UINT32 SizeOfStackReserve; UINT32 SizeOfStackCommit; UINT32 SizeOfHeapReserve; UINT32 SizeOfHeapCommit; UINT32 LoaderFlags; UINT32 NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; typedef struct _IMAGE_ROM_OPTIONAL_HEADER { UINT16 Magic; UINT8 MajorLinkerVersion; UINT8 MinorLinkerVersion; UINT32 SizeOfCode; UINT32 SizeOfInitializedData; UINT32 SizeOfUninitializedData; UINT32 AddressOfEntryPoint; UINT32 BaseOfCode; UINT32 BaseOfData; UINT32 BaseOfBss; UINT32 GprMask; UINT32 CprMask[4]; UINT32 GpValue; } IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER; #define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56 #define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28 #define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224 #define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 typedef struct _IMAGE_NT_HEADERS { UINT32 Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER OptionalHeader; } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS; typedef struct _IMAGE_ROM_HEADERS { IMAGE_FILE_HEADER FileHeader; IMAGE_ROM_OPTIONAL_HEADER OptionalHeader; } IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS; #define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \ ((UINT32)ntheader + \ FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \ ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader \ )) // Subsystem Values #define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem. #define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem. #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem. #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem. #define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem. #define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image run in the Posix character subsystem. // Directory Entries #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // Description String #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // Machine Value (MIPS GP) #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory // // Section header format. // #define IMAGE_SIZEOF_SHORT_NAME 8 typedef struct _IMAGE_SECTION_HEADER { UINT8 Name[IMAGE_SIZEOF_SHORT_NAME]; union { UINT32 PhysicalAddress; UINT32 VirtualSize; } Misc; UINT32 VirtualAddress; UINT32 SizeOfRawData; UINT32 PointerToRawData; UINT32 PointerToRelocations; UINT32 PointerToLinenumbers; UINT16 NumberOfRelocations; UINT16 NumberOfLinenumbers; UINT32 Characteristics; } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; #define IMAGE_SIZEOF_SECTION_HEADER 40 #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved. #define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code. #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data. #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data. #define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved. #define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information. #define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image. #define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat. #define IMAGE_SCN_ALIGN_1BYTES 0x00100000 // #define IMAGE_SCN_ALIGN_2BYTES 0x00200000 // #define IMAGE_SCN_ALIGN_4BYTES 0x00300000 // #define IMAGE_SCN_ALIGN_8BYTES 0x00400000 // #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified. #define IMAGE_SCN_ALIGN_32BYTES 0x00600000 // #define IMAGE_SCN_ALIGN_64BYTES 0x00700000 // #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded. #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable. #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable. #define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable. #define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable. #define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable. #define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable. // // Symbol format. // #define IMAGE_SIZEOF_SYMBOL 18 // // Section values. // // Symbols have a section number of the section in which they are // defined. Otherwise, section numbers have the following meanings: // #define IMAGE_SYM_UNDEFINED (UINT16)0 // Symbol is undefined or is common. #define IMAGE_SYM_ABSOLUTE (UINT16)-1 // Symbol is an absolute value. #define IMAGE_SYM_DEBUG (UINT16)-2 // Symbol is a special debug item. // // Type (fundamental) values. // #define IMAGE_SYM_TYPE_NULL 0 // no type. #define IMAGE_SYM_TYPE_VOID 1 // #define IMAGE_SYM_TYPE_CHAR 2 // type character. #define IMAGE_SYM_TYPE_SHORT 3 // type short integer. #define IMAGE_SYM_TYPE_INT 4 // #define IMAGE_SYM_TYPE_LONG 5 // #define IMAGE_SYM_TYPE_FLOAT 6 // #define IMAGE_SYM_TYPE_DOUBLE 7 // #define IMAGE_SYM_TYPE_STRUCT 8 // #define IMAGE_SYM_TYPE_UNION 9 // #define IMAGE_SYM_TYPE_ENUM 10 // enumeration. #define IMAGE_SYM_TYPE_MOE 11 // member of enumeration. #define IMAGE_SYM_TYPE_BYTE 12 // #define IMAGE_SYM_TYPE_WORD 13 // #define IMAGE_SYM_TYPE_UINT 14 // #define IMAGE_SYM_TYPE_DWORD 15 // // // Type (derived) values. // #define IMAGE_SYM_DTYPE_NULL 0 // no derived type. #define IMAGE_SYM_DTYPE_POINTER 1 // pointer. #define IMAGE_SYM_DTYPE_FUNCTION 2 // function. #define IMAGE_SYM_DTYPE_ARRAY 3 // array. // // Storage classes. // #define IMAGE_SYM_CLASS_END_OF_FUNCTION (BYTE )-1 #define IMAGE_SYM_CLASS_NULL 0 #define IMAGE_SYM_CLASS_AUTOMATIC 1 #define IMAGE_SYM_CLASS_EXTERNAL 2 #define IMAGE_SYM_CLASS_STATIC 3 #define IMAGE_SYM_CLASS_REGISTER 4 #define IMAGE_SYM_CLASS_EXTERNAL_DEF 5 #define IMAGE_SYM_CLASS_LABEL 6 #define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7 #define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8 #define IMAGE_SYM_CLASS_ARGUMENT 9 #define IMAGE_SYM_CLASS_STRUCT_TAG 10 #define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11 #define IMAGE_SYM_CLASS_UNION_TAG 12 #define IMAGE_SYM_CLASS_TYPE_DEFINITION 13 #define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14 #define IMAGE_SYM_CLASS_ENUM_TAG 15 #define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16 #define IMAGE_SYM_CLASS_REGISTER_PARAM 17 #define IMAGE_SYM_CLASS_BIT_FIELD 18 #define IMAGE_SYM_CLASS_BLOCK 100 #define IMAGE_SYM_CLASS_FUNCTION 101 #define IMAGE_SYM_CLASS_END_OF_STRUCT 102 #define IMAGE_SYM_CLASS_FILE 103 // new #define IMAGE_SYM_CLASS_SECTION 104 #define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105 // type packing constants #define N_BTMASK 017 #define N_TMASK 060 #define N_TMASK1 0300 #define N_TMASK2 0360 #define N_BTSHFT 4 #define N_TSHIFT 2 // MACROS // // Communal selection types. // #define IMAGE_COMDAT_SELECT_NODUPLICATES 1 #define IMAGE_COMDAT_SELECT_ANY 2 #define IMAGE_COMDAT_SELECT_SAME_SIZE 3 #define IMAGE_COMDAT_SELECT_EXACT_MATCH 4 #define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5 #define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1 #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 #define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3 // // Relocation format. // typedef struct _IMAGE_RELOCATION { UINT32 VirtualAddress; UINT32 SymbolTableIndex; UINT16 Type; } IMAGE_RELOCATION; #define IMAGE_SIZEOF_RELOCATION 10 // // I386 relocation types. // #define IMAGE_REL_I386_ABSOLUTE 0 // Reference is absolute, no relocation is necessary #define IMAGE_REL_I386_DIR16 01 // Direct 16-bit reference to the symbols virtual address #define IMAGE_REL_I386_REL16 02 // PC-relative 16-bit reference to the symbols virtual address #define IMAGE_REL_I386_DIR32 06 // Direct 32-bit reference to the symbols virtual address #define IMAGE_REL_I386_DIR32NB 07 // Direct 32-bit reference to the symbols virtual address, base not included #define IMAGE_REL_I386_SEG12 011 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address #define IMAGE_REL_I386_SECTION 012 #define IMAGE_REL_I386_SECREL 013 #define IMAGE_REL_I386_REL32 024 // PC-relative 32-bit reference to the symbols virtual address // // MIPS relocation types. // #define IMAGE_REL_MIPS_ABSOLUTE 0 // Reference is absolute, no relocation is necessary #define IMAGE_REL_MIPS_REFHALF 01 #define IMAGE_REL_MIPS_REFWORD 02 #define IMAGE_REL_MIPS_JMPADDR 03 #define IMAGE_REL_MIPS_REFHI 04 #define IMAGE_REL_MIPS_REFLO 05 #define IMAGE_REL_MIPS_GPREL 06 #define IMAGE_REL_MIPS_LITERAL 07 #define IMAGE_REL_MIPS_SECTION 012 #define IMAGE_REL_MIPS_SECREL 013 #define IMAGE_REL_MIPS_REFWORDNB 042 #define IMAGE_REL_MIPS_PAIR 045 // // Alpha Relocation types. // #define IMAGE_REL_ALPHA_ABSOLUTE 0x0 #define IMAGE_REL_ALPHA_REFLONG 0x1 #define IMAGE_REL_ALPHA_REFQUAD 0x2 #define IMAGE_REL_ALPHA_GPREL32 0x3 #define IMAGE_REL_ALPHA_LITERAL 0x4 #define IMAGE_REL_ALPHA_LITUSE 0x5 #define IMAGE_REL_ALPHA_GPDISP 0x6 #define IMAGE_REL_ALPHA_BRADDR 0x7 #define IMAGE_REL_ALPHA_HINT 0x8 #define IMAGE_REL_ALPHA_INLINE_REFLONG 0x9 #define IMAGE_REL_ALPHA_REFHI 0xA #define IMAGE_REL_ALPHA_REFLO 0xB #define IMAGE_REL_ALPHA_PAIR 0xC #define IMAGE_REL_ALPHA_MATCH 0xD #define IMAGE_REL_ALPHA_SECTION 0xE #define IMAGE_REL_ALPHA_SECREL 0xF #define IMAGE_REL_ALPHA_REFLONGNB 0x10 // // IBM PowerPC relocation types. // #define IMAGE_REL_PPC_ABSOLUTE 0x0000 // NOP #define IMAGE_REL_PPC_ADDR64 0x0001 // 64-bit address #define IMAGE_REL_PPC_ADDR32 0x0002 // 32-bit address #define IMAGE_REL_PPC_ADDR24 0x0003 // 26-bit address, shifted left 2 (branch absolute) #define IMAGE_REL_PPC_ADDR16 0x0004 // 16-bit address #define IMAGE_REL_PPC_ADDR14 0x0005 // 16-bit address, shifted left 2 (load doubleword) #define IMAGE_REL_PPC_REL24 0x0006 // 26-bit PC-relative offset, shifted left 2 (branch relative) #define IMAGE_REL_PPC_REL14 0x0007 // 16-bit PC-relative offset, shifted left 2 (br cond relative) #define IMAGE_REL_PPC_TOCREL16 0x0008 // 16-bit offset from TOC base #define IMAGE_REL_PPC_TOCREL14 0x0009 // 16-bit offset from TOC base, shifted left 2 (load doubleword) #define IMAGE_REL_PPC_ADDR32NB 0x000A // 32-bit addr w/o image base #define IMAGE_REL_PPC_SECREL 0x000B // va of containing section (as in an image sectionhdr) #define IMAGE_REL_PPC_SECTION 0x000C // sectionheader number #define IMAGE_REL_PPC_IFGLUE 0x000D // substitute TOC restore instruction iff symbol is glue code #define IMAGE_REL_PPC_IMGLUE 0x000E // symbol is glue code; virtual address is TOC restore instruction #define IMAGE_REL_PPC_TYPEMASK 0x00FF // mask to isolate above values in IMAGE_RELOCATION.Type // Flag bits in IMAGE_RELOCATION.TYPE #define IMAGE_REL_PPC_NEG 0x0100 // subtract reloc value rather than adding it #define IMAGE_REL_PPC_BRTAKEN 0x0200 // fix branch prediction bit to predict branch taken #define IMAGE_REL_PPC_BRNTAKEN 0x0400 // fix branch prediction bit to predict branch not taken #define IMAGE_REL_PPC_TOCDEFN 0x0800 // toc slot defined in file (or, data in toc) // // Based relocation format. // typedef struct _IMAGE_BASE_RELOCATION { UINT32 VirtualAddress; UINT32 SizeOfBlock; // UINT16 TypeOffset[1]; } IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION; #define IMAGE_SIZEOF_BASE_RELOCATION 8 // // Based relocation types. // #define IMAGE_REL_BASED_ABSOLUTE 0 #define IMAGE_REL_BASED_HIGH 1 #define IMAGE_REL_BASED_LOW 2 #define IMAGE_REL_BASED_HIGHLOW 3 #define IMAGE_REL_BASED_HIGHADJ 4 #define IMAGE_REL_BASED_MIPS_JMPADDR 5 #define IMAGE_REL_BASED_IA64_IMM64 9 #define IMAGE_REL_BASED_DIR64 10 // // Line number format. // typedef struct _IMAGE_LINENUMBER { union { UINT32 SymbolTableIndex; // Symbol table index of function name if Linenumber is 0. UINT32 VirtualAddress; // Virtual address of line number. } Type; UINT16 Linenumber; // Line number. } IMAGE_LINENUMBER; #define IMAGE_SIZEOF_LINENUMBER 6 // // Archive format. // #define IMAGE_ARCHIVE_START_SIZE 8 #define IMAGE_ARCHIVE_START "!\n" #define IMAGE_ARCHIVE_END "`\n" #define IMAGE_ARCHIVE_PAD "\n" #define IMAGE_ARCHIVE_LINKER_MEMBER "/ " #define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// " typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER { UINT8 Name[16]; // File member name - `/' terminated. UINT8 Date[12]; // File member date - decimal. UINT8 UserID[6]; // File member user id - decimal. UINT8 GroupID[6]; // File member group id - decimal. UINT8 Mode[8]; // File member mode - octal. UINT8 Size[10]; // File member size - decimal. UINT8 EndHeader[2]; // String to end header. } IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER; #define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60 // // DLL support. // // // Export Format // typedef struct _IMAGE_EXPORT_DIRECTORY { UINT32 Characteristics; UINT32 TimeDateStamp; UINT16 MajorVersion; UINT16 MinorVersion; UINT32 Name; UINT32 Base; UINT32 NumberOfFunctions; UINT32 NumberOfNames; UINT32 *AddressOfFunctions; UINT32 *AddressOfNames; UINT32 *AddressOfNameOrdinals; } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; // // Import Format // typedef struct _IMAGE_IMPORT_BY_NAME { UINT16 Hint; UINT8 Name[1]; } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME; typedef struct _IMAGE_THUNK_DATA { union { UINT32 Function; UINT32 Ordinal; PIMAGE_IMPORT_BY_NAME AddressOfData; } u1; } IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA; #define IMAGE_ORDINAL_FLAG 0x80000000 #define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0) #define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff) typedef struct _IMAGE_IMPORT_DESCRIPTOR { UINT32 Characteristics; UINT32 TimeDateStamp; UINT32 ForwarderChain; UINT32 Name; PIMAGE_THUNK_DATA FirstThunk; } IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR; #endif ncroxon-gnu-efi-157d47c/lib/000077500000000000000000000000001471215650600156455ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/lib/Makefile000066400000000000000000000055161471215650600173140ustar00rootroot00000000000000# # Copyright (C) 1999-2001 Hewlett-Packard Co. # Contributed by David Mosberger # Contributed by Stephane Eranian # # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * 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. # * Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS # BE LIABLE FOR ANYDIRECT, 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. # SRCDIR = . VPATH = $(SRCDIR) TOPDIR = $(SRCDIR)/.. include $(SRCDIR)/../Make.defaults FILES = boxdraw smbios console crc data debug dpath \ entry error event exit guid hand hw init lock \ misc pause print sread str cmdline runtime/rtlock \ runtime/efirtlib runtime/rtstr runtime/vm runtime/rtdata \ $(ARCH)/initplat $(ARCH)/math $(ARCH)/setjmp ifeq ($(ARCH),ia64) FILES += $(ARCH)/salpal $(ARCH)/palproc endif ifeq ($(ARCH),x86_64) FILES += $(ARCH)/callwrap $(ARCH)/efi_stub endif ifeq ($(ARCH),arm) FILES += $(ARCH)/uldiv $(ARCH)/ldivmod $(ARCH)/div $(ARCH)/llsl $(ARCH)/llsr \ $(ARCH)/mullu endif OBJS = $(FILES:%=%.o) ctors.o SUBDIRS = ia32 x86_64 ia64 aarch64 arm mips64el riscv64 loongarch64 runtime all: libsubdirs libefi.a .PHONY: libsubdirs libsubdirs: @set -e ; for sdir in $(SUBDIRS); do mkdir -p $$sdir; done $(OBJS): libsubdirs libefi.a: $(OBJS) @$(ECHO) " AR $(notdir $@)" $(HIDE)$(AR) $(ARFLAGS) $@ $^ clean: @rm -vf libefi.a *~ $(OBJS) */*.o install: mkdir -p $(INSTALLROOT)$(LIBDIR) $(INSTALL) -m 644 libefi.a $(INSTALLROOT)$(LIBDIR) include $(SRCDIR)/../Make.rules ncroxon-gnu-efi-157d47c/lib/aarch64/000077500000000000000000000000001471215650600170755ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/lib/aarch64/efi_stub.S000066400000000000000000000002141471215650600210160ustar00rootroot00000000000000/* This stub is a stub to make the build happy */ #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/aarch64/initplat.c000066400000000000000000000016351471215650600210720ustar00rootroot00000000000000/* * Copyright (C) 2014 Linaro Ltd. * Author: Ard Biesheuvel * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #include "lib.h" VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle EFI_UNUSED, IN EFI_SYSTEM_TABLE *SystemTable EFI_UNUSED ) { } ncroxon-gnu-efi-157d47c/lib/aarch64/math.c000066400000000000000000000030341471215650600201720ustar00rootroot00000000000000/* * Copyright (C) 2014 Linaro Ltd. * Author: Ard Biesheuvel * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #include "lib.h" UINT64 LShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Left shift 64bit by 32bit and get a 64bit result { return Operand << Count; } UINT64 RShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Right shift 64bit by 32bit and get a 64bit result { return Operand >> Count; } UINT64 MultU64x32 ( IN UINT64 Multiplicand, IN UINTN Multiplier ) // Multiple 64bit by 32bit and get a 64bit result { return Multiplicand * Multiplier; } UINT64 DivU64x32 ( IN UINT64 Dividend, IN UINTN Divisor, OUT UINTN *Remainder OPTIONAL ) // divide 64bit by 32bit and get a 64bit result // N.B. only works for 31bit divisors!! { if (Remainder) *Remainder = Dividend % Divisor; return Dividend / Divisor; } ncroxon-gnu-efi-157d47c/lib/aarch64/setjmp.S000066400000000000000000000027311471215650600205260ustar00rootroot00000000000000/* * Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved. * This program and the accompanying materials are licensed and made available * under the terms and conditions of the BSD License which accompanies this * distribution. The full text of the license may be found at * http://opensource.org/licenses/bsd-license.php. * * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR * IMPLIED. */ .text .p2align 3 #define GPR_LAYOUT \ REG_PAIR (x19, x20, 0); \ REG_PAIR (x21, x22, 16); \ REG_PAIR (x23, x24, 32); \ REG_PAIR (x25, x26, 48); \ REG_PAIR (x27, x28, 64); \ REG_PAIR (x29, x30, 80); \ REG_ONE (x16, 96) #define FPR_LAYOUT \ REG_PAIR(d8, d9, 112); \ REG_PAIR(d10, d11, 128); \ REG_PAIR(d12, d13, 144); \ REG_PAIR(d14, d15, 160); #define REG_PAIR(REG1, REG2, OFFS) stp REG1, REG2, [x0, OFFS] #define REG_ONE(REG1, OFFS) str REG1, [x0, OFFS] .globl setjmp .type setjmp, @function setjmp: mov x16, sp GPR_LAYOUT FPR_LAYOUT mov w0, #0 ret #undef REG_PAIR #undef REG_ONE #define REG_PAIR(REG1, REG2, OFFS) ldp REG1, REG2, [x0, OFFS] #define REG_ONE(REG1, OFFS) ldr REG1, [x0, OFFS] .globl longjmp .type longjmp, @function longjmp: GPR_LAYOUT FPR_LAYOUT mov sp, x16 cmp w1, #0 mov w0, #1 csel w0, w1, w0, ne br x30 #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/arm/000077500000000000000000000000001471215650600164245ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/lib/arm/div.S000066400000000000000000000074511471215650600173410ustar00rootroot00000000000000#------------------------------------------------------------------------------ # # Copyright (c) 2011, ARM. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # #------------------------------------------------------------------------------ #include "edk2asm.h" .text .align 2 GCC_ASM_EXPORT(__aeabi_uidiv) GCC_ASM_EXPORT(__aeabi_uidivmod) GCC_ASM_EXPORT(__aeabi_idiv) GCC_ASM_EXPORT(__aeabi_idivmod) # AREA Math, CODE, READONLY # #UINT32 #EFIAPI #__aeabi_uidivmode ( # IN UINT32 Dividen # IN UINT32 Divisor # ); # ASM_PFX(__aeabi_uidiv): ASM_PFX(__aeabi_uidivmod): rsbs r12, r1, r0, LSR #4 mov r2, #0 bcc ASM_PFX(__arm_div4) rsbs r12, r1, r0, LSR #8 bcc ASM_PFX(__arm_div8) mov r3, #0 b ASM_PFX(__arm_div_large) # #INT32 #EFIAPI #__aeabi_idivmode ( # IN INT32 Dividen # IN INT32 Divisor # ); # ASM_PFX(__aeabi_idiv): ASM_PFX(__aeabi_idivmod): orrs r12, r0, r1 bmi ASM_PFX(__arm_div_negative) rsbs r12, r1, r0, LSR #1 mov r2, #0 bcc ASM_PFX(__arm_div1) rsbs r12, r1, r0, LSR #4 bcc ASM_PFX(__arm_div4) rsbs r12, r1, r0, LSR #8 bcc ASM_PFX(__arm_div8) mov r3, #0 b ASM_PFX(__arm_div_large) ASM_PFX(__arm_div8): rsbs r12, r1, r0, LSR #7 subcs r0, r0, r1, LSL #7 adc r2, r2, r2 rsbs r12, r1, r0,LSR #6 subcs r0, r0, r1, LSL #6 adc r2, r2, r2 rsbs r12, r1, r0, LSR #5 subcs r0, r0, r1, LSL #5 adc r2, r2, r2 rsbs r12, r1, r0, LSR #4 subcs r0, r0, r1, LSL #4 adc r2, r2, r2 ASM_PFX(__arm_div4): rsbs r12, r1, r0, LSR #3 subcs r0, r0, r1, LSL #3 adc r2, r2, r2 rsbs r12, r1, r0, LSR #2 subcs r0, r0, r1, LSL #2 adcs r2, r2, r2 rsbs r12, r1, r0, LSR #1 subcs r0, r0, r1, LSL #1 adc r2, r2, r2 ASM_PFX(__arm_div1): subs r1, r0, r1 movcc r1, r0 adc r0, r2, r2 bx r14 ASM_PFX(__arm_div_negative): ands r2, r1, #0x80000000 rsbmi r1, r1, #0 eors r3, r2, r0, ASR #32 rsbcs r0, r0, #0 rsbs r12, r1, r0, LSR #4 bcc label1 rsbs r12, r1, r0, LSR #8 bcc label2 ASM_PFX(__arm_div_large): lsl r1, r1, #6 rsbs r12, r1, r0, LSR #8 orr r2, r2, #0xfc000000 bcc label2 lsl r1, r1, #6 rsbs r12, r1, r0, LSR #8 orr r2, r2, #0x3f00000 bcc label2 lsl r1, r1, #6 rsbs r12, r1, r0, LSR #8 orr r2, r2, #0xfc000 orrcs r2, r2, #0x3f00 lslcs r1, r1, #6 rsbs r12, r1, #0 bcs ASM_PFX(__aeabi_idiv0) label3: lsrcs r1, r1, #6 label2: rsbs r12, r1, r0, LSR #7 subcs r0, r0, r1, LSL #7 adc r2, r2, r2 rsbs r12, r1, r0, LSR #6 subcs r0, r0, r1, LSL #6 adc r2, r2, r2 rsbs r12, r1, r0, LSR #5 subcs r0, r0, r1, LSL #5 adc r2, r2, r2 rsbs r12, r1, r0, LSR #4 subcs r0, r0, r1, LSL #4 adc r2, r2, r2 label1: rsbs r12, r1, r0, LSR #3 subcs r0, r0, r1, LSL #3 adc r2, r2, r2 rsbs r12, r1, r0, LSR #2 subcs r0, r0, r1, LSL #2 adcs r2, r2, r2 bcs label3 rsbs r12, r1, r0, LSR #1 subcs r0, r0, r1, LSL #1 adc r2, r2, r2 subs r1, r0, r1 movcc r1, r0 adc r0, r2, r2 asrs r3, r3, #31 rsbmi r0, r0, #0 rsbcs r1, r1, #0 bx r14 @ What to do about division by zero? For now, just return. ASM_PFX(__aeabi_idiv0): bx r14 #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/arm/edk2asm.h000066400000000000000000000001331471215650600201200ustar00rootroot00000000000000 #define ASM_PFX(x) x #define GCC_ASM_EXPORT(x) \ .globl x ; \ .type x, %function ncroxon-gnu-efi-157d47c/lib/arm/efi_stub.S000066400000000000000000000002141471215650600203450ustar00rootroot00000000000000/* This stub is a stub to make the build happy */ #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/arm/initplat.c000066400000000000000000000020021471215650600204060ustar00rootroot00000000000000/* * Copyright (C) 2014 Linaro Ltd. * Author: Ard Biesheuvel * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #include "lib.h" VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle EFI_UNUSED, IN EFI_SYSTEM_TABLE *SystemTable EFI_UNUSED ) { } #ifdef __GNUC__ void __div0(void) { // TODO handle divide by zero fault while (1); } #endif ncroxon-gnu-efi-157d47c/lib/arm/ldivmod.S000066400000000000000000000031111471215650600202020ustar00rootroot00000000000000//------------------------------------------------------------------------------ // // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
// // This program and the accompanying materials // are licensed and made available under the terms and conditions of the BSD License // which accompanies this distribution. The full text of the license may be found at // http://opensource.org/licenses/bsd-license.php // // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // //------------------------------------------------------------------------------ #include "edk2asm.h" .text .align 2 GCC_ASM_EXPORT(__aeabi_ldivmod) // // A pair of (unsigned) long longs is returned in {{r0, r1}, {r2, r3}}, // the quotient in {r0, r1}, and the remainder in {r2, r3}. // //__value_in_regs lldiv_t //EFIAPI //__aeabi_ldivmod ( // IN UINT64 Dividen // IN UINT64 Divisor // )// // ASM_PFX(__aeabi_ldivmod): push {r4,lr} asrs r4,r1,#1 eor r4,r4,r3,LSR #1 bpl L_Test1 rsbs r0,r0,#0 rsc r1,r1,#0 L_Test1: tst r3,r3 bpl L_Test2 rsbs r2,r2,#0 rsc r3,r3,#0 L_Test2: bl ASM_PFX(__aeabi_uldivmod) tst r4,#0x40000000 beq L_Test3 rsbs r0,r0,#0 rsc r1,r1,#0 L_Test3: tst r4,#0x80000000 beq L_Exit rsbs r2,r2,#0 rsc r3,r3,#0 L_Exit: pop {r4,pc} #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/arm/llsl.S000066400000000000000000000021651471215650600175220ustar00rootroot00000000000000#------------------------------------------------------------------------------ # # Copyright (c) 2013, ARM. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # #------------------------------------------------------------------------------ #include "edk2asm.h" .text .align 2 GCC_ASM_EXPORT(__aeabi_llsl) # #VOID #EFIAPI #__aeabi_llsl ( # IN VOID *Destination, # IN VOID *Source, # IN UINT32 Size # ); # ASM_PFX(__aeabi_llsl): subs r3,r2,#0x20 bpl 1f rsb r3,r2,#0x20 lsl r1,r1,r2 orr r1,r1,r0,lsr r3 lsl r0,r0,r2 bx lr 1: lsl r1,r0,r3 mov r0,#0 bx lr #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/arm/llsr.S000066400000000000000000000021651471215650600175300ustar00rootroot00000000000000#------------------------------------------------------------------------------ # # Copyright (c) 2013, ARM. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # #------------------------------------------------------------------------------ #include "edk2asm.h" .text .align 2 GCC_ASM_EXPORT(__aeabi_llsr) # #VOID #EFIAPI #__aeabi_llsr ( # IN VOID *Destination, # IN VOID *Source, # IN UINT32 Size # ); # ASM_PFX(__aeabi_llsr): subs r3,r2,#0x20 bpl 1f rsb r3,r2,#0x20 lsr r0,r0,r2 orr r0,r0,r1,lsl r3 lsr r1,r1,r2 bx lr 1: lsr r0,r1,r3 mov r1,#0 bx lr #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/arm/math.c000066400000000000000000000033401471215650600175210ustar00rootroot00000000000000/* * Copyright (C) 2014 Linaro Ltd. * Author: Ard Biesheuvel * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #include "lib.h" UINT64 LShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Left shift 64bit by 32bit and get a 64bit result { return Operand << Count; } UINT64 RShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Right shift 64bit by 32bit and get a 64bit result { return Operand >> Count; } UINT64 MultU64x32 ( IN UINT64 Multiplicand, IN UINTN Multiplier ) // Multiply 64bit by 32bit and get a 64bit result { return Multiplicand * Multiplier; } UINT64 DivU64x32 ( IN UINT64 Dividend, IN UINTN Divisor, OUT UINTN *Remainder OPTIONAL ) { /* * GCC turns a division into a multiplication and shift with precalculated * constants if the divisor is constant and the dividend fits into a 32 bit * variable. Otherwise, it will turn this into calls into the 32-bit div * library functions. */ if (Remainder) *Remainder = Dividend % Divisor; return Dividend / Divisor; } ncroxon-gnu-efi-157d47c/lib/arm/mullu.S000066400000000000000000000020251471215650600177050ustar00rootroot00000000000000#------------------------------------------------------------------------------ # # Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # #------------------------------------------------------------------------------ #include "edk2asm.h" .text GCC_ASM_EXPORT(__aeabi_lmul) # #INT64 #EFIAPI #__aeabi_lmul ( # IN INT64 Multiplicand # IN INT64 Multiplier # ); # ASM_PFX(__aeabi_lmul): stmdb sp!, {lr} mov lr, r0 umull r0, ip, r2, lr mla r1, r2, r1, ip mla r1, r3, lr, r1 ldmia sp!, {pc} #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/arm/setjmp.S000066400000000000000000000014321471215650600200520ustar00rootroot00000000000000/* * Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved. * This program and the accompanying materials are licensed and made * available under the terms and conditions of the BSD License which * accompanies this distribution. The full text of the license may * be found at http://opensource.org/licenses/bsd-license.php. * * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" * BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER * EXPRESS OR IMPLIED. */ .text .arm .globl setjmp .type setjmp, %function setjmp: mov r3, r13 stmia r0, {r3-r12,r14} eor r0, r0, r0 bx lr .globl longjmp .type longjmp, %function longjmp: ldmia r0, {r3-r12,r14} #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/arm/uldiv.S000066400000000000000000000157241471215650600177040ustar00rootroot00000000000000//------------------------------------------------------------------------------ // // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
// // This program and the accompanying materials // are licensed and made available under the terms and conditions of the BSD License // which accompanies this distribution. The full text of the license may be found at // http://opensource.org/licenses/bsd-license.php // // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // //------------------------------------------------------------------------------ #include "edk2asm.h" .text .align 2 GCC_ASM_EXPORT(__aeabi_uldivmod) // //UINT64 //EFIAPI //__aeabi_uldivmod ( // IN UINT64 Dividend // IN UINT64 Divisor // ) // ASM_PFX(__aeabi_uldivmod): stmdb sp!, {r4, r5, r6, lr} mov r4, r1 mov r5, r0 mov r6, #0 // 0x0 orrs ip, r3, r2, lsr #31 bne ASM_PFX(__aeabi_uldivmod_label1) tst r2, r2 beq ASM_PFX(_ll_div0) movs ip, r2, lsr #15 addeq r6, r6, #16 // 0x10 mov ip, r2, lsl r6 movs lr, ip, lsr #23 moveq ip, ip, lsl #8 addeq r6, r6, #8 // 0x8 movs lr, ip, lsr #27 moveq ip, ip, lsl #4 addeq r6, r6, #4 // 0x4 movs lr, ip, lsr #29 moveq ip, ip, lsl #2 addeq r6, r6, #2 // 0x2 movs lr, ip, lsr #30 moveq ip, ip, lsl #1 addeq r6, r6, #1 // 0x1 b ASM_PFX(_ll_udiv_small) ASM_PFX(__aeabi_uldivmod_label1): tst r3, #-2147483648 // 0x80000000 bne ASM_PFX(__aeabi_uldivmod_label2) movs ip, r3, lsr #15 addeq r6, r6, #16 // 0x10 mov ip, r3, lsl r6 movs lr, ip, lsr #23 moveq ip, ip, lsl #8 addeq r6, r6, #8 // 0x8 movs lr, ip, lsr #27 moveq ip, ip, lsl #4 addeq r6, r6, #4 // 0x4 movs lr, ip, lsr #29 moveq ip, ip, lsl #2 addeq r6, r6, #2 // 0x2 movs lr, ip, lsr #30 addeq r6, r6, #1 // 0x1 rsb r3, r6, #32 // 0x20 moveq ip, ip, lsl #1 orr ip, ip, r2, lsr r3 mov lr, r2, lsl r6 b ASM_PFX(_ll_udiv_big) ASM_PFX(__aeabi_uldivmod_label2): mov ip, r3 mov lr, r2 b ASM_PFX(_ll_udiv_ginormous) ASM_PFX(_ll_udiv_small): cmp r4, ip, lsl #1 mov r3, #0 // 0x0 subcs r4, r4, ip, lsl #1 addcs r3, r3, #2 // 0x2 cmp r4, ip subcs r4, r4, ip adcs r3, r3, #0 // 0x0 add r2, r6, #32 // 0x20 cmp r2, #32 // 0x20 rsb ip, ip, #0 // 0x0 bcc ASM_PFX(_ll_udiv_small_label1) orrs r0, r4, r5, lsr #30 moveq r4, r5 moveq r5, #0 // 0x0 subeq r2, r2, #32 // 0x20 ASM_PFX(_ll_udiv_small_label1): mov r1, #0 // 0x0 cmp r2, #16 // 0x10 bcc ASM_PFX(_ll_udiv_small_label2) movs r0, r4, lsr #14 moveq r4, r4, lsl #16 addeq r1, r1, #16 // 0x10 ASM_PFX(_ll_udiv_small_label2): sub lr, r2, r1 cmp lr, #8 // 0x8 bcc ASM_PFX(_ll_udiv_small_label3) movs r0, r4, lsr #22 moveq r4, r4, lsl #8 addeq r1, r1, #8 // 0x8 ASM_PFX(_ll_udiv_small_label3): rsb r0, r1, #32 // 0x20 sub r2, r2, r1 orr r4, r4, r5, lsr r0 mov r5, r5, lsl r1 cmp r2, #1 // 0x1 bcc ASM_PFX(_ll_udiv_small_label5) sub r2, r2, #1 // 0x1 and r0, r2, #7 // 0x7 eor r0, r0, #7 // 0x7 adds r0, r0, r0, lsl #1 add pc, pc, r0, lsl #2 nop // (mov r0,r0) ASM_PFX(_ll_udiv_small_label4): adcs r5, r5, r5 adcs r4, ip, r4, lsl #1 rsbcc r4, ip, r4 adcs r5, r5, r5 adcs r4, ip, r4, lsl #1 rsbcc r4, ip, r4 adcs r5, r5, r5 adcs r4, ip, r4, lsl #1 rsbcc r4, ip, r4 adcs r5, r5, r5 adcs r4, ip, r4, lsl #1 rsbcc r4, ip, r4 adcs r5, r5, r5 adcs r4, ip, r4, lsl #1 rsbcc r4, ip, r4 adcs r5, r5, r5 adcs r4, ip, r4, lsl #1 rsbcc r4, ip, r4 adcs r5, r5, r5 adcs r4, ip, r4, lsl #1 rsbcc r4, ip, r4 adcs r5, r5, r5 adcs r4, ip, r4, lsl #1 sub r2, r2, #8 // 0x8 tst r2, r2 rsbcc r4, ip, r4 bpl ASM_PFX(_ll_udiv_small_label4) ASM_PFX(_ll_udiv_small_label5): mov r2, r4, lsr r6 bic r4, r4, r2, lsl r6 adcs r0, r5, r5 adc r1, r4, r4 add r1, r1, r3, lsl r6 mov r3, #0 // 0x0 ldmia sp!, {r4, r5, r6, pc} ASM_PFX(_ll_udiv_big): subs r0, r5, lr mov r3, #0 // 0x0 sbcs r1, r4, ip movcs r5, r0 movcs r4, r1 adcs r3, r3, #0 // 0x0 subs r0, r5, lr sbcs r1, r4, ip movcs r5, r0 movcs r4, r1 adcs r3, r3, #0 // 0x0 subs r0, r5, lr sbcs r1, r4, ip movcs r5, r0 movcs r4, r1 adcs r3, r3, #0 // 0x0 mov r1, #0 // 0x0 rsbs lr, lr, #0 // 0x0 rsc ip, ip, #0 // 0x0 cmp r6, #16 // 0x10 bcc ASM_PFX(_ll_udiv_big_label1) movs r0, r4, lsr #14 moveq r4, r4, lsl #16 addeq r1, r1, #16 // 0x10 ASM_PFX(_ll_udiv_big_label1): sub r2, r6, r1 cmp r2, #8 // 0x8 bcc ASM_PFX(_ll_udiv_big_label2) movs r0, r4, lsr #22 moveq r4, r4, lsl #8 addeq r1, r1, #8 // 0x8 ASM_PFX(_ll_udiv_big_label2): rsb r0, r1, #32 // 0x20 sub r2, r6, r1 orr r4, r4, r5, lsr r0 mov r5, r5, lsl r1 cmp r2, #1 // 0x1 bcc ASM_PFX(_ll_udiv_big_label4) sub r2, r2, #1 // 0x1 and r0, r2, #3 // 0x3 rsb r0, r0, #3 // 0x3 adds r0, r0, r0, lsl #1 add pc, pc, r0, lsl #3 nop // (mov r0,r0) ASM_PFX(_ll_udiv_big_label3): adcs r5, r5, r5 adcs r4, r4, r4 adcs r0, lr, r5 adcs r1, ip, r4 movcs r5, r0 movcs r4, r1 adcs r5, r5, r5 adcs r4, r4, r4 adcs r0, lr, r5 adcs r1, ip, r4 movcs r5, r0 movcs r4, r1 adcs r5, r5, r5 adcs r4, r4, r4 adcs r0, lr, r5 adcs r1, ip, r4 movcs r5, r0 movcs r4, r1 sub r2, r2, #4 // 0x4 adcs r5, r5, r5 adcs r4, r4, r4 adcs r0, lr, r5 adcs r1, ip, r4 tst r2, r2 movcs r5, r0 movcs r4, r1 bpl ASM_PFX(_ll_udiv_big_label3) ASM_PFX(_ll_udiv_big_label4): mov r1, #0 // 0x0 mov r2, r5, lsr r6 bic r5, r5, r2, lsl r6 adcs r0, r5, r5 adc r1, r1, #0 // 0x0 movs lr, r3, lsl r6 mov r3, r4, lsr r6 bic r4, r4, r3, lsl r6 adc r1, r1, #0 // 0x0 adds r0, r0, lr orr r2, r2, r4, ror r6 adc r1, r1, #0 // 0x0 ldmia sp!, {r4, r5, r6, pc} ASM_PFX(_ll_udiv_ginormous): subs r2, r5, lr mov r1, #0 // 0x0 sbcs r3, r4, ip adc r0, r1, r1 movcc r2, r5 movcc r3, r4 ldmia sp!, {r4, r5, r6, pc} ASM_PFX(_ll_div0): ldmia sp!, {r4, r5, r6, lr} mov r0, #0 // 0x0 mov r1, #0 // 0x0 b ASM_PFX(__aeabi_ldiv0) ASM_PFX(__aeabi_ldiv0): bx r14 #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/boxdraw.c000066400000000000000000000117131471215650600174620ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: BoxDraw.c Abstract: Lib functions to support Box Draw Unicode code pages. Revision History --*/ #include "lib.h" typedef struct { CHAR16 Unicode; CHAR8 PcAnsi; CHAR8 Ascii; } UNICODE_TO_CHAR; // // This list is used to define the valid extend chars. // It also provides a mapping from Unicode to PCANSI or // ASCII. The ASCII mapping we just made up. // // STATIC UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] = { { BOXDRAW_HORIZONTAL, 0xc4, u'-'}, { BOXDRAW_VERTICAL, 0xb3, u'|'}, { BOXDRAW_DOWN_RIGHT, 0xda, u'/'}, { BOXDRAW_DOWN_LEFT, 0xbf, u'\\'}, { BOXDRAW_UP_RIGHT, 0xc0, u'\\'}, { BOXDRAW_UP_LEFT, 0xd9, u'/'}, { BOXDRAW_VERTICAL_RIGHT, 0xc3, u'|'}, { BOXDRAW_VERTICAL_LEFT, 0xb4, u'|'}, { BOXDRAW_DOWN_HORIZONTAL, 0xc2, u'+'}, { BOXDRAW_UP_HORIZONTAL, 0xc1, u'+'}, { BOXDRAW_VERTICAL_HORIZONTAL, 0xc5, u'+'}, { BOXDRAW_DOUBLE_HORIZONTAL, 0xcd, u'-'}, { BOXDRAW_DOUBLE_VERTICAL, 0xba, u'|'}, { BOXDRAW_DOWN_RIGHT_DOUBLE, 0xd5, u'/'}, { BOXDRAW_DOWN_DOUBLE_RIGHT, 0xd6, u'/'}, { BOXDRAW_DOUBLE_DOWN_RIGHT, 0xc9, u'/'}, { BOXDRAW_DOWN_LEFT_DOUBLE, 0xb8, u'\\'}, { BOXDRAW_DOWN_DOUBLE_LEFT, 0xb7, u'\\'}, { BOXDRAW_DOUBLE_DOWN_LEFT, 0xbb, u'\\'}, { BOXDRAW_UP_RIGHT_DOUBLE, 0xd4, u'\\'}, { BOXDRAW_UP_DOUBLE_RIGHT, 0xd3, u'\\'}, { BOXDRAW_DOUBLE_UP_RIGHT, 0xc8, u'\\'}, { BOXDRAW_UP_LEFT_DOUBLE, 0xbe, u'/'}, { BOXDRAW_UP_DOUBLE_LEFT, 0xbd, u'/'}, { BOXDRAW_DOUBLE_UP_LEFT, 0xbc, u'/'}, { BOXDRAW_VERTICAL_RIGHT_DOUBLE, 0xc6, u'|'}, { BOXDRAW_VERTICAL_DOUBLE_RIGHT, 0xc7, u'|'}, { BOXDRAW_DOUBLE_VERTICAL_RIGHT, 0xcc, u'|'}, { BOXDRAW_VERTICAL_LEFT_DOUBLE, 0xb5, u'|'}, { BOXDRAW_VERTICAL_DOUBLE_LEFT, 0xb6, u'|'}, { BOXDRAW_DOUBLE_VERTICAL_LEFT, 0xb9, u'|'}, { BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 0xd1, u'+'}, { BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 0xd2, u'+'}, { BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 0xcb, u'+'}, { BOXDRAW_UP_HORIZONTAL_DOUBLE, 0xcf, u'+'}, { BOXDRAW_UP_DOUBLE_HORIZONTAL, 0xd0, u'+'}, { BOXDRAW_DOUBLE_UP_HORIZONTAL, 0xca, u'+'}, { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, u'+'}, { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, u'+'}, { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, u'+'}, { BLOCKELEMENT_FULL_BLOCK, 0xdb, u'*'}, { BLOCKELEMENT_LIGHT_SHADE, 0xb0, u'+'}, { GEOMETRICSHAPE_UP_TRIANGLE, 0x1e, u'^'}, { GEOMETRICSHAPE_RIGHT_TRIANGLE, 0x10, u'>'}, { GEOMETRICSHAPE_DOWN_TRIANGLE, 0x1f, u'v'}, { GEOMETRICSHAPE_LEFT_TRIANGLE, 0x11, u'<'}, /* BugBug: Left Arrow is an ESC. We can not make it print on a PCANSI terminal. If we can make left arrow come out on PC ANSI we can add it back. { ARROW_LEFT, 0x1b, u'<'}, */ { ARROW_UP, 0x18, u'^'}, /* BugBut: Took out left arrow so right has to go too. { ARROW_RIGHT, 0x1a, u'>'}, */ { ARROW_DOWN, 0x19, u'v'}, { 0x0000, 0x00, u'\0' } }; BOOLEAN LibIsValidTextGraphics ( IN CHAR16 Graphic, OUT CHAR8 *PcAnsi, OPTIONAL OUT CHAR8 *Ascii OPTIONAL ) /*++ Routine Description: Detects if a Unicode char is for Box Drawing text graphics. Arguments: Grphic - Unicode char to test. PcAnsi - Optional pointer to return PCANSI equivalent of Graphic. Asci - Optional pointer to return Ascii equivalent of Graphic. Returns: TRUE if Gpaphic is a supported Unicode Box Drawing character. --*/{ UNICODE_TO_CHAR *Table; if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) { // // Unicode drawing code charts are all in the 0x25xx range, // arrows are 0x21xx // return FALSE; } for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) { if (Graphic == Table->Unicode) { if (PcAnsi) { *PcAnsi = Table->PcAnsi; } if (Ascii) { *Ascii = Table->Ascii; } return TRUE; } } return FALSE; } BOOLEAN IsValidAscii ( IN CHAR16 Ascii ) { if ((Ascii >= 0x20) && (Ascii <= 0x7f)) { return TRUE; } return FALSE; } BOOLEAN IsValidEfiCntlChar ( IN CHAR16 c ) { if (c == CHAR_NULL || c == CHAR_BACKSPACE || c == CHAR_LINEFEED || c == CHAR_CARRIAGE_RETURN) { return TRUE; } return FALSE; } ncroxon-gnu-efi-157d47c/lib/cmdline.c000066400000000000000000000074151471215650600174330ustar00rootroot00000000000000#include "lib.h" #include "efiprot.h" #include "efishell.h" #include "efishellintf.h" #ifndef MAX_ARGV_CONTENTS_SIZE # define MAX_CMDLINE_SIZE 1024 #endif #ifndef MAX_ARGC # define MAX_CMDLINE_ARGC 32 #endif /* Parse LoadedImage options area, called only in case the regular shell protos are not available. Format of LoadedImage->LoadOptions appears to be a single-space-separated list of args (looks like the shell already pre-parses the input, it apparently folds several consecutive spaces into one): argv[0] space argv[1] (etc.) argv[N] space \0 cwd \0 other data For safety, we support the trailing \0 without a space before, as well as several consecutive spaces (-> several args). */ static INTN GetShellArgcArgvFromLoadedImage( EFI_HANDLE ImageHandle, CHAR16 **ResultArgv[] ) { EFI_STATUS Status; void *LoadedImage = NULL; static CHAR16 ArgvContents[MAX_CMDLINE_SIZE]; static CHAR16 *Argv[MAX_CMDLINE_ARGC], *ArgStart, *c; UINTN Argc = 0, BufLen; Status = uefi_call_wrapper(BS->OpenProtocol, 6, ImageHandle, &LoadedImageProtocol, &LoadedImage, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); if (EFI_ERROR(Status)) return -1; BufLen = ((EFI_LOADED_IMAGE *)LoadedImage)->LoadOptionsSize; if (BufLen < 2) /* We are expecting at least a \0 */ return -1; else if (BufLen > sizeof(ArgvContents)) BufLen = sizeof(ArgvContents); CopyMem(ArgvContents, ((EFI_LOADED_IMAGE *)LoadedImage)->LoadOptions, BufLen); ArgvContents[MAX_CMDLINE_SIZE - 1] = u'\0'; for (c = ArgStart = ArgvContents ; *c != u'\0' ; ++c) { if (*c == u' ') { *c = u'\0'; if (Argc < MAX_CMDLINE_ARGC) Argv[Argc++] = ArgStart; ArgStart = c + 1; } } if ((*ArgStart != u'\0') && (Argc < MAX_CMDLINE_ARGC)) Argv[Argc++] = ArgStart; // Print(u"Got argc/argv from loaded image proto\n"); *ResultArgv = Argv; return Argc; } INTN GetShellArgcArgv(EFI_HANDLE ImageHandle, CHAR16 **Argv[]) { // Code inspired from EDK2's // ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.c (BSD) EFI_STATUS Status; static const EFI_GUID ShellInterfaceProtocolGuid = SHELL_INTERFACE_PROTOCOL_GUID; EFI_SHELL_PARAMETERS_PROTOCOL *EfiShellParametersProtocol = NULL; EFI_SHELL_INTERFACE *EfiShellInterfaceProtocol = NULL; Status = uefi_call_wrapper(BS->OpenProtocol, 6, ImageHandle, (EFI_GUID*)&ShellParametersProtocolGuid, (VOID **)&EfiShellParametersProtocol, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); if (!EFI_ERROR(Status)) { // use shell 2.0 interface // Print(u"Got argc/argv from shell intf proto\n"); *Argv = EfiShellParametersProtocol->Argv; return EfiShellParametersProtocol->Argc; } // try to get shell 1.0 interface instead. Status = uefi_call_wrapper(BS->OpenProtocol, 6, ImageHandle, (EFI_GUID*)&ShellInterfaceProtocolGuid, (VOID **)&EfiShellInterfaceProtocol, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); if (!EFI_ERROR(Status)) { // Print(u"Got argc/argv from shell params proto\n"); *Argv = EfiShellInterfaceProtocol->Argv; return EfiShellInterfaceProtocol->Argc; } // shell 1.0 and 2.0 interfaces failed return GetShellArgcArgvFromLoadedImage(ImageHandle, Argv); } ncroxon-gnu-efi-157d47c/lib/console.c000066400000000000000000000040441471215650600174550ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: console.c Abstract: Revision History --*/ #include "lib.h" VOID Output ( IN CHAR16 *Str ) // Write a string to the console at the current cursor location { uefi_call_wrapper(ST->ConOut->OutputString, 2, ST->ConOut, Str); } VOID Input ( IN CHAR16 *Prompt OPTIONAL, OUT CHAR16 *InStr, IN UINTN StrLen ) // Input a string at the current cursor location, for StrLen { IInput ( ST->ConOut, ST->ConIn, Prompt, InStr, StrLen ); } VOID IInput ( IN SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut, IN SIMPLE_INPUT_INTERFACE *ConIn, IN CHAR16 *Prompt OPTIONAL, OUT CHAR16 *InStr, IN UINTN StrLen ) // Input a string at the current cursor location, for StrLen { EFI_INPUT_KEY Key; EFI_STATUS Status; UINTN Len; if (Prompt) { ConOut->OutputString (ConOut, Prompt); } Len = 0; for (; ;) { WaitForSingleEvent (ConIn->WaitForKey, 0); Status = uefi_call_wrapper(ConIn->ReadKeyStroke, 2, ConIn, &Key); if (EFI_ERROR(Status)) { DEBUG((D_ERROR, "Input: error return from ReadKey %x\n", Status)); break; } if (Key.UnicodeChar == '\n' || Key.UnicodeChar == '\r') { break; } if (Key.UnicodeChar == '\b') { if (Len) { uefi_call_wrapper(ConOut->OutputString, 2, ConOut, u"\b \b"); Len -= 1; } continue; } if (Key.UnicodeChar >= ' ') { if (Len < StrLen-1) { InStr[Len] = Key.UnicodeChar; InStr[Len+1] = 0; uefi_call_wrapper(ConOut->OutputString, 2, ConOut, &InStr[Len]); Len += 1; } continue; } } InStr[Len] = 0; } ncroxon-gnu-efi-157d47c/lib/crc.c000066400000000000000000000127351471215650600165700ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: crc.c Abstract: CRC32 functions Revision History --*/ #include "lib.h" UINT32 CRCTable[256] = { 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D }; VOID SetCrc ( IN OUT EFI_TABLE_HEADER *Hdr ) /*++ Routine Description: Updates the CRC32 value in the table header Arguments: Hdr - The table to update Returns: None --*/ { SetCrcAltSize (Hdr->HeaderSize, Hdr); } VOID SetCrcAltSize ( IN UINTN Size, IN OUT EFI_TABLE_HEADER *Hdr ) /*++ Routine Description: Updates the CRC32 value in the table header Arguments: Hdr - The table to update Returns: None --*/ { Hdr->CRC32 = 0; Hdr->CRC32 = CalculateCrc((UINT8 *)Hdr, Size); } BOOLEAN CheckCrc ( IN UINTN MaxSize, IN OUT EFI_TABLE_HEADER *Hdr ) /*++ Routine Description: Checks the CRC32 value in the table header Arguments: Hdr - The table to check Returns: TRUE if the CRC is OK in the table --*/ { return CheckCrcAltSize (MaxSize, Hdr->HeaderSize, Hdr); } BOOLEAN CheckCrcAltSize ( IN UINTN MaxSize, IN UINTN Size, IN OUT EFI_TABLE_HEADER *Hdr ) /*++ Routine Description: Checks the CRC32 value in the table header Arguments: Hdr - The table to check Returns: TRUE if the CRC is OK in the table --*/ { UINT32 Crc; UINT32 OrgCrc; BOOLEAN f; if (Size == 0) { // // If header size is 0 CRC will pass so return FALSE here // return FALSE; } if (MaxSize && Size > MaxSize) { DEBUG((D_ERROR, "CheckCrc32: Size > MaxSize\n")); return FALSE; } // clear old crc from header OrgCrc = Hdr->CRC32; Hdr->CRC32 = 0; Crc = CalculateCrc((UINT8 *)Hdr, Size); // set restults Hdr->CRC32 = OrgCrc; // return status f = OrgCrc == (UINT32) Crc; if (!f) { DEBUG((D_ERROR, "CheckCrc32: Crc check failed\n")); } return f; } UINT32 CalculateCrc ( UINT8 *pt, UINTN Size ) { UINTN Crc; // compute crc Crc = 0xffffffff; while (Size) { Crc = (Crc >> 8) ^ CRCTable[(UINT8) Crc ^ *pt]; pt += 1; Size -= 1; } Crc = Crc ^ 0xffffffff; return (UINT32)Crc; } ncroxon-gnu-efi-157d47c/lib/ctors.S000066400000000000000000000023711471215650600171260ustar00rootroot00000000000000/* * Try to define the minimal empty init/ctor/dtor/fini_arrays so building with * older or out-of-tree linker scripts will still work. */ /* * Note that these aren't using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ #if defined(__ELF__) .section .init_array,"aw",%init_array #else .section .init_array,"aw" #endif .p2align 4, 0 .globl __init_array_start __init_array_start: .globl __init_array_end __init_array_end: #if defined(__ELF__) .section .ctors,"aw",%progbits #else .section .ctors,"aw" #endif .p2align 4, 0 .globl __CTOR_LIST__ __CTOR_LIST__: .globl __CTOR_END__ __CTOR_END__: #if defined(__ELF__) .section .dtors,"aw",%progbits #else .section .dtors,"aw" #endif .p2align 4, 0 .globl __DTOR_LIST__ __DTOR_LIST__: .globl __DTOR_END__ __DTOR_END__: #if defined(__ELF__) .section .fini_array,"aw",%fini_array #else .section .fini_array,"aw" #endif .p2align 4, 0 .globl __fini_array_start __fini_array_start: .globl __fini_array_end __fini_array_end: #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/data.c000066400000000000000000000170361471215650600167310ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: data.c Abstract: EFI library global data Revision History --*/ #include "lib.h" // // LibInitialized - TRUE once InitializeLib() is called for the first time // BOOLEAN LibInitialized = FALSE; // // ImageHandle - Current ImageHandle, as passed to InitializeLib // EFI_HANDLE LibImageHandle; // // ST - pointer to the EFI system table // EFI_SYSTEM_TABLE *ST; // // BS - pointer to the boot services table // EFI_BOOT_SERVICES *BS; // // Default pool allocation type // EFI_MEMORY_TYPE PoolAllocationType = EfiBootServicesData; // // Unicode collation functions that are in use // EFI_UNICODE_COLLATION_INTERFACE LibStubUnicodeInterface = { LibStubStriCmp, LibStubMetaiMatch, LibStubStrLwrUpr, LibStubStrLwrUpr, NULL, // FatToStr NULL, // StrToFat NULL // SupportedLanguages }; EFI_UNICODE_COLLATION_INTERFACE *UnicodeInterface = &LibStubUnicodeInterface; // // Root device path // EFI_DEVICE_PATH RootDevicePath[] = { {END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, {END_DEVICE_PATH_LENGTH,0}} }; EFI_DEVICE_PATH EndDevicePath[] = { {END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, {END_DEVICE_PATH_LENGTH, 0}} }; EFI_DEVICE_PATH EndInstanceDevicePath[] = { {END_DEVICE_PATH_TYPE, END_INSTANCE_DEVICE_PATH_SUBTYPE, {END_DEVICE_PATH_LENGTH, 0}} }; // // EFI IDs // EFI_GUID gEfiGlobalVariableGuid = EFI_GLOBAL_VARIABLE; EFI_GUID NullGuid = { 0,0,0,{0,0,0,0,0,0,0,0} }; // // Protocol IDs // EFI_GUID gEfiDevicePathProtocolGuid = EFI_DEVICE_PATH_PROTOCOL_GUID; EFI_GUID gEfiDevicePathToTextProtocolGuid = EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID; EFI_GUID gEfiDevicePathFromTextProtocolGuid = EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL_GUID; EFI_GUID gEfiDevicePathUtilitiesProtocolGuid = EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID; EFI_GUID gEfiLoadedImageProtocolGuid = EFI_LOADED_IMAGE_PROTOCOL_GUID; EFI_GUID gEfiSimpleTextInProtocolGuid = EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID; EFI_GUID gEfiSimpleTextOutProtocolGuid = EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID; EFI_GUID gEfiBlockIoProtocolGuid = EFI_BLOCK_IO_PROTOCOL_GUID; EFI_GUID gEfiBlockIo2ProtocolGuid = EFI_BLOCK_IO2_PROTOCOL_GUID; EFI_GUID gEfiDiskIoProtocolGuid = EFI_DISK_IO_PROTOCOL_GUID; EFI_GUID gEfiDiskIo2ProtocolGuid = EFI_DISK_IO2_PROTOCOL_GUID; EFI_GUID gEfiSimpleFileSystemProtocolGuid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; EFI_GUID gEfiLoadFileProtocolGuid = EFI_LOAD_FILE_PROTOCOL_GUID; EFI_GUID gEfiDeviceIoProtocolGuid = EFI_DEVICE_IO_PROTOCOL_GUID; EFI_GUID gEfiUnicodeCollationProtocolGuid = EFI_UNICODE_COLLATION_PROTOCOL_GUID; EFI_GUID gEfiSerialIoProtocolGuid = EFI_SERIAL_IO_PROTOCOL_GUID; EFI_GUID gEfiSimpleNetworkProtocolGuid = EFI_SIMPLE_NETWORK_PROTOCOL_GUID; EFI_GUID gEfiPxeBaseCodeProtocolGuid = EFI_PXE_BASE_CODE_PROTOCOL_GUID; EFI_GUID gEfiPxeBaseCodeCallbackProtocolGuid = EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_GUID; EFI_GUID gEfiNetworkInterfaceIdentifierProtocolGuid = EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_GUID; EFI_GUID gEFiUiInterfaceProtocolGuid = EFI_UI_INTERFACE_PROTOCOL_GUID; EFI_GUID gEfiPciIoProtocolGuid = EFI_PCI_IO_PROTOCOL_GUID; EFI_GUID gEfiPciRootBridgeIoProtocolGuid = EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID; EFI_GUID gEfiDriverBindingProtocolGuid = EFI_DRIVER_BINDING_PROTOCOL_GUID; EFI_GUID gEfiComponentNameProtocolGuid = EFI_COMPONENT_NAME_PROTOCOL_GUID; EFI_GUID gEfiComponentName2ProtocolGuid = EFI_COMPONENT_NAME2_PROTOCOL_GUID; EFI_GUID gEfiHashProtocolGuid = EFI_HASH_PROTOCOL_GUID; EFI_GUID gEfiPlatformDriverOverrideProtocolGuid = EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL_GUID; EFI_GUID gEfiBusSpecificDriverOverrideProtocolGuid = EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL_GUID; EFI_GUID gEfiDriverFamilyOverrideProtocolGuid = EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL_GUID; EFI_GUID gEfiEbcProtocolGuid = EFI_EBC_PROTOCOL_GUID; // // File system information IDs // EFI_GUID gEfiFileInfoGuid = EFI_FILE_INFO_ID; EFI_GUID gEfiFileSystemInfoGuid = EFI_FILE_SYSTEM_INFO_ID; EFI_GUID gEfiFileSystemVolumeLabelInfoIdGuid = EFI_FILE_SYSTEM_VOLUME_LABEL_ID; // // Multi-Processing protocol IDs. // EFI_GUID gEfiMpServicesProtocolGuid = EFI_MP_SERVICES_PROTOCOL_GUID; // // Reference implementation public protocol IDs // EFI_GUID InternalShellProtocol = INTERNAL_SHELL_GUID; EFI_GUID VariableStoreProtocol = VARIABLE_STORE_PROTOCOL; EFI_GUID LegacyBootProtocol = LEGACY_BOOT_PROTOCOL; EFI_GUID VgaClassProtocol = VGA_CLASS_DRIVER_PROTOCOL; EFI_GUID TextOutSpliterProtocol = TEXT_OUT_SPLITER_PROTOCOL; EFI_GUID ErrorOutSpliterProtocol = ERROR_OUT_SPLITER_PROTOCOL; EFI_GUID TextInSpliterProtocol = TEXT_IN_SPLITER_PROTOCOL; /* Added for GOP support */ EFI_GUID gEfiGraphicsOutputProtocolGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; EFI_GUID gEfiEdidDiscoveredProtocolGuid = EFI_EDID_DISCOVERED_PROTOCOL_GUID; EFI_GUID gEfiEdidActiveProtocolGuid = EFI_EDID_ACTIVE_PROTOCOL_GUID; EFI_GUID gEfiEdidOverrideProtocolGuid = EFI_EDID_OVERRIDE_PROTOCOL_GUID; EFI_GUID AdapterDebugProtocol = ADAPTER_DEBUG_PROTOCOL; // // Device path media protocol IDs // EFI_GUID gEfiPcAnsiGuid = EFI_PC_ANSI_GUID; EFI_GUID gEfiVT100Guid = EFI_VT_100_GUID; EFI_GUID gEfiVT100PlusGuid = EFI_VT_100_PLUS_GUID; EFI_GUID gEfiVTUTF8Guid = EFI_VT_UTF8_GUID; // // EFI GPT Partition Type GUIDs // EFI_GUID EfiPartTypeSystemPartitionGuid = EFI_PART_TYPE_EFI_SYSTEM_PART_GUID; EFI_GUID EfiPartTypeLegacyMbrGuid = EFI_PART_TYPE_LEGACY_MBR_GUID; // // Reference implementation Vendor Device Path Guids // EFI_GUID UnknownDevice = UNKNOWN_DEVICE_GUID; // // Configuration Table GUIDs // EFI_GUID MpsTableGuid = MPS_TABLE_GUID; EFI_GUID AcpiTableGuid = ACPI_TABLE_GUID; EFI_GUID gEfiSmbiosTableGuid = SMBIOS_TABLE_GUID; EFI_GUID gEfiSmbios3TableGuid = SMBIOS3_TABLE_GUID; EFI_GUID SalSystemTableGuid = SAL_SYSTEM_TABLE_GUID; EFI_GUID EfiDtbTableGuid = EFI_DTB_TABLE_GUID; // // Network protocol GUIDs // EFI_GUID Ip4ServiceBindingProtocol = EFI_IP4_SERVICE_BINDING_PROTOCOL; EFI_GUID Ip4Protocol = EFI_IP4_PROTOCOL; EFI_GUID Udp4ServiceBindingProtocol = EFI_UDP4_SERVICE_BINDING_PROTOCOL; EFI_GUID Udp4Protocol = EFI_UDP4_PROTOCOL; EFI_GUID Tcp4ServiceBindingProtocol = EFI_TCP4_SERVICE_BINDING_PROTOCOL; EFI_GUID Tcp4Protocol = EFI_TCP4_PROTOCOL; // // Pointer protocol GUIDs // EFI_GUID SimplePointerProtocol = EFI_SIMPLE_POINTER_PROTOCOL_GUID; EFI_GUID AbsolutePointerProtocol = EFI_ABSOLUTE_POINTER_PROTOCOL_GUID; // // Debugger protocol GUIDs // EFI_GUID gEfiDebugImageInfoTableGuid = EFI_DEBUG_IMAGE_INFO_TABLE_GUID; EFI_GUID gEfiDebugSupportProtocolGuid = EFI_DEBUG_SUPPORT_PROTOCOL_GUID; // // Console extension protocol GUIDs // EFI_GUID SimpleTextInputExProtocol = EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID; // // Shell protocol GUIDs // EFI_GUID ShellProtocolGuid = EFI_SHELL_PROTOCOL_GUID; EFI_GUID ShellParametersProtocolGuid = EFI_SHELL_PARAMETERS_PROTOCOL_GUID; EFI_GUID ShellDynamicCommandProtocolGuid = EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL_GUID; ncroxon-gnu-efi-157d47c/lib/debug.c000066400000000000000000000007161471215650600171030ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: debug.c Abstract: Debug library functions Revision History --*/ #include "lib.h" // // Declare runtime functions // // // // INTN DbgAssert ( IN CONST CHAR8 *FileName, IN INTN LineNo, IN CONST CHAR8 *Description ) { DbgPrint (D_ERROR, (CHAR8 *)"%EASSERT FAILED: %a(%d): %a%N\n", FileName, LineNo, Description); BREAKPOINT(); return 0; } ncroxon-gnu-efi-157d47c/lib/dpath.c000066400000000000000000000757011471215650600171230ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: dpath.c Abstract: MBR & Device Path functions Revision History 2014/04 B.Burette - updated device path text representation, conforming to UEFI specification 2.4 (dec. 2013). More specifically: - § 9.3.5: added some media types ie. Sata() - § 9.6.1.2: Acpi(PNP0A03,0) makes more sense when displayed as PciRoot(0) - § 9.6.1.5: use commas (instead of '|') between option specific parameters - § 9.6.1.6: hex values in device paths must be preceded by "0x" or "0X" --*/ #include "lib.h" #define ALIGN_SIZE(a) ((a % MIN_ALIGNMENT_SIZE) ? MIN_ALIGNMENT_SIZE - (a % MIN_ALIGNMENT_SIZE) : 0) EFI_DEVICE_PATH * DevicePathFromHandle ( IN EFI_HANDLE Handle ) { EFI_STATUS Status; EFI_DEVICE_PATH *DevicePath; Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handle, &DevicePathProtocol, (VOID*)&DevicePath); if (EFI_ERROR(Status)) { DevicePath = NULL; } return DevicePath; } EFI_DEVICE_PATH * DevicePathInstance ( IN OUT EFI_DEVICE_PATH **DevicePath, OUT UINTN *Size ) { EFI_DEVICE_PATH *Start, *Next, *DevPath; UINTN Count; DevPath = *DevicePath; Start = DevPath; if (!DevPath) { return NULL; } // // Check for end of device path type // for (Count = 0; ; Count++) { Next = NextDevicePathNode(DevPath); if (IsDevicePathEndType(DevPath)) { break; } if (Count > 01000) { // // BugBug: Debug code to catch bogus device paths // DEBUG((D_ERROR, "DevicePathInstance: DevicePath %x Size %d", *DevicePath, ((UINT8 *) DevPath) - ((UINT8 *) Start) )); DumpHex (0, 0, ((UINT8 *) DevPath) - ((UINT8 *) Start), Start); break; } DevPath = Next; } ASSERT (DevicePathSubType(DevPath) == END_ENTIRE_DEVICE_PATH_SUBTYPE || DevicePathSubType(DevPath) == END_INSTANCE_DEVICE_PATH_SUBTYPE); // // Set next position // if (DevicePathSubType(DevPath) == END_ENTIRE_DEVICE_PATH_SUBTYPE) { Next = NULL; } *DevicePath = Next; // // Return size and start of device path instance // *Size = ((UINT8 *) DevPath) - ((UINT8 *) Start); return Start; } UINTN DevicePathInstanceCount ( IN EFI_DEVICE_PATH *DevicePath ) { UINTN Count, Size; Count = 0; while (DevicePathInstance(&DevicePath, &Size)) { Count += 1; } return Count; } EFI_DEVICE_PATH * AppendDevicePath ( IN EFI_DEVICE_PATH *Src1, IN EFI_DEVICE_PATH *Src2 ) // Src1 may have multiple "instances" and each instance is appended // Src2 is appended to each instance is Src1. (E.g., it's possible // to append a new instance to the complete device path by passing // it in Src2) { UINTN Src1Size, Src1Inst, Src2Size, Size; EFI_DEVICE_PATH *Dst, *Inst; UINT8 *DstPos; // // If there's only 1 path, just duplicate it // if (!Src1) { ASSERT (!IsDevicePathUnpacked (Src2)); return DuplicateDevicePath (Src2); } if (!Src2) { ASSERT (!IsDevicePathUnpacked (Src1)); return DuplicateDevicePath (Src1); } // // Verify we're not working with unpacked paths // // ASSERT (!IsDevicePathUnpacked (Src1)); // ASSERT (!IsDevicePathUnpacked (Src2)); // // Append Src2 to every instance in Src1 // Src1Size = DevicePathSize(Src1); Src1Inst = DevicePathInstanceCount(Src1); Src2Size = DevicePathSize(Src2); Size = Src1Size * Src1Inst + Src2Size; Dst = AllocatePool (Size); if (Dst) { DstPos = (UINT8 *) Dst; // // Copy all device path instances // while ((Inst = DevicePathInstance (&Src1, &Size))) { CopyMem(DstPos, Inst, Size); DstPos += Size; CopyMem(DstPos, Src2, Src2Size); DstPos += Src2Size; CopyMem(DstPos, EndInstanceDevicePath, sizeof(EFI_DEVICE_PATH)); DstPos += sizeof(EFI_DEVICE_PATH); } // Change last end marker DstPos -= sizeof(EFI_DEVICE_PATH); CopyMem(DstPos, EndDevicePath, sizeof(EFI_DEVICE_PATH)); } return Dst; } EFI_DEVICE_PATH * AppendDevicePathNode ( IN EFI_DEVICE_PATH *Src1, IN EFI_DEVICE_PATH *Src2 ) // Src1 may have multiple "instances" and each instance is appended // Src2 is a signal device path node (without a terminator) that is // appended to each instance is Src1. { EFI_DEVICE_PATH *Temp, *Eop; UINTN Length; // // Build a Src2 that has a terminator on it // Length = DevicePathNodeLength(Src2); Temp = AllocatePool (Length + sizeof(EFI_DEVICE_PATH)); if (!Temp) { return NULL; } CopyMem (Temp, Src2, Length); Eop = NextDevicePathNode(Temp); SetDevicePathEndNode(Eop); // // Append device paths // Src1 = AppendDevicePath (Src1, Temp); FreePool (Temp); return Src1; } EFI_DEVICE_PATH * FileDevicePath ( IN EFI_HANDLE Device OPTIONAL, IN CHAR16 *FileName ) /*++ N.B. Results are allocated from pool. The caller must FreePool the resulting device path structure --*/ { UINTN Size; FILEPATH_DEVICE_PATH *FilePath; EFI_DEVICE_PATH *Eop, *DevicePath; Size = StrSize(FileName); FilePath = AllocateZeroPool (Size + SIZE_OF_FILEPATH_DEVICE_PATH + sizeof(EFI_DEVICE_PATH)); DevicePath = NULL; if (FilePath) { // // Build a file path // FilePath->Header.Type = MEDIA_DEVICE_PATH; FilePath->Header.SubType = MEDIA_FILEPATH_DP; SetDevicePathNodeLength (&FilePath->Header, Size + SIZE_OF_FILEPATH_DEVICE_PATH); CopyMem (FilePath->PathName, FileName, Size); Eop = NextDevicePathNode(&FilePath->Header); SetDevicePathEndNode(Eop); // // Append file path to device's device path // DevicePath = (EFI_DEVICE_PATH *) FilePath; if (Device) { DevicePath = AppendDevicePath ( DevicePathFromHandle(Device), DevicePath ); FreePool(FilePath); } } return DevicePath; } UINTN DevicePathSize ( IN EFI_DEVICE_PATH *DevPath ) { EFI_DEVICE_PATH *Start; // // Search for the end of the device path structure // Start = DevPath; while (!IsDevicePathEnd(DevPath)) { DevPath = NextDevicePathNode(DevPath); } // // Compute the size // return ((UINTN) DevPath - (UINTN) Start) + sizeof(EFI_DEVICE_PATH); } EFI_DEVICE_PATH * DuplicateDevicePath ( IN EFI_DEVICE_PATH *DevPath ) { EFI_DEVICE_PATH *NewDevPath; UINTN Size; // // Compute the size // Size = DevicePathSize (DevPath); // // Make a copy // NewDevPath = AllocatePool (Size); if (NewDevPath) { CopyMem (NewDevPath, DevPath, Size); } return NewDevPath; } EFI_DEVICE_PATH * UnpackDevicePath ( IN EFI_DEVICE_PATH *DevPath ) { EFI_DEVICE_PATH *Src, *Dest, *NewPath; UINTN Size; // // Walk device path and round sizes to valid boundries // Src = DevPath; Size = 0; for (; ;) { Size += DevicePathNodeLength(Src); Size += ALIGN_SIZE(Size); if (IsDevicePathEnd(Src)) { break; } Src = NextDevicePathNode(Src); } // // Allocate space for the unpacked path // NewPath = AllocateZeroPool (Size); if (NewPath) { ASSERT (((UINTN)NewPath) % MIN_ALIGNMENT_SIZE == 0); // // Copy each node // Src = DevPath; Dest = NewPath; for (; ;) { Size = DevicePathNodeLength(Src); CopyMem (Dest, Src, Size); Size += ALIGN_SIZE(Size); SetDevicePathNodeLength (Dest, Size); Dest->Type |= EFI_DP_TYPE_UNPACKED; Dest = (EFI_DEVICE_PATH *) (((UINT8 *) Dest) + Size); if (IsDevicePathEnd(Src)) { break; } Src = NextDevicePathNode(Src); } } return NewPath; } EFI_DEVICE_PATH* AppendDevicePathInstance ( IN EFI_DEVICE_PATH *Src, IN EFI_DEVICE_PATH *Instance ) { UINT8 *Ptr; EFI_DEVICE_PATH *DevPath; UINTN SrcSize; UINTN InstanceSize; if (Src == NULL) { return DuplicateDevicePath (Instance); } SrcSize = DevicePathSize(Src); InstanceSize = DevicePathSize(Instance); Ptr = AllocatePool (SrcSize + InstanceSize); DevPath = (EFI_DEVICE_PATH *)Ptr; ASSERT(DevPath); CopyMem (Ptr, Src, SrcSize); // FreePool (Src); while (!IsDevicePathEnd(DevPath)) { DevPath = NextDevicePathNode(DevPath); } // // Convert the End to an End Instance, since we are // appending another instacne after this one its a good // idea. // DevPath->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE; DevPath = NextDevicePathNode(DevPath); CopyMem (DevPath, Instance, InstanceSize); return (EFI_DEVICE_PATH *)Ptr; } EFI_STATUS LibDevicePathToInterface ( IN EFI_GUID *Protocol, IN EFI_DEVICE_PATH *FilePath, OUT VOID **Interface ) { EFI_STATUS Status; EFI_HANDLE Device; Status = uefi_call_wrapper(BS->LocateDevicePath, 3, Protocol, &FilePath, &Device); if (!EFI_ERROR(Status)) { // If we didn't get a direct match return not found Status = EFI_NOT_FOUND; if (IsDevicePathEnd(FilePath)) { // // It was a direct match, lookup the protocol interface // Status =uefi_call_wrapper(BS->HandleProtocol, 3, Device, Protocol, Interface); } } // // If there was an error, do not return an interface // if (EFI_ERROR(Status)) { *Interface = NULL; } return Status; } static VOID _DevPathPci ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { PCI_DEVICE_PATH *Pci; Pci = DevPath; CatPrint(Str, u"Pci(0x%x,0x%x)", Pci->Device, Pci->Function); } static VOID _DevPathPccard ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { PCCARD_DEVICE_PATH *Pccard; Pccard = DevPath; CatPrint(Str, u"Pccard(0x%x)", Pccard-> FunctionNumber ); } static VOID _DevPathMemMap ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { MEMMAP_DEVICE_PATH *MemMap; MemMap = DevPath; CatPrint(Str, u"MemMap(%d,0x%x,0x%x)", MemMap->MemoryType, MemMap->StartingAddress, MemMap->EndingAddress ); } static VOID _DevPathController ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { CONTROLLER_DEVICE_PATH *Controller; Controller = DevPath; CatPrint(Str, u"Ctrl(%d)", Controller->Controller ); } static VOID _DevPathVendor ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { VENDOR_DEVICE_PATH *Vendor; CHAR16 *Type; UNKNOWN_DEVICE_VENDOR_DEVICE_PATH *UnknownDevPath; Vendor = DevPath; switch (DevicePathType(&Vendor->Header)) { case HARDWARE_DEVICE_PATH: Type = u"Hw"; break; case MESSAGING_DEVICE_PATH: Type = u"Msg"; break; case MEDIA_DEVICE_PATH: Type = u"Media"; break; default: Type = u"?"; break; } CatPrint(Str, u"Ven%s(%g", Type, &Vendor->Guid); if (CompareGuid (&Vendor->Guid, &UnknownDevice)) { // // GUID used by EFI to enumerate an EDD 1.1 device // UnknownDevPath = (UNKNOWN_DEVICE_VENDOR_DEVICE_PATH *)Vendor; CatPrint(Str, u":%02x)", UnknownDevPath->LegacyDriveLetter); } else { CatPrint(Str, u")"); } } /* Type: 2 (ACPI Device Path) SubType: 1 (ACPI Device Path) */ static VOID _DevPathAcpi ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { ACPI_HID_DEVICE_PATH *Acpi; Acpi = DevPath; if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) { switch ( EISA_ID_TO_NUM( Acpi-> HID ) ) { case 0x301 : { CatPrint( Str , u"Keyboard(%d)" , Acpi-> UID ) ; break ; } case 0x401 : { CatPrint( Str , u"ParallelPort(%d)" , Acpi-> UID ) ; break ; } case 0x501 : { CatPrint( Str , u"Serial(%d)" , Acpi-> UID ) ; break ; } case 0x604 : { CatPrint( Str , u"Floppy(%d)" , Acpi-> UID ) ; break ; } case 0xa03 : { CatPrint( Str , u"PciRoot(%d)" , Acpi-> UID ) ; break ; } case 0xa08 : { CatPrint( Str , u"PcieRoot(%d)" , Acpi-> UID ) ; break ; } default : { CatPrint( Str , u"Acpi(PNP%04x" , EISA_ID_TO_NUM( Acpi-> HID ) ) ; if ( Acpi-> UID ) CatPrint( Str , u",%d" , Acpi-> UID ) ; CatPrint( Str , u")" ) ; break ; } } } else { CatPrint( Str , u"Acpi(0x%X" , Acpi-> HID ) ; if ( Acpi-> UID ) CatPrint( Str , u",%d" , Acpi-> UID ) ; CatPrint( Str , u")" , Acpi-> HID , Acpi-> UID ) ; } } static VOID _DevPathAtapi ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { ATAPI_DEVICE_PATH *Atapi; Atapi = DevPath; CatPrint(Str, u"Ata(%s,%s)", Atapi->PrimarySecondary ? u"Secondary" : u"Primary", Atapi->SlaveMaster ? u"Slave" : u"Master" ); } static VOID _DevPathScsi ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { SCSI_DEVICE_PATH *Scsi; Scsi = DevPath; CatPrint(Str, u"Scsi(%d,%d)", Scsi->Pun, Scsi->Lun); } static VOID _DevPathFibre ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { FIBRECHANNEL_DEVICE_PATH *Fibre; Fibre = DevPath; CatPrint( Str , u"Fibre%s(0x%016lx,0x%016lx)" , DevicePathType( & Fibre-> Header ) == MSG_FIBRECHANNEL_DP ? u"" : u"Ex" , Fibre-> WWN , Fibre-> Lun ) ; } static VOID _DevPath1394 ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { F1394_DEVICE_PATH *F1394; F1394 = DevPath; // Guid has format of IEEE-EUI64 CatPrint(Str, u"I1394(%016lx)", F1394->Guid); } static VOID _DevPathUsb ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { USB_DEVICE_PATH *Usb; Usb = DevPath; CatPrint( Str , u"Usb(0x%x,0x%x)" , Usb-> Port , Usb-> Endpoint ) ; } static VOID _DevPathI2O ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { I2O_DEVICE_PATH *I2O; I2O = DevPath; CatPrint(Str, u"I2O(0x%X)", I2O->Tid); } static VOID _DevPathMacAddr ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { MAC_ADDR_DEVICE_PATH *MAC; UINTN HwAddressSize; UINTN Index; MAC = DevPath; /* HwAddressSize = sizeof(EFI_MAC_ADDRESS); */ HwAddressSize = DevicePathNodeLength( & MAC-> Header ) ; HwAddressSize -= sizeof( MAC-> Header ) ; HwAddressSize -= sizeof( MAC-> IfType ) ; if (MAC->IfType == 0x01 || MAC->IfType == 0x00) { HwAddressSize = 6; } CatPrint(Str, u"Mac("); for(Index = 0; Index < HwAddressSize; Index++) { CatPrint(Str, u"%02x",MAC->MacAddress.Addr[Index]); } if ( MAC-> IfType != 0 ) { CatPrint(Str, u",%d" , MAC-> IfType ) ; } CatPrint(Str, u")"); } static VOID CatPrintIPv4( IN OUT POOL_PRINT * Str , IN EFI_IPv4_ADDRESS * Address ) { CatPrint( Str , u"%d.%d.%d.%d" , Address-> Addr[ 0 ] , Address-> Addr[ 1 ] , Address-> Addr[ 2 ] , Address-> Addr[ 3 ] ) ; } static BOOLEAN IsNotNullIPv4( IN EFI_IPv4_ADDRESS * Address ) { UINT8 val ; val = Address-> Addr[ 0 ] | Address-> Addr[ 1 ] ; val |= Address-> Addr[ 2 ] | Address-> Addr[ 3 ] ; return val != 0 ; } static VOID CatPrintNetworkProtocol( IN OUT POOL_PRINT * Str , IN UINT16 Proto ) { if ( Proto == 6 ) { CatPrint( Str , u"TCP" ) ; } else if ( Proto == 17 ) { CatPrint( Str , u"UDP" ) ; } else { CatPrint( Str , u"%d" , Proto ) ; } } static VOID _DevPathIPv4 ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { IPv4_DEVICE_PATH *IP; BOOLEAN show ; IP = DevPath; CatPrint( Str , u"IPv4(") ; CatPrintIPv4( Str , & IP-> RemoteIpAddress ) ; CatPrint( Str , u",") ; CatPrintNetworkProtocol( Str , IP-> Protocol ) ; CatPrint( Str , u",%s" , IP-> StaticIpAddress ? u"Static" : u"DHCP" ) ; show = IsNotNullIPv4( & IP-> LocalIpAddress ) ; if ( ! show && DevicePathNodeLength( & IP-> Header ) == sizeof( IPv4_DEVICE_PATH ) ) { /* only version 2 includes gateway and netmask */ show |= IsNotNullIPv4( & IP-> GatewayIpAddress ) ; show |= IsNotNullIPv4( & IP-> SubnetMask ) ; } if ( show ) { CatPrint( Str , u"," ) ; CatPrintIPv4( Str , & IP-> LocalIpAddress ) ; if ( DevicePathNodeLength( & IP-> Header ) == sizeof( IPv4_DEVICE_PATH ) ) { /* only version 2 includes gateway and netmask */ show = IsNotNullIPv4( & IP-> GatewayIpAddress ) ; show |= IsNotNullIPv4( & IP-> SubnetMask ) ; if ( show ) { CatPrint( Str , u",") ; CatPrintIPv4( Str , & IP-> GatewayIpAddress ) ; if ( IsNotNullIPv4( & IP-> SubnetMask ) ) { CatPrint( Str , u",") ; CatPrintIPv4( Str , & IP-> SubnetMask ) ; } } } } CatPrint( Str , u")") ; } #define CatPrintIPv6_ADD( x , y ) ( ( (UINT16) ( x ) ) << 8 | ( y ) ) static VOID CatPrintIPv6( IN OUT POOL_PRINT * Str , IN EFI_IPv6_ADDRESS * Address ) { CatPrint( Str , u"%x:%x:%x:%x:%x:%x:%x:%x" , CatPrintIPv6_ADD( Address-> Addr[ 0 ] , Address-> Addr[ 1 ] ) , CatPrintIPv6_ADD( Address-> Addr[ 2 ] , Address-> Addr[ 3 ] ) , CatPrintIPv6_ADD( Address-> Addr[ 4 ] , Address-> Addr[ 5 ] ) , CatPrintIPv6_ADD( Address-> Addr[ 6 ] , Address-> Addr[ 7 ] ) , CatPrintIPv6_ADD( Address-> Addr[ 8 ] , Address-> Addr[ 9 ] ) , CatPrintIPv6_ADD( Address-> Addr[ 10 ] , Address-> Addr[ 11 ] ) , CatPrintIPv6_ADD( Address-> Addr[ 12 ] , Address-> Addr[ 13 ] ) , CatPrintIPv6_ADD( Address-> Addr[ 14 ] , Address-> Addr[ 15 ] ) ) ; } static VOID _DevPathIPv6 ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { IPv6_DEVICE_PATH *IP; IP = DevPath; CatPrint( Str , u"IPv6(") ; CatPrintIPv6( Str , & IP-> RemoteIpAddress ) ; CatPrint( Str , u",") ; CatPrintNetworkProtocol( Str, IP-> Protocol ) ; CatPrint( Str , u",%s," , IP-> IPAddressOrigin ? ( IP-> IPAddressOrigin == 1 ? u"StatelessAutoConfigure" : u"StatefulAutoConfigure" ) : u"Static" ) ; CatPrintIPv6( Str , & IP-> LocalIpAddress ) ; if ( DevicePathNodeLength( & IP-> Header ) == sizeof( IPv6_DEVICE_PATH ) ) { CatPrint( Str , u",") ; CatPrintIPv6( Str , & IP-> GatewayIpAddress ) ; CatPrint( Str , u",") ; CatPrint( Str , u"%d" , & IP-> PrefixLength ) ; } CatPrint( Str , u")") ; } static VOID _DevPathUri ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { URI_DEVICE_PATH *Uri; Uri = DevPath; CatPrint( Str, u"Uri(%a)", Uri->Uri ); } static VOID _DevPathInfiniBand ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { INFINIBAND_DEVICE_PATH *InfiniBand; InfiniBand = DevPath; CatPrint(Str, u"Infiniband(0x%x,%g,0x%lx,0x%lx,0x%lx)", InfiniBand->ResourceFlags, InfiniBand->PortGid, InfiniBand->ServiceId, InfiniBand->TargetPortId, InfiniBand->DeviceId); } static VOID _DevPathUart ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { UART_DEVICE_PATH *Uart; CHAR8 Parity; Uart = DevPath; switch (Uart->Parity) { case 0 : Parity = 'D'; break; case 1 : Parity = 'N'; break; case 2 : Parity = 'E'; break; case 3 : Parity = 'O'; break; case 4 : Parity = 'M'; break; case 5 : Parity = 'S'; break; default : Parity = 'x'; break; } if (Uart->BaudRate == 0) { CatPrint(Str, u"Uart(DEFAULT,"); } else { CatPrint(Str, u"Uart(%ld,", Uart->BaudRate); } if (Uart->DataBits == 0) { CatPrint(Str, u"DEFAULT,"); } else { CatPrint(Str, u"%d,", Uart->DataBits); } CatPrint(Str, u"%c,", Parity); switch (Uart->StopBits) { case 0 : CatPrint(Str, u"D)"); break; case 1 : CatPrint(Str, u"1)"); break; case 2 : CatPrint(Str, u"1.5)"); break; case 3 : CatPrint(Str, u"2)"); break; default : CatPrint(Str, u"x)"); break; } } static VOID _DevPathSata ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { SATA_DEVICE_PATH * Sata ; Sata = DevPath; CatPrint( Str , u"Sata(0x%x,0x%x,0x%x)" , Sata-> HBAPortNumber , Sata-> PortMultiplierPortNumber , Sata-> Lun ) ; } static VOID _DevPathHardDrive ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { HARDDRIVE_DEVICE_PATH *Hd; Hd = DevPath; switch (Hd->SignatureType) { case SIGNATURE_TYPE_MBR: CatPrint(Str, u"HD(%d,MBR,0x%08x)", Hd->PartitionNumber, *((UINT32 *)(&(Hd->Signature[0]))) ); break; case SIGNATURE_TYPE_GUID: CatPrint(Str, u"HD(%d,GPT,%g)", Hd->PartitionNumber, (EFI_GUID *) &(Hd->Signature[0]) ); break; default: CatPrint(Str, u"HD(%d,%d,0)", Hd->PartitionNumber, Hd->SignatureType ); break; } } static VOID _DevPathCDROM ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { CDROM_DEVICE_PATH *Cd; Cd = DevPath; CatPrint( Str , u"CDROM(0x%x)" , Cd-> BootEntry ) ; } static VOID _DevPathFilePath ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { FILEPATH_DEVICE_PATH *Fp; Fp = DevPath; CatPrint(Str, u"%s", Fp->PathName); } static VOID _DevPathMediaProtocol ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { MEDIA_PROTOCOL_DEVICE_PATH *MediaProt; MediaProt = DevPath; CatPrint(Str, u"%g", &MediaProt->Protocol); } static VOID _DevPathBssBss ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { BBS_BBS_DEVICE_PATH *Bss; CHAR16 *Type; Bss = DevPath; switch (Bss->DeviceType) { case BBS_TYPE_FLOPPY: Type = u"Floppy"; break; case BBS_TYPE_HARDDRIVE: Type = u"Harddrive"; break; case BBS_TYPE_CDROM: Type = u"CDROM"; break; case BBS_TYPE_PCMCIA: Type = u"PCMCIA"; break; case BBS_TYPE_USB: Type = u"Usb"; break; case BBS_TYPE_EMBEDDED_NETWORK: Type = u"Net"; break; default: Type = u"?"; break; } CatPrint(Str, u"Bss-%s(%a)", Type, Bss->String); } static VOID _DevPathEndInstance ( IN OUT POOL_PRINT *Str, IN VOID *DevPath EFI_UNUSED ) { CatPrint(Str, u","); } /** * Print unknown device node. * UEFI 2.4 § 9.6.1.6 table 89. */ static VOID _DevPathNodeUnknown ( IN OUT POOL_PRINT *Str, IN VOID *DevPath ) { EFI_DEVICE_PATH * Path ; UINT8 * value ; int length , index ; Path = DevPath ; value = DevPath ; value += 4 ; switch ( Path-> Type ) { case HARDWARE_DEVICE_PATH : { /* Unknown Hardware Device Path */ CatPrint( Str , u"HardwarePath(%d" , Path-> SubType ) ; break ; } case ACPI_DEVICE_PATH : { /* Unknown ACPI Device Path */ CatPrint( Str , u"AcpiPath(%d" , Path-> SubType ) ; break ; } case MESSAGING_DEVICE_PATH : { /* Unknown Messaging Device Path */ CatPrint( Str , u"Msg(%d" , Path-> SubType ) ; break ; } case MEDIA_DEVICE_PATH : { /* Unknown Media Device Path */ CatPrint( Str , u"MediaPath(%d" , Path-> SubType ) ; break ; } case BBS_DEVICE_PATH : { /* Unknown BIOS Boot Specification Device Path */ CatPrint( Str , u"BbsPath(%d" , Path-> SubType ) ; break ; } default : { /* Unknown Device Path */ CatPrint( Str , u"Path(%d,%d" , Path-> Type , Path-> SubType ) ; break ; } } length = DevicePathNodeLength( Path ) ; for ( index = 0 ; index < length ; index ++ ) { if ( index == 0 ) CatPrint( Str , u",0x" ) ; CatPrint( Str , u"%02x" , * value ) ; value ++ ; } CatPrint( Str , u")" ) ; } /* * Table to convert "Type" and "SubType" to a "convert to text" function/ * Entries hold "Type" and "SubType" for know values. * Special "SubType" 0 is used as default for known type with unknown subtype. */ typedef struct { UINT8 Type; UINT8 SubType; VOID (*Function)(POOL_PRINT *, VOID *); } DevPathTable_Type; DevPathTable_Type DevPathTable[] = { { HARDWARE_DEVICE_PATH, HW_PCI_DP, _DevPathPci}, { HARDWARE_DEVICE_PATH, HW_PCCARD_DP, _DevPathPccard}, { HARDWARE_DEVICE_PATH, HW_MEMMAP_DP, _DevPathMemMap}, { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, _DevPathVendor}, { HARDWARE_DEVICE_PATH, HW_CONTROLLER_DP, _DevPathController}, { ACPI_DEVICE_PATH, ACPI_DP, _DevPathAcpi}, { MESSAGING_DEVICE_PATH, MSG_ATAPI_DP, _DevPathAtapi}, { MESSAGING_DEVICE_PATH, MSG_SCSI_DP, _DevPathScsi}, { MESSAGING_DEVICE_PATH, MSG_FIBRECHANNEL_DP, _DevPathFibre}, { MESSAGING_DEVICE_PATH, MSG_1394_DP, _DevPath1394}, { MESSAGING_DEVICE_PATH, MSG_USB_DP, _DevPathUsb}, { MESSAGING_DEVICE_PATH, MSG_I2O_DP, _DevPathI2O}, { MESSAGING_DEVICE_PATH, MSG_MAC_ADDR_DP, _DevPathMacAddr}, { MESSAGING_DEVICE_PATH, MSG_IPv4_DP, _DevPathIPv4}, { MESSAGING_DEVICE_PATH, MSG_IPv6_DP, _DevPathIPv6}, { MESSAGING_DEVICE_PATH, MSG_URI_DP, _DevPathUri}, { MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP, _DevPathInfiniBand}, { MESSAGING_DEVICE_PATH, MSG_UART_DP, _DevPathUart}, { MESSAGING_DEVICE_PATH , MSG_SATA_DP , _DevPathSata } , { MESSAGING_DEVICE_PATH, MSG_VENDOR_DP, _DevPathVendor}, { MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP, _DevPathHardDrive}, { MEDIA_DEVICE_PATH, MEDIA_CDROM_DP, _DevPathCDROM}, { MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, _DevPathVendor}, { MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, _DevPathFilePath}, { MEDIA_DEVICE_PATH, MEDIA_PROTOCOL_DP, _DevPathMediaProtocol}, { BBS_DEVICE_PATH, BBS_BBS_DP, _DevPathBssBss}, { END_DEVICE_PATH_TYPE, END_INSTANCE_DEVICE_PATH_SUBTYPE, _DevPathEndInstance}, { 0, 0, NULL} }; CHAR16 * DevicePathToStr ( EFI_DEVICE_PATH *DevPath ) /*++ Turns the Device Path into a printable string. Allcoates the string from pool. The caller must FreePool the returned string. --*/ { POOL_PRINT Str; EFI_DEVICE_PATH *DevPathNode; VOID (*DumpNode)(POOL_PRINT *, VOID *); UINTN Index, NewSize; ZeroMem(&Str, sizeof(Str)); // // Unpacked the device path // DevPath = UnpackDevicePath(DevPath); ASSERT (DevPath); // // Process each device path node // DevPathNode = DevPath; while (!IsDevicePathEnd(DevPathNode)) { // // Find the handler to dump this device path node // DumpNode = NULL; for (Index = 0; DevPathTable[Index].Function; Index += 1) { if (DevicePathType(DevPathNode) == DevPathTable[Index].Type && DevicePathSubType(DevPathNode) == DevPathTable[Index].SubType) { DumpNode = DevPathTable[Index].Function; break; } } // // If not found, use a generic function // if (!DumpNode) { DumpNode = _DevPathNodeUnknown; } // // Put a path seperator in if needed // if (Str.len && DumpNode != _DevPathEndInstance) { CatPrint (&Str, u"/"); } // // Print this node of the device path // DumpNode (&Str, DevPathNode); // // Next device path node // DevPathNode = NextDevicePathNode(DevPathNode); } // // Shrink pool used for string allocation // FreePool (DevPath); NewSize = (Str.len + 1) * sizeof(CHAR16); Str.str = ReallocatePool (NewSize, NewSize, Str.str); Str.str[Str.len] = 0; return Str.str; } BOOLEAN LibMatchDevicePaths ( IN EFI_DEVICE_PATH *Multi, IN EFI_DEVICE_PATH *Single ) { EFI_DEVICE_PATH *DevicePath, *DevicePathInst; UINTN Size; if (!Multi || !Single) { return FALSE; } DevicePath = Multi; while ((DevicePathInst = DevicePathInstance (&DevicePath, &Size))) { if (CompareMem (Single, DevicePathInst, Size) == 0) { return TRUE; } } return FALSE; } EFI_DEVICE_PATH * LibDuplicateDevicePathInstance ( IN EFI_DEVICE_PATH *DevPath ) { EFI_DEVICE_PATH *NewDevPath,*DevicePathInst,*Temp; UINTN Size = 0; // // get the size of an instance from the input // Temp = DevPath; DevicePathInst = DevicePathInstance (&Temp, &Size); // // Make a copy and set proper end type // NewDevPath = NULL; if (Size) { NewDevPath = AllocatePool (Size + sizeof(EFI_DEVICE_PATH)); } if (NewDevPath) { CopyMem (NewDevPath, DevicePathInst, Size); Temp = NextDevicePathNode(NewDevPath); SetDevicePathEndNode(Temp); } return NewDevPath; } ncroxon-gnu-efi-157d47c/lib/entry.c000066400000000000000000000034121471215650600171520ustar00rootroot00000000000000/* * ctors.c * Copyright 2019 Peter Jones * */ #include #include typedef void (*funcp)(void); /* * Note that these aren't the using the GNU "CONSTRUCTOR" output section * command, so they don't start with a size. Because of p2align and the * end/END definitions, and the fact that they're mergeable, they can also * have NULLs which aren't guaranteed to be at the end. */ extern funcp __init_array_start[], __init_array_end[]; extern funcp __CTOR_LIST__[], __CTOR_END__[]; extern funcp __fini_array_start[], __fini_array_end[]; extern funcp __DTOR_LIST__[], __DTOR_END__[]; static void ctors(void) { size_t __init_array_length = __init_array_end - __init_array_start; for (size_t i = 0; i < __init_array_length; i++) { funcp func = __init_array_start[i]; if (func != NULL) func(); } size_t __CTOR_length = __CTOR_END__ - __CTOR_LIST__; for (size_t i = 0; i < __CTOR_length; i++) { size_t current = __CTOR_length - i - 1; funcp func = __CTOR_LIST__[current]; if (func != NULL) func(); } } static void dtors(void) { size_t __DTOR_length = __DTOR_END__ - __DTOR_LIST__; for (size_t i = 0; i < __DTOR_length; i++) { funcp func = __DTOR_LIST__[i]; if (func != NULL) func(); } size_t __fini_array_length = __fini_array_end - __fini_array_start; for (size_t i = 0; i < __fini_array_length; i++) { size_t current = __fini_array_length - i - 1; funcp func = __fini_array_start[current]; if (func != NULL) func(); } } extern EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab); EFI_STATUS _entry(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { EFI_STATUS status; InitializeLib(image, systab); ctors(); status = efi_main(image, systab); dtors(); return status; } // vim:fenc=utf-8:tw=75:noet ncroxon-gnu-efi-157d47c/lib/error.c000066400000000000000000000053441471215650600171500ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: error.c Abstract: Revision History --*/ #include "lib.h" typedef struct { EFI_STATUS Code; WCHAR *Desc; } ErrorCodeTable_Type; ErrorCodeTable_Type ErrorCodeTable[] = { { EFI_SUCCESS, u"Success"}, { EFI_LOAD_ERROR, u"Load Error"}, { EFI_INVALID_PARAMETER, u"Invalid Parameter"}, { EFI_UNSUPPORTED, u"Unsupported"}, { EFI_BAD_BUFFER_SIZE, u"Bad Buffer Size"}, { EFI_BUFFER_TOO_SMALL, u"Buffer Too Small"}, { EFI_NOT_READY, u"Not Ready"}, { EFI_DEVICE_ERROR, u"Device Error"}, { EFI_WRITE_PROTECTED, u"Write Protected"}, { EFI_OUT_OF_RESOURCES, u"Out of Resources"}, { EFI_VOLUME_CORRUPTED, u"Volume Corrupt"}, { EFI_VOLUME_FULL, u"Volume Full"}, { EFI_NO_MEDIA, u"No Media"}, { EFI_MEDIA_CHANGED, u"Media changed"}, { EFI_NOT_FOUND, u"Not Found"}, { EFI_ACCESS_DENIED, u"Access Denied"}, { EFI_NO_RESPONSE, u"No Response"}, { EFI_NO_MAPPING, u"No mapping"}, { EFI_TIMEOUT, u"Time out"}, { EFI_NOT_STARTED, u"Not started"}, { EFI_ALREADY_STARTED, u"Already started"}, { EFI_ABORTED, u"Aborted"}, { EFI_ICMP_ERROR, u"ICMP Error"}, { EFI_TFTP_ERROR, u"TFTP Error"}, { EFI_PROTOCOL_ERROR, u"Protocol Error"}, { EFI_INCOMPATIBLE_VERSION, u"Incompatible Version"}, { EFI_SECURITY_VIOLATION, u"Security Policy Violation"}, { EFI_CRC_ERROR, u"CRC Error"}, { EFI_END_OF_MEDIA, u"End of Media"}, { EFI_END_OF_FILE, u"End of File"}, { EFI_INVALID_LANGUAGE, u"Invalid Languages"}, { EFI_COMPROMISED_DATA, u"Compromised Data"}, { EFI_IP_ADDRESS_CONFLICT, u"IP Address Conflict"}, { EFI_HTTP_ERROR, u"HTTP Error"}, // warnings { EFI_WARN_UNKNOWN_GLYPH, u"Warning Unknown Glyph"}, { EFI_WARN_DELETE_FAILURE, u"Warning Delete Failure"}, { EFI_WARN_WRITE_FAILURE, u"Warning Write Failure"}, { EFI_WARN_BUFFER_TOO_SMALL, u"Warning Buffer Too Small"}, { EFI_WARN_STALE_DATA, u"Warning Stale Data"}, { EFI_WARN_FILE_SYSTEM, u"Warning File System"}, { EFI_WARN_RESET_REQUIRED, u"Warning Reset Required"}, { 0, NULL} } ; VOID StatusToString ( OUT CHAR16 *Buffer, IN EFI_STATUS Status ) { UINTN Index; for (Index = 0; ErrorCodeTable[Index].Desc; Index +=1) { if (ErrorCodeTable[Index].Code == Status) { StrCpy (Buffer, ErrorCodeTable[Index].Desc); return; } } UnicodeSPrint (Buffer, 0, u"%X", Status); } ncroxon-gnu-efi-157d47c/lib/event.c000066400000000000000000000063601471215650600171370ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: event.c Abstract: Revision History --*/ #include "lib.h" EFI_EVENT LibCreateProtocolNotifyEvent ( IN EFI_GUID *ProtocolGuid, IN EFI_TPL NotifyTpl, IN EFI_EVENT_NOTIFY NotifyFunction, IN VOID *NotifyContext, OUT VOID *Registration ) { EFI_STATUS Status; EFI_EVENT Event; // // Create the event // Status = uefi_call_wrapper( BS->CreateEvent, 5, EVT_NOTIFY_SIGNAL, NotifyTpl, NotifyFunction, NotifyContext, &Event ); if ( EFI_ERROR( Status ) ) return NULL ; ASSERT (!EFI_ERROR(Status)); // // Register for protocol notifactions on this event // Status = uefi_call_wrapper( BS->RegisterProtocolNotify, 3, ProtocolGuid, Event, Registration ); if ( EFI_ERROR( Status ) ) return NULL ; ASSERT (!EFI_ERROR(Status)); // // Kick the event so we will perform an initial pass of // current installed drivers // uefi_call_wrapper(BS->SignalEvent, 1, Event); return Event; } EFI_STATUS WaitForSingleEvent ( IN EFI_EVENT Event, IN UINT64 Timeout OPTIONAL ) { EFI_STATUS Status; UINTN Index; EFI_EVENT TimerEvent; EFI_EVENT WaitList[2]; if (Timeout) { // // Create a timer event // Status = uefi_call_wrapper(BS->CreateEvent, 5, EVT_TIMER, 0, NULL, NULL, &TimerEvent); if (!EFI_ERROR(Status)) { // // Set the timer event // uefi_call_wrapper(BS->SetTimer, 3, TimerEvent, TimerRelative, Timeout); // // Wait for the original event or the timer // WaitList[0] = Event; WaitList[1] = TimerEvent; Status = uefi_call_wrapper(BS->WaitForEvent, 3, 2, WaitList, &Index); uefi_call_wrapper(BS->CloseEvent, 1, TimerEvent); // // If the timer expired, change the return to timed out // if (!EFI_ERROR(Status) && Index == 1) { Status = EFI_TIMEOUT; } } } else { // // No timeout... just wait on the event // Status = uefi_call_wrapper(BS->WaitForEvent, 3, 1, &Event, &Index); ASSERT (!EFI_ERROR(Status)); ASSERT (Index == 0); } return Status; } VOID WaitForEventWithTimeout ( IN EFI_EVENT Event, IN UINTN Timeout, IN UINTN Row, IN UINTN Column, IN CHAR16 *String, IN EFI_INPUT_KEY TimeoutKey, OUT EFI_INPUT_KEY *Key ) { EFI_STATUS Status; do { PrintAt (Column, Row, String, Timeout); Status = WaitForSingleEvent (Event, 10000000); if (Status == EFI_SUCCESS) { if (!EFI_ERROR(uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, Key))) { return; } } } while (Timeout > 0); CopyMem(Key, &TimeoutKey, sizeof(EFI_INPUT_KEY)); } ncroxon-gnu-efi-157d47c/lib/exit.c000066400000000000000000000005261471215650600167650ustar00rootroot00000000000000#include "lib.h" VOID Exit( IN EFI_STATUS ExitStatus, IN UINTN ExitDataSize, IN CHAR16 *ExitData OPTIONAL ) { uefi_call_wrapper(BS->Exit, 4, LibImageHandle, ExitStatus, ExitDataSize, ExitData); // Uh oh, Exit() returned?! for (;;) { } } ncroxon-gnu-efi-157d47c/lib/guid.c000066400000000000000000000122261471215650600167440ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: misc.c Abstract: Misc EFI support functions Revision History --*/ #include "lib.h" // // Additional Known guids // #define SHELL_INTERFACE_PROTOCOL \ { 0x47c7b223, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define ENVIRONMENT_VARIABLE_ID \ { 0x47c7b224, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define DEVICE_PATH_MAPPING_ID \ { 0x47c7b225, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define PROTOCOL_ID_ID \ { 0x47c7b226, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } #define ALIAS_ID \ { 0x47c7b227, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } static EFI_GUID ShellInterfaceProtocol = SHELL_INTERFACE_PROTOCOL; static EFI_GUID SEnvId = ENVIRONMENT_VARIABLE_ID; static EFI_GUID SMapId = DEVICE_PATH_MAPPING_ID; static EFI_GUID SProtId = PROTOCOL_ID_ID; static EFI_GUID SAliasId = ALIAS_ID; static struct { EFI_GUID *Guid; WCHAR *GuidName; } KnownGuids[] = { { &NullGuid, u"G0" }, { &gEfiGlobalVariableGuid, u"EfiVar" }, { &VariableStoreProtocol, u"VarStore" }, { &gEfiDevicePathProtocolGuid, u"DevPath" }, { &gEfiLoadedImageProtocolGuid, u"LdImg" }, { &gEfiSimpleTextInProtocolGuid, u"TxtIn" }, { &gEfiSimpleTextOutProtocolGuid, u"TxtOut" }, { &gEfiBlockIoProtocolGuid, u"BlkIo" }, { &gEfiBlockIo2ProtocolGuid, u"BlkIo2" }, { &gEfiDiskIoProtocolGuid, u"DskIo" }, { &gEfiDiskIo2ProtocolGuid, u"DskIo2" }, { &gEfiSimpleFileSystemProtocolGuid, u"Fs" }, { &gEfiLoadFileProtocolGuid, u"LdFile" }, { &gEfiDeviceIoProtocolGuid, u"DevIo" }, { &gEfiComponentNameProtocolGuid, u"CName" }, { &gEfiComponentName2ProtocolGuid, u"CName2" }, { &gEfiMpServicesProtocolGuid, u"Mp" }, { &gEfiFileInfoGuid, u"FileInfo" }, { &gEfiFileSystemInfoGuid, u"FsInfo" }, { &gEfiFileSystemVolumeLabelInfoIdGuid, u"FsVolInfo" }, { &gEfiUnicodeCollationProtocolGuid, u"Unicode" }, { &LegacyBootProtocol, u"LegacyBoot" }, { &gEfiSerialIoProtocolGuid, u"SerIo" }, { &VgaClassProtocol, u"VgaClass"}, { &gEfiSimpleNetworkProtocolGuid, u"Net" }, { &gEfiNetworkInterfaceIdentifierProtocolGuid, u"Nii" }, { &gEfiPxeBaseCodeProtocolGuid, u"Pxe" }, { &gEfiPxeBaseCodeCallbackProtocolGuid, u"PxeCb" }, { &TextOutSpliterProtocol, u"TxtOutSplit" }, { &ErrorOutSpliterProtocol, u"ErrOutSplit" }, { &TextInSpliterProtocol, u"TxtInSplit" }, { &gEfiPcAnsiGuid, u"PcAnsi" }, { &gEfiVT100Guid, u"Vt100" }, { &gEfiVT100PlusGuid, u"Vt100Plus" }, { &gEfiVTUTF8Guid, u"VtUtf8" }, { &UnknownDevice, u"UnknownDev" }, { &EfiPartTypeSystemPartitionGuid, u"ESP" }, { &EfiPartTypeLegacyMbrGuid, u"GPT MBR" }, { &ShellInterfaceProtocol, u"ShellInt" }, { &SEnvId, u"SEnv" }, { &SProtId, u"ShellProtId" }, { &SMapId, u"ShellDevPathMap" }, { &SAliasId, u"ShellAlias" }, { NULL, u"" } }; // // // LIST_ENTRY GuidList; VOID InitializeGuid ( VOID ) { } BOOLEAN EFIAPI CompareGuid_1 ( IN CONST EFI_GUID *Guid1, IN CONST EFI_GUID *Guid2 ) /*++ Routine Description: Compares to GUIDs Arguments: Guid1 - guid to compare Guid2 - guid to compare Returns: = 1 if Guid1 == Guid2 --*/ { return RtCompareGuid (Guid1, Guid2); } VOID GuidToString ( OUT CHAR16 *Buffer, IN EFI_GUID *Guid ) { UINTN Index; // // Else, (for now) use additional internal function for mapping guids // for (Index=0; KnownGuids[Index].Guid; Index++) { if (CompareGuid(Guid, KnownGuids[Index].Guid)) { UnicodeSPrint (Buffer, 0, KnownGuids[Index].GuidName); return ; } } // // Else dump it // UnicodeSPrint (Buffer, 0, u"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", Guid->Data1, Guid->Data2, Guid->Data3, Guid->Data4[0], Guid->Data4[1], Guid->Data4[2], Guid->Data4[3], Guid->Data4[4], Guid->Data4[5], Guid->Data4[6], Guid->Data4[7] ); } ncroxon-gnu-efi-157d47c/lib/hand.c000066400000000000000000000346721471215650600167370ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: hand.c Abstract: Revision History --*/ #include "lib.h" #include "efistdarg.h" // !!! EFI_STATUS LibLocateProtocol ( IN EFI_GUID *ProtocolGuid, OUT VOID **Interface ) // // Find the first instance of this Protocol in the system and return it's interface // { EFI_STATUS Status; UINTN NumberHandles, Index; EFI_HANDLE *Handles; *Interface = NULL; Status = LibLocateHandle (ByProtocol, ProtocolGuid, NULL, &NumberHandles, &Handles); if (EFI_ERROR(Status)) { DEBUG((D_INFO, "LibLocateProtocol: Handle not found\n")); return Status; } for (Index=0; Index < NumberHandles; Index++) { Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handles[Index], ProtocolGuid, Interface); if (!EFI_ERROR(Status)) { break; } } if (Handles) { FreePool (Handles); } return Status; } EFI_STATUS LibLocateHandle ( IN EFI_LOCATE_SEARCH_TYPE SearchType, IN EFI_GUID *Protocol OPTIONAL, IN VOID *SearchKey OPTIONAL, IN OUT UINTN *NoHandles, OUT EFI_HANDLE **Buffer ) { EFI_STATUS Status; UINTN BufferSize; // // Initialize for GrowBuffer loop // Status = EFI_SUCCESS; *Buffer = NULL; BufferSize = 50 * sizeof(EFI_HANDLE); // // Call the real function // while (GrowBuffer (&Status, (VOID **) Buffer, BufferSize)) { Status = uefi_call_wrapper( BS->LocateHandle, 5, SearchType, Protocol, SearchKey, &BufferSize, *Buffer ); } *NoHandles = BufferSize / sizeof (EFI_HANDLE); if (EFI_ERROR(Status)) { *NoHandles = 0; } return Status; } EFI_STATUS LibLocateHandleByDiskSignature ( IN UINT8 MBRType, IN UINT8 SignatureType, IN VOID *Signature, IN OUT UINTN *NoHandles, OUT EFI_HANDLE **Buffer ) { EFI_STATUS Status; UINTN BufferSize; UINTN NoBlockIoHandles; EFI_HANDLE *BlockIoBuffer; EFI_DEVICE_PATH *DevicePath; UINTN Index; EFI_DEVICE_PATH *Next, *DevPath; HARDDRIVE_DEVICE_PATH *HardDriveDevicePath; BOOLEAN Match; BOOLEAN PreviousNodeIsHardDriveDevicePath; // // Initialize for GrowBuffer loop // Status = EFI_SUCCESS; BlockIoBuffer = NULL; BufferSize = 50 * sizeof(EFI_HANDLE); // // Call the real function // while (GrowBuffer (&Status, (VOID **)&BlockIoBuffer, BufferSize)) { // // Get list of device handles that support the BLOCK_IO Protocol. // Status = uefi_call_wrapper( BS->LocateHandle, 5, ByProtocol, &BlockIoProtocol, NULL, &BufferSize, BlockIoBuffer ); } NoBlockIoHandles = BufferSize / sizeof (EFI_HANDLE); if (EFI_ERROR(Status)) { NoBlockIoHandles = 0; } // // If there was an error or there are no device handles that support // the BLOCK_IO Protocol, then return. // if (NoBlockIoHandles == 0) { FreePool(BlockIoBuffer); *NoHandles = 0; *Buffer = NULL; return Status; } // // Loop through all the device handles that support the BLOCK_IO Protocol // *NoHandles = 0; for(Index=0;IndexHandleProtocol, 3, BlockIoBuffer[Index], &DevicePathProtocol, (VOID*)&DevicePath ); // // Search DevicePath for a Hard Drive Media Device Path node. // If one is found, then see if it matches the signature that was // passed in. If it does match, and the next node is the End of the // device path, and the previous node is not a Hard Drive Media Device // Path, then we have found a match. // Match = FALSE; if (DevicePath != NULL) { PreviousNodeIsHardDriveDevicePath = FALSE; DevPath = DevicePath; // // Check for end of device path type // for (; ;) { if ((DevicePathType(DevPath) == MEDIA_DEVICE_PATH) && (DevicePathSubType(DevPath) == MEDIA_HARDDRIVE_DP)) { HardDriveDevicePath = (HARDDRIVE_DEVICE_PATH *)(DevPath); if (PreviousNodeIsHardDriveDevicePath == FALSE) { Next = NextDevicePathNode(DevPath); if (IsDevicePathEndType(Next)) { if ((HardDriveDevicePath->MBRType == MBRType) && (HardDriveDevicePath->SignatureType == SignatureType)) { switch(SignatureType) { case SIGNATURE_TYPE_MBR: if (*((UINT32 *)(Signature)) == *(UINT32 *)(&(HardDriveDevicePath->Signature[0]))) { Match = TRUE; } break; case SIGNATURE_TYPE_GUID: if (CompareGuid((EFI_GUID *)Signature,(EFI_GUID *)(&(HardDriveDevicePath->Signature[0])))) { Match = TRUE; } break; } } } } PreviousNodeIsHardDriveDevicePath = TRUE; } else { PreviousNodeIsHardDriveDevicePath = FALSE; } if (IsDevicePathEnd(DevPath)) { break; } DevPath = NextDevicePathNode(DevPath); } } if (Match == FALSE) { BlockIoBuffer[Index] = NULL; } else { *NoHandles = *NoHandles + 1; } } // // If there are no matches, then return // if (*NoHandles == 0) { FreePool(BlockIoBuffer); *NoHandles = 0; *Buffer = NULL; return EFI_SUCCESS; } // // Allocate space for the return buffer of device handles. // *Buffer = AllocatePool(*NoHandles * sizeof(EFI_HANDLE)); if (*Buffer == NULL) { FreePool(BlockIoBuffer); *NoHandles = 0; *Buffer = NULL; return EFI_OUT_OF_RESOURCES; } // // Build list of matching device handles. // *NoHandles = 0; for(Index=0;IndexHandleProtocol, 3, DeviceHandle, &FileSystemProtocol, (VOID*)&Volume); // // Open the root directory of the volume // if (!EFI_ERROR(Status)) { Status = uefi_call_wrapper(Volume->OpenVolume, 2, Volume, &File); } // // Done // return EFI_ERROR(Status) ? NULL : File; } EFI_FILE_INFO * LibFileInfo ( IN EFI_FILE_HANDLE FHand ) { EFI_STATUS Status; EFI_FILE_INFO *Buffer; UINTN BufferSize; // // Initialize for GrowBuffer loop // Status = EFI_SUCCESS; Buffer = NULL; BufferSize = SIZE_OF_EFI_FILE_INFO + 200; // // Call the real function // while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) { Status = uefi_call_wrapper( FHand->GetInfo, 4, FHand, &GenericFileInfo, &BufferSize, Buffer ); } return Buffer; } EFI_FILE_SYSTEM_INFO * LibFileSystemInfo ( IN EFI_FILE_HANDLE FHand ) { EFI_STATUS Status; EFI_FILE_SYSTEM_INFO *Buffer; UINTN BufferSize; // // Initialize for GrowBuffer loop // Status = EFI_SUCCESS; Buffer = NULL; BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + 200; // // Call the real function // while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) { Status = uefi_call_wrapper( FHand->GetInfo, 4, FHand, &FileSystemInfo, &BufferSize, Buffer ); } return Buffer; } EFI_FILE_SYSTEM_VOLUME_LABEL_INFO * LibFileSystemVolumeLabelInfo ( IN EFI_FILE_HANDLE FHand ) { EFI_STATUS Status; EFI_FILE_SYSTEM_VOLUME_LABEL_INFO *Buffer; UINTN BufferSize; // // Initialize for GrowBuffer loop // Status = EFI_SUCCESS; Buffer = NULL; BufferSize = SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO + 200; // // Call the real function // while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) { Status = uefi_call_wrapper( FHand->GetInfo, 4, FHand, &FileSystemVolumeLabelInfo, &BufferSize, Buffer ); } return Buffer; } EFI_STATUS LibInstallProtocolInterfaces ( IN OUT EFI_HANDLE *Handle, ... ) { va_list args; EFI_STATUS Status; EFI_GUID *Protocol; VOID *Interface; EFI_TPL OldTpl; UINTN Index; EFI_HANDLE OldHandle; // // Syncronize with notifcations // OldTpl = uefi_call_wrapper(BS->RaiseTPL, 1, TPL_NOTIFY); OldHandle = *Handle; // // Install the protocol interfaces // Index = 0; Status = EFI_SUCCESS; va_start (args, Handle); while (!EFI_ERROR(Status)) { // // If protocol is NULL, then it's the end of the list // Protocol = va_arg(args, EFI_GUID *); if (!Protocol) { break; } Interface = va_arg(args, VOID *); // // Install it // DEBUG((D_INFO, "LibInstallProtocolInterface: %d %x\n", Protocol, Interface)); Status = uefi_call_wrapper(BS->InstallProtocolInterface, 4, Handle, Protocol, EFI_NATIVE_INTERFACE, Interface); if (EFI_ERROR(Status)) { break; } Index += 1; } va_end (args); // // If there was an error, remove all the interfaces that were // installed without any errors // if (EFI_ERROR(Status)) { va_start (args, Handle); while (Index) { Protocol = va_arg(args, EFI_GUID *); Interface = va_arg(args, VOID *); uefi_call_wrapper(BS->UninstallProtocolInterface, 3, *Handle, Protocol, Interface); Index -= 1; } *Handle = OldHandle; va_end (args); } // // Done // uefi_call_wrapper(BS->RestoreTPL, 1, OldTpl); return Status; } VOID LibUninstallProtocolInterfaces ( IN EFI_HANDLE Handle, ... ) { va_list args; EFI_STATUS Status; EFI_GUID *Protocol; VOID *Interface; va_start (args, Handle); for (; ;) { // // If protocol is NULL, then it's the end of the list // Protocol = va_arg(args, EFI_GUID *); if (!Protocol) { break; } Interface = va_arg(args, VOID *); // // Uninstall it // Status = uefi_call_wrapper(BS->UninstallProtocolInterface, 3, Handle, Protocol, Interface); if (EFI_ERROR(Status)) { DEBUG((D_ERROR, "LibUninstallProtocolInterfaces: failed %g, %r\n", Protocol, Handle)); } } va_end (args); } EFI_STATUS LibReinstallProtocolInterfaces ( IN OUT EFI_HANDLE *Handle, ... ) { va_list args; EFI_STATUS Status; EFI_GUID *Protocol; VOID *OldInterface, *NewInterface; EFI_TPL OldTpl; UINTN Index; // // Syncronize with notifcations // OldTpl = uefi_call_wrapper(BS->RaiseTPL, 1, TPL_NOTIFY); // // Install the protocol interfaces // Index = 0; Status = EFI_SUCCESS; va_start (args, Handle); while (!EFI_ERROR(Status)) { // // If protocol is NULL, then it's the end of the list // Protocol = va_arg(args, EFI_GUID *); if (!Protocol) { break; } OldInterface = va_arg(args, VOID *); NewInterface = va_arg(args, VOID *); // // Reinstall it // Status = uefi_call_wrapper(BS->ReinstallProtocolInterface, 4, Handle, Protocol, OldInterface, NewInterface); if (EFI_ERROR(Status)) { break; } Index += 1; } va_end (args); // // If there was an error, undo all the interfaces that were // reinstalled without any errors // if (EFI_ERROR(Status)) { va_start (args, Handle); while (Index) { Protocol = va_arg(args, EFI_GUID *); OldInterface = va_arg(args, VOID *); NewInterface = va_arg(args, VOID *); uefi_call_wrapper(BS->ReinstallProtocolInterface, 4, Handle, Protocol, NewInterface, OldInterface); Index -= 1; } va_end (args); } // // Done // uefi_call_wrapper(BS->RestoreTPL, 1, OldTpl); return Status; } ncroxon-gnu-efi-157d47c/lib/hw.c000066400000000000000000000063651471215650600164410ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: hw.c Abstract: Debug library functions for Hardware IO access Revision History --*/ #include "lib.h" EFI_STATUS InitializeGlobalIoDevice ( IN EFI_DEVICE_PATH *DevicePath, IN EFI_GUID *Protocol, IN CHAR8 *ErrorStr EFI_UNUSED, OUT EFI_DEVICE_IO_INTERFACE **GlobalIoFncs ) /*++ Routine Description: Check to see if DevicePath exists for a given Protocol. Return Error if it exists. Return GlobalIoFuncs set match the DevicePath Arguments: DevicePath - to operate on Protocol - to check the DevicePath against ErrorStr - ASCII string to display on error GlobalIoFncs - Returned with DeviceIoProtocol for the DevicePath Returns: Pass or Fail based on wether GlobalIoFncs where found --*/ { EFI_STATUS Status; EFI_HANDLE Handle; // // Check to see if this device path already has Protocol on it. // if so we are loading recursivly and should exit with an error // Status = uefi_call_wrapper(BS->LocateDevicePath, 3, Protocol, &DevicePath, &Handle); if (!EFI_ERROR(Status)) { DEBUG ((D_INIT, "Device Already Loaded for %a device\n", ErrorStr)); return EFI_LOAD_ERROR; } Status = uefi_call_wrapper(BS->LocateDevicePath, 3, &DeviceIoProtocol, &DevicePath, &Handle); if (!EFI_ERROR(Status)) { Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handle, &DeviceIoProtocol, (VOID*)GlobalIoFncs); } ASSERT (!EFI_ERROR(Status)); return Status; } UINT32 ReadPort ( IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, IN EFI_IO_WIDTH Width, IN UINTN Port ) { UINT32 Data; EFI_STATUS Status EFI_UNUSED; Status = uefi_call_wrapper(GlobalIoFncs->Io.Read, 5, GlobalIoFncs, Width, (UINT64)Port, 1, &Data); ASSERT(!EFI_ERROR(Status)); return Data; } UINT32 WritePort ( IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, IN EFI_IO_WIDTH Width, IN UINTN Port, IN UINTN Data ) { EFI_STATUS Status EFI_UNUSED; Status = uefi_call_wrapper(GlobalIoFncs->Io.Write, 5, GlobalIoFncs, Width, (UINT64)Port, 1, &Data); ASSERT(!EFI_ERROR(Status)); return (UINT32)Data; } UINT32 ReadPciConfig ( IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, IN EFI_IO_WIDTH Width, IN UINTN Address ) { UINT32 Data; EFI_STATUS Status EFI_UNUSED; Status = uefi_call_wrapper(GlobalIoFncs->Pci.Read, 5, GlobalIoFncs, Width, (UINT64)Address, 1, &Data); ASSERT(!EFI_ERROR(Status)); return Data; } UINT32 WritePciConfig ( IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, IN EFI_IO_WIDTH Width, IN UINTN Address, IN UINTN Data ) { EFI_STATUS Status EFI_UNUSED; Status = uefi_call_wrapper(GlobalIoFncs->Pci.Write, 5, GlobalIoFncs, Width, (UINT64)Address, 1, &Data); ASSERT(!EFI_ERROR(Status)); return (UINT32)Data; } ncroxon-gnu-efi-157d47c/lib/ia32/000077500000000000000000000000001471215650600164035ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/lib/ia32/efi_stub.S000066400000000000000000000002141471215650600203240ustar00rootroot00000000000000/* This stub is a stub to make the build happy */ #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/ia32/initplat.c000066400000000000000000000004231471215650600203720ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: initplat.c Abstract: Revision History --*/ #include "lib.h" VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle EFI_UNUSED, IN EFI_SYSTEM_TABLE *SystemTable EFI_UNUSED ) { } ncroxon-gnu-efi-157d47c/lib/ia32/math.c000066400000000000000000000075151471215650600175100ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: math.c Abstract: Revision History --*/ #include "lib.h" // // Declare runtime functions // #ifdef RUNTIME_CODE #ifndef __GNUC__ #pragma RUNTIME_CODE(LShiftU64) #pragma RUNTIME_CODE(RShiftU64) #pragma RUNTIME_CODE(MultU64x32) #pragma RUNTIME_CODE(DivU64x32) #endif #endif // // // UINT64 LShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Left shift 64bit by 32bit and get a 64bit result { #ifdef __GNUC__ return Operand << Count; #else UINT64 Result; _asm { mov eax, dword ptr Operand[0] mov edx, dword ptr Operand[4] mov ecx, Count and ecx, 63 shld edx, eax, cl shl eax, cl cmp ecx, 32 jc short ls10 mov edx, eax xor eax, eax ls10: mov dword ptr Result[0], eax mov dword ptr Result[4], edx } return Result; #endif } UINT64 RShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Right shift 64bit by 32bit and get a 64bit result { #ifdef __GNUC__ return Operand >> Count; #else UINT64 Result; _asm { mov eax, dword ptr Operand[0] mov edx, dword ptr Operand[4] mov ecx, Count and ecx, 63 shrd eax, edx, cl shr edx, cl cmp ecx, 32 jc short rs10 mov eax, edx xor edx, edx rs10: mov dword ptr Result[0], eax mov dword ptr Result[4], edx } return Result; #endif } UINT64 MultU64x32 ( IN UINT64 Multiplicand, IN UINTN Multiplier ) // Multiple 64bit by 32bit and get a 64bit result { #ifdef __GNUC__ return Multiplicand * Multiplier; #else UINT64 Result; _asm { mov eax, dword ptr Multiplicand[0] mul Multiplier mov dword ptr Result[0], eax mov dword ptr Result[4], edx mov eax, dword ptr Multiplicand[4] mul Multiplier add dword ptr Result[4], eax } return Result; #endif } UINT64 DivU64x32 ( IN UINT64 Dividend, IN UINTN Divisor, OUT UINTN *Remainder OPTIONAL ) // divide 64bit by 32bit and get a 64bit result // N.B. only works for 31bit divisors!! { #if 0 && defined(__GNUC__) && !defined(__MINGW32__) if (Remainder) *Remainder = Dividend % Divisor; return Dividend / Divisor; #else UINT32 Rem; UINT32 bit; ASSERT (Divisor != 0); ASSERT ((Divisor >> 31) == 0); // // For each bit in the dividend // Rem = 0; for (bit=0; bit < 64; bit++) { #if defined(__GNUC__) || defined(__MINGW32__) __asm__ ( "shll $1, %0\n\t" "rcll $1, 4%0\n\t" "rcll $1, %2\n\t" "mov %2, %%eax\n\t" "cmp %1, %%eax\n\t" "cmc\n\t" "sbb %%eax, %%eax\n\t" "sub %%eax, %0\n\t" "and %1, %%eax\n\t" "sub %%eax, %2" : /* no outputs */ : "m"(Dividend), "m"(Divisor), "m"(Rem) : "cc","memory","%eax" ); #else _asm { shl dword ptr Dividend[0], 1 ; shift rem:dividend left one rcl dword ptr Dividend[4], 1 rcl dword ptr Rem, 1 mov eax, Rem cmp eax, Divisor ; Is Rem >= Divisor? cmc ; No - do nothing sbb eax, eax ; Else, sub dword ptr Dividend[0], eax ; set low bit in dividen and eax, Divisor ; and sub Rem, eax ; subtract divisor } #endif } if (Remainder) { *Remainder = Rem; } return Dividend; #endif } ncroxon-gnu-efi-157d47c/lib/ia32/setjmp.S000066400000000000000000000021121471215650600200250ustar00rootroot00000000000000/* * Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved. * This program and the accompanying materials are licensed and made available * under the terms and conditions of the BSD License which accompanies this * distribution. The full text of the license may be found at * http://opensource.org/licenses/bsd-license.php. * * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR * IMPLIED. */ .text .globl setjmp #ifndef __MINGW32__ .type setjmp, @function #else .def setjmp; .scl 2; .type 32; .endef #endif setjmp: pop %ecx movl (%esp), %edx movl %ebx, (%edx) movl %esi, 4(%edx) movl %edi, 8(%edx) movl %ebp, 12(%edx) movl %esp, 16(%edx) xorl %eax, %eax jmp *%ecx .globl longjmp #ifndef __MINGW32__ .type longjmp, @function #else .def longjmp; .scl 2; .type 32; .endef #endif longjmp: pop %eax pop %edx pop %eax movl (%edx), %ebx movl 4(%edx), %esi movl 8(%edx), %edi #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/ia64/000077500000000000000000000000001471215650600164105ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/lib/ia64/initplat.c000066400000000000000000000006701471215650600204030ustar00rootroot00000000000000/*++ Copyright (c) 1999 Intel Corporation Module Name: initplat.c Abstract: Functions to make SAL and PAL proc calls Revision History --*/ #include "lib.h" //#include "palproc.h" VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle EFI_UNUSED, IN EFI_SYSTEM_TABLE *SystemTable EFI_UNUSED ) { PLABEL SalPlabel; UINT64 PalEntry; LibInitSalAndPalProc (&SalPlabel, &PalEntry); } ncroxon-gnu-efi-157d47c/lib/ia64/math.c000066400000000000000000000022401471215650600175030ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: math.c Abstract: Revision History --*/ #include "lib.h" // // Declare runtime functions // #ifdef RUNTIME_CODE #ifndef __GNUC__ #pragma RUNTIME_CODE(LShiftU64) #pragma RUNTIME_CODE(RShiftU64) #pragma RUNTIME_CODE(MultU64x32) #pragma RUNTIME_CODE(DivU64x32) #endif #endif // // // UINT64 LShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Left shift 64bit by 32bit and get a 64bit result { return Operand << Count; } UINT64 RShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Right shift 64bit by 32bit and get a 64bit result { return Operand >> Count; } UINT64 MultU64x32 ( IN UINT64 Multiplicand, IN UINTN Multiplier ) // Multiple 64bit by 32bit and get a 64bit result { return Multiplicand * Multiplier; } UINT64 DivU64x32 ( IN UINT64 Dividend, IN UINTN Divisor, OUT UINTN *Remainder OPTIONAL ) // divide 64bit by 32bit and get a 64bit result // N.B. only works for 31bit divisors!! { ASSERT (Divisor != 0); if (Remainder) { *Remainder = Dividend % Divisor; } return Dividend / Divisor; } ncroxon-gnu-efi-157d47c/lib/ia64/palproc.S000066400000000000000000000121241471215650600201740ustar00rootroot00000000000000//++ // Copyright (c) 1996-99 Intel Corp. // // // Module Name: // // palproc.s // // Abstract: // // Contains an implementation for making PAL PROC calls on // IA-64 architecture. // // // // Revision History: // //-- .file "palproc.s" #include "palproc.h" //----------------------------------------------------------------------------- //++ // MakeStaticPALCall // // This routine is called whenever an architected static calling convention // based PAL call is to be made. This call does use RSE actually, but our policy // in making static PAL calls before memory is available is to make sure that // we do not nest too deep and allocate beyond 96 banked registers. In other // words we carefully code calls and control flow before memory is available. // // Arguments : All parameters set up to do static PAL call. // // On Entry : // // Return Value: // // As per static calling conventions. // //-- //--------------------------------------------------------------------------- PROCEDURE_ENTRY(MakeStaticPALCall) NESTED_SETUP (5,8,0,0) mov loc3 = b5 mov loc4 = r2 mov loc7 = r1;; movl loc6 = PAL_MC_CLEAR_LOG mov r2 = psr;; mov loc5 = r2 cmp.eq p6,p7 = r28,loc6;; (p7)movl loc6 = PAL_MC_DYNAMIC_STATE;; (p7)cmp.eq p6,p7 = r28,loc6;; (p7)movl loc6 = PAL_MC_ERROR_INFO;; (p7)cmp.eq p6,p7 = r28,loc6;; (p7)movl loc6 = PAL_MC_RESUME;; (p7)cmp.eq p6,p7 = r28,loc6 mov loc6 = 0x1;; (p7)dep r2 = loc6,r2,13,1;; // psr.ic = 1 // p6 will be true, if it is one of the MCHK calls. There has been lots of debate // on psr.ic for these values. For now, do not do any thing to psr.ic // (p6)dep r2 = r0,r2,13,1;; // psr.ic = 0 dep r2 = r0,r2,14,1;; // psr.i = 0 mov psr.l = r2 srlz.d;; // Needs data serailization. srlz.i;; // Needs instruction serailization. StaticGetPALLocalIP: mov loc2 = ip;; add loc2 = StaticComeBackFromPALCall - StaticGetPALLocalIP,loc2;; mov b0 = loc2 // return address after Pal call mov r28 = in1 // get the input parameters to PAL call mov r29 = in2 mov r30 = in3;; mov r31 = in4 mov b5 = in0;; // get the PalProcEntrypt from input br.sptk b5 // Take the plunge. StaticComeBackFromPALCall: mov psr.l = loc5;; srlz.d;; // Needs data serailization. srlz.i;; // Needs instruction serailization. mov b5 = loc3 mov r2 = loc4 mov r1 = loc7 NESTED_RETURN PROCEDURE_EXIT(MakeStaticPALCall) //----------------------------------------------------------------------------- //++ // MakeStackedPALCall // // This routine is called whenever an architected stacked calling convention // based PAL call is to be made. This call is made after memory is available. // Although stacked calls could be made directly from 'C', there is a PAL // requirement which forces the index to be in GR28 and hence this stub is // needed // // Arguments : All parameters set up to do stacted PAL call. // // On Entry : // in0: PAL_PROC entrypoint // in1-in4 : PAL_PROC arguments // // Return Value: // // As per stacked calling conventions. // //-- //--------------------------------------------------------------------------- PROCEDURE_ENTRY(MakeStackedPALCall) NESTED_SETUP (5,8,4,0) mov loc3 = b5 mov loc4 = r2 mov loc7 = r1 mov r2 = psr;; mov loc5 = r2;; dep r2 = r0,r2,14,1;; // psr.i = 0 mov psr.l = r2 srlz.d;; // Needs data serailization. srlz.i;; // Needs instruction serailization. StackedGetPALLocalIP: mov r28 = in1 // get the input parameters to PAL call mov out0 = in1 mov out1 = in2;; mov out2 = in3 mov out3 = in4 mov b5 = in0;; // get the PalProcEntrypt from input br.call.dpnt b0=b5;; // Take the plunge. StackedComeBackFromPALCall: mov psr.l = loc5;; srlz.d;; // Needs data serailization. srlz.i;; // Needs instruction serailization. mov b5 = loc3 mov r2 = loc4 mov r1 = loc7 NESTED_RETURN PROCEDURE_EXIT(MakeStackedPALCall) #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/ia64/palproc.h000066400000000000000000000024021471215650600202170ustar00rootroot00000000000000// // // Copyright (c) 1996-99 Intel Corp. // // //Module Name: // // palproc.h // //Abstract: // // This module contains generic macros for an IA64 assembly writer. // // //Revision History // #ifndef _PALPROC_H #define _PALPROC_H #define PROCEDURE_ENTRY(name) .##text; \ .##type name, @function; \ .##global name; \ .##proc name; \ name: #define PROCEDURE_EXIT(name) .##endp name // Note: use of NESTED_SETUP requires number of locals (l) >= 3 #define NESTED_SETUP(i,l,o,r) \ alloc loc1=ar##.##pfs,i,l,o,r ;\ mov loc0=b0 #define NESTED_RETURN \ mov b0=loc0 ;\ mov ar##.##pfs=loc1 ;;\ br##.##ret##.##dpnt b0;; // defines needed in palproc.s #define PAL_MC_CLEAR_LOG 0x0015 #define PAL_MC_DRAIN 0x0016 #define PAL_MC_EXPECTED 0x0017 #define PAL_MC_DYNAMIC_STATE 0x0018 #define PAL_MC_ERROR_INFO 0x0019 #define PAL_MC_RESUME 0x001a #define PAL_MC_REGISTER_MEM 0x001b #endif // _PALPROC_H ncroxon-gnu-efi-157d47c/lib/ia64/salpal.c000066400000000000000000000174721471215650600200430ustar00rootroot00000000000000/*++ Copyright (c) 1999 Intel Corporation Module Name: salpal.c Abstract: Functions to make SAL and PAL proc calls Revision History --*/ #include "lib.h" #include "palproc.h" #include "salproc.h" /*++ Copyright (c) 1999 Intel Corporation Module Name: EfiRtLib.h Abstract: EFI Runtime library functions Revision History --*/ #include "efi.h" #include "efilib.h" rArg MakeStaticPALCall ( IN UINT64 PALPROCPtr, IN UINT64 Arg1, IN UINT64 Arg2, IN UINT64 Arg3, IN UINT64 Arg4 ); rArg MakeStackedPALCall ( IN UINT64 PALPROCPtr, IN UINT64 Arg1, IN UINT64 Arg2, IN UINT64 Arg3, IN UINT64 Arg4 ); PLABEL SalProcPlabel; PLABEL PalProcPlabel; CALL_SAL_PROC GlobalSalProc; CALL_PAL_PROC GlobalPalProc; VOID LibInitSalAndPalProc ( OUT PLABEL *SalPlabel, OUT UINT64 *PalEntry ) { SAL_SYSTEM_TABLE_ASCENDING_ORDER *SalSystemTable; EFI_STATUS Status; GlobalSalProc = NULL; GlobalPalProc = NULL; Status = LibGetSystemConfigurationTable(&SalSystemTableGuid, (VOID **)&SalSystemTable); if (EFI_ERROR(Status)) { return; } // // BugBug: Add code to test checksum on the Sal System Table // if (SalSystemTable->Entry0.Type != 0) { return; } SalProcPlabel.ProcEntryPoint = SalSystemTable->Entry0.SalProcEntry; SalProcPlabel.GP = SalSystemTable->Entry0.GlobalDataPointer; GlobalSalProc = (CALL_SAL_PROC)&SalProcPlabel.ProcEntryPoint; // // Need to check the PAL spec to make sure I'm not responsible for // storing more state. // We are passing in a Plabel that should be ignorred by the PAL. Call // this way will cause use to retore our gp after the PAL returns. // PalProcPlabel.ProcEntryPoint = SalSystemTable->Entry0.PalProcEntry; PalProcPlabel.GP = SalSystemTable->Entry0.GlobalDataPointer; GlobalPalProc = (CALL_PAL_PROC)PalProcPlabel.ProcEntryPoint; *PalEntry = PalProcPlabel.ProcEntryPoint; *SalPlabel = SalProcPlabel; } EFI_STATUS LibGetSalIoPortMapping ( OUT UINT64 *IoPortMapping ) /*++ Get the IO Port Map from the SAL System Table. DO NOT USE THIS TO DO YOU OWN IO's!!!!!!!!!!!! Only use this for getting info, or initing the built in EFI IO abstraction. Always use the EFI Device IO protoocl to access IO space. --*/ { SAL_SYSTEM_TABLE_ASCENDING_ORDER *SalSystemTable; SAL_ST_MEMORY_DESCRIPTOR_ENTRY *SalMemDesc; EFI_STATUS Status; Status = LibGetSystemConfigurationTable(&SalSystemTableGuid, (VOID **)&SalSystemTable); if (EFI_ERROR(Status)) { return EFI_UNSUPPORTED; } // // BugBug: Add code to test checksum on the Sal System Table // if (SalSystemTable->Entry0.Type != 0) { return EFI_UNSUPPORTED; } // // The SalSystemTable pointer includes the Type 0 entry. // The SalMemDesc is Type 1 so it comes next. // SalMemDesc = (SAL_ST_MEMORY_DESCRIPTOR_ENTRY *)(SalSystemTable + 1); while (SalMemDesc->Type == SAL_ST_MEMORY_DESCRIPTOR) { if (SalMemDesc->MemoryType == SAL_IO_PORT_MAPPING) { *IoPortMapping = SalMemDesc->PhysicalMemoryAddress; return EFI_SUCCESS; } SalMemDesc++; } return EFI_UNSUPPORTED; } EFI_STATUS LibGetSalIpiBlock ( OUT UINT64 *IpiBlock ) /*++ Get the IPI block from the SAL system table --*/ { SAL_SYSTEM_TABLE_ASCENDING_ORDER *SalSystemTable; SAL_ST_MEMORY_DESCRIPTOR_ENTRY *SalMemDesc; EFI_STATUS Status; Status = LibGetSystemConfigurationTable(&SalSystemTableGuid, (VOID*)&SalSystemTable); if (EFI_ERROR(Status)) { return EFI_UNSUPPORTED; } // // BugBug: Add code to test checksum on the Sal System Table // if (SalSystemTable->Entry0.Type != 0) { return EFI_UNSUPPORTED; } // // The SalSystemTable pointer includes the Type 0 entry. // The SalMemDesc is Type 1 so it comes next. // SalMemDesc = (SAL_ST_MEMORY_DESCRIPTOR_ENTRY *)(SalSystemTable + 1); while (SalMemDesc->Type == SAL_ST_MEMORY_DESCRIPTOR) { if (SalMemDesc->MemoryType == SAL_SAPIC_IPI_BLOCK ) { *IpiBlock = SalMemDesc->PhysicalMemoryAddress; return EFI_SUCCESS; } SalMemDesc++; } return EFI_UNSUPPORTED; } EFI_STATUS LibGetSalWakeupVector ( OUT UINT64 *WakeVector ) /*++ Get the wakeup vector from the SAL system table --*/ { SAL_ST_AP_WAKEUP_DECRIPTOR *ApWakeUp; ApWakeUp = LibSearchSalSystemTable (SAL_ST_AP_WAKEUP); if (!ApWakeUp) { *WakeVector = -1; return EFI_UNSUPPORTED; } *WakeVector = ApWakeUp->ExternalInterruptVector; return EFI_SUCCESS; } VOID * LibSearchSalSystemTable ( IN UINT8 EntryType ) { EFI_STATUS Status; UINT8 *SalTableHack; SAL_SYSTEM_TABLE_ASCENDING_ORDER *SalSystemTable; UINT16 EntryCount; UINT16 Count; Status = LibGetSystemConfigurationTable(&SalSystemTableGuid, (VOID*)&SalSystemTable); if (EFI_ERROR(Status)) { return NULL; } EntryCount = SalSystemTable->Header.EntryCount; if (EntryCount == 0) { return NULL; } // // BugBug: Add code to test checksum on the Sal System Table // SalTableHack = (UINT8 *)&SalSystemTable->Entry0; for (Count = 0; Count < EntryCount ;Count++) { if (*SalTableHack == EntryType) { return (VOID *)SalTableHack; } switch (*SalTableHack) { case SAL_ST_ENTRY_POINT: SalTableHack += 48; break; case SAL_ST_MEMORY_DESCRIPTOR: SalTableHack += 32; break; case SAL_ST_PLATFORM_FEATURES: SalTableHack += 16; break; case SAL_ST_TR_USAGE: SalTableHack += 32; break; case SAL_ST_PTC: SalTableHack += 16; break; case SAL_ST_AP_WAKEUP: SalTableHack += 16; break; default: ASSERT(FALSE); break; } } return NULL; } VOID LibSalProc ( IN UINT64 Arg1, IN UINT64 Arg2, IN UINT64 Arg3, IN UINT64 Arg4, IN UINT64 Arg5, IN UINT64 Arg6, IN UINT64 Arg7, IN UINT64 Arg8, OUT rArg *Results OPTIONAL ) { rArg ReturnValue; ReturnValue.p0 = -3; // SAL status return completed with error if (GlobalSalProc) { ReturnValue = GlobalSalProc(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8); } if (Results) { CopyMem (Results, &ReturnValue, sizeof(rArg)); } } VOID LibPalProc ( IN UINT64 Arg1, // Pal Proc index IN UINT64 Arg2, IN UINT64 Arg3, IN UINT64 Arg4, OUT rArg *Results OPTIONAL ) { rArg ReturnValue; ReturnValue.p0 = -3; // PAL status return completed with error // // check for valid PalProc entry point // if (!GlobalPalProc) { if (Results) CopyMem (Results, &ReturnValue, sizeof(rArg)); return; } // // check if index falls within stacked or static register calling conventions // and call appropriate Pal stub call // if (((Arg1 >=255) && (Arg1 <=511)) || ((Arg1 >=768) && (Arg1 <=1023))) { ReturnValue = MakeStackedPALCall((UINT64)GlobalPalProc,Arg1,Arg2,Arg3,Arg4); } else { ReturnValue = MakeStaticPALCall((UINT64)GlobalPalProc,Arg1,Arg2,Arg3,Arg4); } if (Results) CopyMem (Results, &ReturnValue, sizeof(rArg)); return; } ncroxon-gnu-efi-157d47c/lib/ia64/setjmp.S000066400000000000000000000101371471215650600200400ustar00rootroot00000000000000/* * Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved. * This program and the accompanying materials are licensed and made available * under the terms and conditions of the BSD License which accompanies this * distribution. The full text of the license may be found at * http://opensource.org/licenses/bsd-license.php. * * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR * IMPLIED. */ .text .globl setjmp .type setjmp, @function setjmp: alloc loc0 = ar.pfs, 1, 2, 1, 0 ;; mov r14 = ar.unat mov r15 = ar.bsp add r10 = 0x10*20, in0 ;; stf.spill.nta [in0] = f2, 0x10 st8.spill.nta [r10] = r4, 8 mov r21 = b1 ;; stf.spill.nta [in0] = f3, 0x10 st8.spill.nta [r10] = r5, 8 mov r22 = b2 ;; stf.spill.nta [in0] = f4, 0x10 st8.spill.nta [r10] = r6, 8 mov r23 = b3 ;; stf.spill.nta [in0] = f5, 0x10 st8.spill.nta [r10] = r7, 8 mov r24 = b4 ;; stf.spill.nta [in0] = f16, 0x10 st8.spill.nta [r10] = sp, 8 mov r25 = b5 ;; stf.spill.nta [in0] = f17, 0x10 st8.nta [r10] = loc1, 8 mov r16 = pr ;; stf.spill.nta [in0] = f18, 0x10 st8.nta [r10] = r21, 8 mov r17 = ar.lc ;; stf.spill.nta [in0] = f19, 0x10 st8.nta [r10] = r22, 8 ;; stf.spill.nta [in0] = f20, 0x10 st8.nta [r10] = r23, 8 ;; stf.spill.nta [in0] = f21, 0x10 st8.nta [r10] = r24, 8 ;; stf.spill.nta [in0] = f22, 0x10 st8.nta [r10] = r25, 8 ;; stf.spill.nta [in0] = f23, 0x10 mov r18 = ar.unat ;; stf.spill.nta [in0] = f24, 0x10 st8.nta [r10] = r14, 8 ;; stf.spill.nta [in0] = f25, 0x10 st8.nta [r10] = r18, 8 ;; stf.spill.nta [in0] = f26, 0x10 st8.nta [r10] = loc0, 8 ;; stf.spill.nta [in0] = f27, 0x10 st8.nta [r10] = r15, 8 mov r8 = 0 ;; stf.spill.nta [in0] = f28, 0x10 mov r19 = ar.fpsr ;; stf.spill.nta [in0] = f29, 0x10 st8.nta [r10] = r16, 8 mov ar.pfs = loc0 ;; stf.spill.nta [in0] = f30, 0x10 st8.nta [r10] = r17, 8 mov b0 = loc1 ;; stf.spill.nta [in0] = f31, 0x10 st8.nta [r10] = r19 ;; mov ar.unat = r14 br.ret.sptk b0 ;; .globl longjmp .type longjmp, @function .regstk 2, 0, 0, 0 longjmp: add r10 = 0x10*20 + 8*14, in0 movl r2 = ~((((1<<14) - 1) << 16) | 3) ;; ld8.nt1 r14 = [r10], -8*2 mov r15 = ar.bspstore ;; ld8.nt1 r17 = [r10], -8 mov r16 = ar.rsc cmp.leu p6 = r14, r15 ;; ld8.nt1 r18 = [r10], -8 ld8.nt1 r25 = [r10], -8 and r2 = r16, r2 ;; ldf.fill.nt1 f2 = [in0], 0x10 ld8.nt1 r24 = [r10], -8 mov b5 = r25 ;; mov ar.rsc = r2 ld8.nt1 r23 = [r10], -8 mov b4 = r24 ;; ldf.fill.nt1 f3 = [in0], 0x10 mov ar.unat = r17 (p6) br.spnt.many _skip_flushrs ;; flushrs mov r15 = ar.bsp ;; _skip_flushrs: mov r31 = ar.rnat loadrs ;; ldf.fill.nt1 f4 = [in0], 0x10 ld8.nt1 r22 = [r10], -8 dep r2 = -1, r14, 3, 6 ;; ldf.fill.nt1 f5 = [in0], 0x10 ld8.nt1 r21 = [r10], -8 cmp.ltu p6 = r2, r15 ;; ld8.nt1 r20 = [r10], -0x10 (p6) ld8.nta r31 = [r2] mov b3 = r23 ;; ldf.fill.nt1 f16 = [in0], 0x10 ld8.fill.nt1 r7 = [r10], -8 mov b2 = r22 ;; ldf.fill.nt1 f17 = [in0], 0x10 ld8.fill.nt1 r6 = [r10], -8 mov b1 = r21 ;; ldf.fill.nt1 f18 = [in0], 0x10 ld8.fill.nt1 r5 = [r10], -8 mov b0 = r20 ;; ldf.fill.nt1 f19 = [in0], 0x10 ld8.fill.nt1 r4 = [r10], 8*13 ;; ldf.fill.nt1 f20 = [in0], 0x10 ld8.nt1 r19 = [r10], 0x10 ;; ldf.fill.nt1 f21 = [in0], 0x10 ld8.nt1 r26 = [r10], 8 mov ar.pfs = r19 ;; ldf.fill.nt1 f22 = [in0], 0x10 ld8.nt1 r27 = [r10], 8 mov pr = r26, -1 ;; ldf.fill.nt1 f23 = [in0], 0x10 ld8.nt1 r28 = [r10], -17*8 - 0x10 mov ar.lc = r27 ;; ldf.fill.nt1 f24 = [in0], 0x10 ldf.fill.nt1 f25 = [in0], 0x10 mov r8 = in1 ;; ldf.fill.nt1 f26 = [in0], 0x10 ldf.fill.nt1 f31 = [r10], -0x10 ;; ldf.fill.nt1 f27 = [in0], 0x10 ldf.fill.nt1 f30 = [r10], -0x10 ;; ldf.fill.nt1 f28 = [in0] ldf.fill.nt1 f29 = [r10], 0x10*3 + 8*4 ;; ld8.fill.nt1 sp = [r10] mov ar.unat = r18 ;; mov ar.bspstore = r14 mov ar.rnat = r31 ;; invala mov ar.rsc = r16 br.ret.sptk b0 #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/init.c000066400000000000000000000077261471215650600167700ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: Abstract: Revision History --*/ #include "lib.h" VOID EFIDebugVariable ( VOID ); VOID InitializeLib ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) /*++ Routine Description: Initializes EFI library for use Arguments: Firmware's EFI system table Returns: None --*/ { EFI_LOADED_IMAGE *LoadedImage; EFI_STATUS Status; CHAR8 *LangCode; if (LibInitialized) return; LibInitialized = TRUE; LibFwInstance = FALSE; LibImageHandle = ImageHandle; // // Set up global pointer to the system table, boot services table, // and runtime services table // ST = SystemTable; BS = SystemTable->BootServices; RT = SystemTable->RuntimeServices; // ASSERT (CheckCrc(0, &ST->Hdr)); // ASSERT (CheckCrc(0, &BS->Hdr)); // ASSERT (CheckCrc(0, &RT->Hdr)); // // Initialize pool allocation type // if (ImageHandle) { Status = uefi_call_wrapper( BS->HandleProtocol, 3, ImageHandle, &LoadedImageProtocol, (VOID*)&LoadedImage ); if (!EFI_ERROR(Status)) { PoolAllocationType = LoadedImage->ImageDataType; } EFIDebugVariable (); } // // Initialize Guid table // InitializeGuid(); InitializeLibPlatform(ImageHandle,SystemTable); if (ImageHandle && UnicodeInterface == &LibStubUnicodeInterface) { LangCode = LibGetVariable (VarLanguage, &EfiGlobalVariable); InitializeUnicodeSupport (LangCode); if (LangCode) { FreePool (LangCode); } } } VOID InitializeUnicodeSupport ( CHAR8 *LangCode ) { EFI_UNICODE_COLLATION_INTERFACE *Ui; EFI_STATUS Status; CHAR8 *Languages; UINTN Index, Position, Length; UINTN NoHandles; EFI_HANDLE *Handles; // // If we don't know it, lookup the current language code // LibLocateHandle (ByProtocol, &UnicodeCollationProtocol, NULL, &NoHandles, &Handles); if (!LangCode || !NoHandles) { goto Done; } // // Check all driver's for a matching language code // for (Index=0; Index < NoHandles; Index++) { Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handles[Index], &UnicodeCollationProtocol, (VOID*)&Ui); if (EFI_ERROR(Status)) { continue; } // // Check for a matching language code // Languages = Ui->SupportedLanguages; Length = strlena(Languages); for (Position=0; Position < Length; Position += ISO_639_2_ENTRY_SIZE) { // // If this code matches, use this driver // if (CompareMem (Languages+Position, LangCode, ISO_639_2_ENTRY_SIZE) == 0) { UnicodeInterface = Ui; goto Done; } } } Done: // // Cleanup // if (Handles) { FreePool (Handles); } } VOID EFIDebugVariable ( VOID ) { EFI_STATUS Status; UINT32 Attributes; UINTN DataSize; UINTN NewEFIDebug; DataSize = sizeof(EFIDebug); Status = uefi_call_wrapper(RT->GetVariable, 5, u"EFIDebug", &EfiGlobalVariable, &Attributes, &DataSize, &NewEFIDebug); if (!EFI_ERROR(Status)) { EFIDebug = NewEFIDebug; } } /* * Calls to memset/memcpy may be emitted implicitly by GCC or MSVC * even when -ffreestanding or /NODEFAULTLIB are in effect. */ #ifndef __SIZE_TYPE__ #define __SIZE_TYPE__ UINTN #endif void *memset(void *s, int c, __SIZE_TYPE__ n) { unsigned char *p = s; while (n--) *p++ = c; return s; } void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n) { const unsigned char *q = src; unsigned char *p = dest; while (n--) *p++ = *q++; return dest; } ncroxon-gnu-efi-157d47c/lib/lock.c000066400000000000000000000027301471215650600167430ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: lock.c Abstract: Implements FLOCK Revision History --*/ #include "lib.h" VOID InitializeLock ( IN OUT FLOCK *Lock, IN EFI_TPL Priority ) /*++ Routine Description: Initialize a basic mutual exclusion lock. Each lock provides mutual exclusion access at it's task priority level. Since there is no-premption (at any TPL) or multiprocessor support, acquiring the lock only consists of raising to the locks TPL. Note on a debug build the lock is acquired and released to help ensure proper usage. Arguments: Lock - The FLOCK structure to initialize Priority - The task priority level of the lock Returns: An initialized F Lock structure. --*/ { Lock->Tpl = Priority; Lock->OwnerTpl = 0; Lock->Lock = 0; } VOID AcquireLock ( IN FLOCK *Lock ) /*++ Routine Description: Raising to the task priority level of the mutual exclusion lock, and then acquires ownership of the lock. Arguments: Lock - The lock to acquire Returns: Lock owned --*/ { RtAcquireLock (Lock); } VOID ReleaseLock ( IN FLOCK *Lock ) /*++ Routine Description: Releases ownership of the mutual exclusion lock, and restores the previous task priority level. Arguments: Lock - The lock to release Returns: Lock unowned --*/ { RtReleaseLock (Lock); } ncroxon-gnu-efi-157d47c/lib/loongarch64/000077500000000000000000000000001471215650600177735ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/lib/loongarch64/efi_stub.S000066400000000000000000000002211471215650600217120ustar00rootroot00000000000000/* This stub is a stub to make the build happy */ #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/loongarch64/initplat.c000066400000000000000000000016351471215650600217700ustar00rootroot00000000000000/* * Copyright (C) 2014 Linaro Ltd. * Author: Ard Biesheuvel * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #include "lib.h" VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle EFI_UNUSED, IN EFI_SYSTEM_TABLE *SystemTable EFI_UNUSED ) { } ncroxon-gnu-efi-157d47c/lib/loongarch64/math.c000066400000000000000000000030341471215650600210700ustar00rootroot00000000000000/* * Copyright (C) 2014 Linaro Ltd. * Author: Ard Biesheuvel * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #include "lib.h" UINT64 LShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Left shift 64bit by 32bit and get a 64bit result { return Operand << Count; } UINT64 RShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Right shift 64bit by 32bit and get a 64bit result { return Operand >> Count; } UINT64 MultU64x32 ( IN UINT64 Multiplicand, IN UINTN Multiplier ) // Multiple 64bit by 32bit and get a 64bit result { return Multiplicand * Multiplier; } UINT64 DivU64x32 ( IN UINT64 Dividend, IN UINTN Divisor, OUT UINTN *Remainder OPTIONAL ) // divide 64bit by 32bit and get a 64bit result // N.B. only works for 31bit divisors!! { if (Remainder) *Remainder = Dividend % Divisor; return Dividend / Divisor; } ncroxon-gnu-efi-157d47c/lib/loongarch64/setjmp.S000066400000000000000000000027261471215650600214300ustar00rootroot00000000000000/* * Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved. * Copyright (c) 2021 Loongson Technology Corporation Limited.All rights * reserved. * Author: zhoumingtao * * This program and the accompanying materials are licensed and made * available * under the terms and conditions of the BSD License which accompanies * this * distribution. The full text of the license may be found at * http://opensource.org/licenses/bsd-license.php. * * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" * BASIS, * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR * IMPLIED. */ .text .p2align 3 /* int setjmp(jmp_buf env); */ .globl setjmp .type setjmp, @function setjmp: st.d $ra, $a0, 0x0 st.d $sp, $a0, 0x8 st.d $fp, $a0, 0x10 st.d $s0, $a0, 0x18 st.d $s1, $a0, 0x20 st.d $s2, $a0, 0x28 st.d $s3, $a0, 0x30 st.d $s4, $a0, 0x38 st.d $s5, $a0, 0x40 st.d $s6, $a0, 0x48 st.d $s7, $a0, 0x50 st.d $s8, $a0, 0x58 move $a0, $zero jr $ra /* void longjmp(jmp_buf env, int val); */ .globl longjmp .type longjmp, @function longjmp: ld.d $ra, $a0, 0x0 ld.d $sp, $a0, 0x8 ld.d $fp, $a0, 0x10 ld.d $s0, $a0, 0x18 ld.d $s1, $a0, 0x20 ld.d $s2, $a0, 0x28 ld.d $s3, $a0, 0x30 ld.d $s4, $a0, 0x38 ld.d $s5, $a0, 0x40 ld.d $s6, $a0, 0x48 ld.d $s7, $a0, 0x50 ld.d $s8, $a0, 0x58 addi.d $a0, $zero, 1 # a0 = 1 beqz $a1, .L0 # if (a1 == 0); goto L0 move $a0, $a1 # a0 = a1 .L0: jr $ra ncroxon-gnu-efi-157d47c/lib/mips64el/000077500000000000000000000000001471215650600173105ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/lib/mips64el/efi_stub.S000066400000000000000000000002141471215650600212310ustar00rootroot00000000000000/* This stub is a stub to make the build happy */ #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/mips64el/initplat.c000066400000000000000000000016351471215650600213050ustar00rootroot00000000000000/* * Copyright (C) 2014 Linaro Ltd. * Author: Ard Biesheuvel * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #include "lib.h" VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle EFI_UNUSED, IN EFI_SYSTEM_TABLE *SystemTable EFI_UNUSED ) { } ncroxon-gnu-efi-157d47c/lib/mips64el/math.c000066400000000000000000000030341471215650600204050ustar00rootroot00000000000000/* * Copyright (C) 2014 Linaro Ltd. * Author: Ard Biesheuvel * * 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 and this list of conditions, without modification. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. */ #include "lib.h" UINT64 LShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Left shift 64bit by 32bit and get a 64bit result { return Operand << Count; } UINT64 RShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Right shift 64bit by 32bit and get a 64bit result { return Operand >> Count; } UINT64 MultU64x32 ( IN UINT64 Multiplicand, IN UINTN Multiplier ) // Multiple 64bit by 32bit and get a 64bit result { return Multiplicand * Multiplier; } UINT64 DivU64x32 ( IN UINT64 Dividend, IN UINTN Divisor, OUT UINTN *Remainder OPTIONAL ) // divide 64bit by 32bit and get a 64bit result // N.B. only works for 31bit divisors!! { if (Remainder) *Remainder = Dividend % Divisor; return Dividend / Divisor; } ncroxon-gnu-efi-157d47c/lib/mips64el/setjmp.S000066400000000000000000000034271471215650600207440ustar00rootroot00000000000000/* * Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved. * Copyright (c) 2017 Lemote Co. * Author: Heiher * * This program and the accompanying materials are licensed and made available * under the terms and conditions of the BSD License which accompanies this * distribution. The full text of the license may be found at * http://opensource.org/licenses/bsd-license.php. * * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR * IMPLIED. */ .text .p2align 3 .globl setjmp .type setjmp, @function setjmp: sd $ra, 0x00($a0) sd $sp, 0x08($a0) sd $fp, 0x10($a0) sd $gp, 0x18($a0) sd $s0, 0x20($a0) sd $s1, 0x28($a0) sd $s2, 0x30($a0) sd $s3, 0x38($a0) sd $s4, 0x40($a0) sd $s5, 0x48($a0) sd $s6, 0x50($a0) sd $s7, 0x58($a0) #ifdef __mips_hard_float mfc0 $v0, $12 ext $v0, $v0, 29, 1 beqz $v0, 1f s.d $f24, 0x60($a0) s.d $f25, 0x68($a0) s.d $f26, 0x70($a0) s.d $f27, 0x78($a0) s.d $f28, 0x80($a0) s.d $f29, 0x88($a0) s.d $f30, 0x90($a0) s.d $f31, 0x98($a0) 1: #endif move $v0, $zero jr $ra .globl longjmp .type longjmp, @function longjmp: ld $ra, 0x00($a0) ld $sp, 0x08($a0) ld $fp, 0x10($a0) ld $gp, 0x18($a0) ld $s0, 0x20($a0) ld $s1, 0x28($a0) ld $s2, 0x30($a0) ld $s3, 0x38($a0) ld $s4, 0x40($a0) ld $s5, 0x48($a0) ld $s6, 0x50($a0) ld $s7, 0x58($a0) #ifdef __mips_hard_float mfc0 $v0, $12 ext $v0, $v0, 29, 1 beqz $v0, 1f l.d $f24, 0x60($a0) l.d $f25, 0x68($a0) l.d $f26, 0x70($a0) l.d $f27, 0x78($a0) l.d $f28, 0x80($a0) l.d $f29, 0x88($a0) l.d $f30, 0x90($a0) l.d $f31, 0x98($a0) 1: #endif li $v0, 1 movn $v0, $a1, $a1 jr $ra #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/misc.c000066400000000000000000000276331471215650600167570ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: misc.c Abstract: Revision History --*/ #include "lib.h" // // // VOID * AllocatePool ( IN UINTN Size ) { EFI_STATUS Status; VOID *p; Status = uefi_call_wrapper(BS->AllocatePool, 3, PoolAllocationType, Size, &p); if (EFI_ERROR(Status)) { DEBUG((D_ERROR, "AllocatePool: out of pool %x\n", Status)); p = NULL; } return p; } VOID * AllocateZeroPool ( IN UINTN Size ) { VOID *p; p = AllocatePool (Size); if (p) { ZeroMem (p, Size); } return p; } VOID * EFIAPI ReallocatePool_1 ( IN UINTN OldSize, IN UINTN NewSize, IN VOID *OldPool OPTIONAL ) { VOID *NewPool; NewPool = NULL; if (NewSize) { NewPool = AllocatePool (NewSize); } if (OldPool) { if (NewPool) { CopyMem (NewPool, OldPool, OldSize < NewSize ? OldSize : NewSize); } FreePool (OldPool); } return NewPool; } VOID FreePool ( IN VOID *Buffer ) { uefi_call_wrapper(BS->FreePool, 1, Buffer); } VOID ZeroMem ( IN VOID *Buffer, IN UINTN Size ) { RtZeroMem (Buffer, Size); } VOID EFIAPI SetMem ( IN VOID *Buffer, IN UINTN Size, IN UINT8 Value ) { RtSetMem (Buffer, Size, Value); } VOID EFIAPI CopyMem_1 ( IN VOID *Dest, IN VOID *Src, IN UINTN len ) { RtCopyMem (Dest, Src, len); } VOID EFIAPI CopyMemC ( IN VOID *Dest, IN CONST VOID *Src, IN UINTN len ) { RtCopyMemC (Dest, Src, len); } INTN CompareMem ( IN CONST VOID *Dest, IN CONST VOID *Src, IN UINTN len ) { return RtCompareMem (Dest, Src, len); } BOOLEAN GrowBuffer( IN OUT EFI_STATUS *Status, IN OUT VOID **Buffer, IN UINTN BufferSize ) /*++ Routine Description: Helper function called as part of the code needed to allocate the proper sized buffer for various EFI interfaces. Arguments: Status - Current status Buffer - Current allocated buffer, or NULL BufferSize - Current buffer size needed Returns: TRUE - if the buffer was reallocated and the caller should try the API again. --*/ { BOOLEAN TryAgain; // // If this is an initial request, buffer will be null with a new buffer size // if (!*Buffer && BufferSize) { *Status = EFI_BUFFER_TOO_SMALL; } // // If the status code is "buffer too small", resize the buffer // TryAgain = FALSE; if (*Status == EFI_BUFFER_TOO_SMALL) { if (*Buffer) { FreePool (*Buffer); } *Buffer = AllocatePool (BufferSize); if (*Buffer) { TryAgain = TRUE; } else { *Status = EFI_OUT_OF_RESOURCES; } } // // If there's an error, free the buffer // if (!TryAgain && EFI_ERROR(*Status) && *Buffer) { FreePool (*Buffer); *Buffer = NULL; } return TryAgain; } EFI_MEMORY_DESCRIPTOR * LibMemoryMap ( OUT UINTN *NoEntries, OUT UINTN *MapKey, OUT UINTN *DescriptorSize, OUT UINT32 *DescriptorVersion ) { EFI_STATUS Status; EFI_MEMORY_DESCRIPTOR *Buffer; UINTN BufferSize; // // Initialize for GrowBuffer loop // Status = EFI_SUCCESS; Buffer = NULL; BufferSize = sizeof(EFI_MEMORY_DESCRIPTOR); // // Call the real function // while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) { Status = uefi_call_wrapper(BS->GetMemoryMap, 5, &BufferSize, Buffer, MapKey, DescriptorSize, DescriptorVersion); } // // Convert buffer size to NoEntries // if (!EFI_ERROR(Status)) { *NoEntries = BufferSize / *DescriptorSize; } return Buffer; } VOID * LibGetVariableAndSize ( IN CHAR16 *Name, IN EFI_GUID *VendorGuid, OUT UINTN *VarSize ) { EFI_STATUS Status = EFI_SUCCESS; VOID *Buffer; UINTN BufferSize; // // Initialize for GrowBuffer loop // Buffer = NULL; BufferSize = 100; // // Call the real function // while (GrowBuffer (&Status, &Buffer, BufferSize)) { Status = uefi_call_wrapper( RT->GetVariable, 5, Name, VendorGuid, NULL, &BufferSize, Buffer ); } if (Buffer) { *VarSize = BufferSize; } else { *VarSize = 0; } return Buffer; } VOID * LibGetVariable ( IN CHAR16 *Name, IN EFI_GUID *VendorGuid ) { UINTN VarSize; return LibGetVariableAndSize (Name, VendorGuid, &VarSize); } EFI_STATUS LibDeleteVariable ( IN CHAR16 *VarName, IN EFI_GUID *VarGuid ) { VOID *VarBuf; EFI_STATUS Status; VarBuf = LibGetVariable(VarName,VarGuid); Status = EFI_NOT_FOUND; if (VarBuf) { // // Delete variable from Storage // Status = uefi_call_wrapper( RT->SetVariable, 5, VarName, VarGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, 0, NULL ); ASSERT (!EFI_ERROR(Status)); FreePool(VarBuf); } return (Status); } EFI_STATUS LibSetNVVariable ( IN CHAR16 *VarName, IN EFI_GUID *VarGuid, IN UINTN DataSize, IN VOID *Data ) { EFI_STATUS Status; Status = uefi_call_wrapper( RT->SetVariable, 5, VarName, VarGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, DataSize, Data ); ASSERT (!EFI_ERROR(Status)); return (Status); } EFI_STATUS LibSetVariable ( IN CHAR16 *VarName, IN EFI_GUID *VarGuid, IN UINTN DataSize, IN VOID *Data ) { EFI_STATUS Status; Status = uefi_call_wrapper( RT->SetVariable, 5, VarName, VarGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, DataSize, Data ); ASSERT (!EFI_ERROR(Status)); return (Status); } EFI_STATUS LibInsertToTailOfBootOrder ( IN UINT16 BootOption, IN BOOLEAN OnlyInsertIfEmpty ) { UINT16 *BootOptionArray; UINT16 *NewBootOptionArray; UINTN VarSize; UINTN Index; EFI_STATUS Status; BootOptionArray = LibGetVariableAndSize (VarBootOrder, &EfiGlobalVariable, &VarSize); if (VarSize != 0 && OnlyInsertIfEmpty) { if (BootOptionArray) { FreePool (BootOptionArray); } return EFI_UNSUPPORTED; } VarSize += sizeof(UINT16); NewBootOptionArray = AllocatePool (VarSize); if (!NewBootOptionArray) return EFI_OUT_OF_RESOURCES; for (Index = 0; Index < ((VarSize/sizeof(UINT16)) - 1); Index++) { NewBootOptionArray[Index] = BootOptionArray[Index]; } // // Insert in the tail of the array // NewBootOptionArray[Index] = BootOption; Status = uefi_call_wrapper( RT->SetVariable, 5, VarBootOrder, &EfiGlobalVariable, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, VarSize, (VOID*) NewBootOptionArray ); FreePool (NewBootOptionArray); if (BootOptionArray) { FreePool (BootOptionArray); } return Status; } BOOLEAN ValidMBR( IN MASTER_BOOT_RECORD *Mbr, IN EFI_BLOCK_IO *BlkIo ) { UINT32 StartingLBA, EndingLBA; UINT32 NewEndingLBA; INTN i, j; BOOLEAN ValidMbr; if (Mbr->Signature != MBR_SIGNATURE) { // // The BPB also has this signature, so it can not be used alone. // return FALSE; } ValidMbr = FALSE; for (i=0; iPartition[i].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) == 0 ) { continue; } ValidMbr = TRUE; StartingLBA = EXTRACT_UINT32(Mbr->Partition[i].StartingLBA); EndingLBA = StartingLBA + EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) - 1; if (EndingLBA > BlkIo->Media->LastBlock) { // // Compatability Errata: // Some systems try to hide drive space with thier INT 13h driver // This does not hide space from the OS driver. This means the MBR // that gets created from DOS is smaller than the MBR created from // a real OS (NT & Win98). This leads to BlkIo->LastBlock being // wrong on some systems FDISKed by the OS. // // if (BlkIo->Media->LastBlock < MIN_MBR_DEVICE_SIZE) { // // If this is a very small device then trust the BlkIo->LastBlock // return FALSE; } if (EndingLBA > (BlkIo->Media->LastBlock + MBR_ERRATA_PAD)) { return FALSE; } } for (j=i+1; jPartition[j].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) == 0) { continue; } if ( EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) >= StartingLBA && EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) <= EndingLBA ) { // // The Start of this region overlaps with the i'th region // return FALSE; } NewEndingLBA = EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) + EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) - 1; if ( NewEndingLBA >= StartingLBA && NewEndingLBA <= EndingLBA ) { // // The End of this region overlaps with the i'th region // return FALSE; } } } // // Non of the regions overlapped so MBR is O.K. // return ValidMbr; } UINT8 DecimaltoBCD( IN UINT8 DecValue ) { return RtDecimaltoBCD (DecValue); } UINT8 BCDtoDecimal( IN UINT8 BcdValue ) { return RtBCDtoDecimal (BcdValue); } EFI_STATUS LibGetSystemConfigurationTable( IN EFI_GUID *TableGuid, IN OUT VOID **Table ) { UINTN Index; for(Index=0;IndexNumberOfTableEntries;Index++) { if (CompareGuid(TableGuid,&(ST->ConfigurationTable[Index].VendorGuid))) { *Table = ST->ConfigurationTable[Index].VendorTable; return EFI_SUCCESS; } } return EFI_NOT_FOUND; } CHAR16 * LibGetUiString ( IN EFI_HANDLE Handle, IN UI_STRING_TYPE StringType, IN ISO_639_2 *LangCode, IN BOOLEAN ReturnDevicePathStrOnMismatch ) { UI_INTERFACE *Ui; UI_STRING_TYPE Index; UI_STRING_ENTRY *Array; EFI_STATUS Status; Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handle, &UiProtocol, (VOID *)&Ui); if (EFI_ERROR(Status)) { return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL; } // // Skip the first strings // for (Index = UiDeviceString, Array = Ui->Entry; Index < StringType; Index++, Array++) { while (Array->LangCode) { Array++; } } // // Search for the match // while (Array->LangCode) { if (strcmpa (Array->LangCode, LangCode) == 0) { return Array->UiString; } } return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL; } ncroxon-gnu-efi-157d47c/lib/pause.c000066400000000000000000000004541471215650600171310ustar00rootroot00000000000000#include "lib.h" VOID Pause( VOID ) // Pause until any key is pressed { EFI_INPUT_KEY Key; EFI_STATUS Status EFI_UNUSED; WaitForSingleEvent(ST->ConIn->WaitForKey, 0); Status = uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, &Key); ASSERT(!EFI_ERROR(Status)); } ncroxon-gnu-efi-157d47c/lib/print.c000066400000000000000000000742001471215650600171500ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: print.c Abstract: Revision History --*/ #include "lib.h" #include "efistdarg.h" // !!! // // Declare runtime functions // #ifdef RUNTIME_CODE #ifndef __GNUC__ #pragma RUNTIME_CODE(DbgPrint) // For debugging.. /* #pragma RUNTIME_CODE(_Print) #pragma RUNTIME_CODE(PFLUSH) #pragma RUNTIME_CODE(PSETATTR) #pragma RUNTIME_CODE(PPUTC) #pragma RUNTIME_CODE(PGETC) #pragma RUNTIME_CODE(PITEM) #pragma RUNTIME_CODE(ValueToHex) #pragma RUNTIME_CODE(ValueToString) #pragma RUNTIME_CODE(TimeToString) */ #endif /* !defined(__GNUC__) */ #endif // // // #define PRINT_STRING_LEN 200 #define PRINT_ITEM_BUFFER_LEN 100 typedef struct { BOOLEAN Ascii; UINTN Index; union { CONST CHAR16 *pw; CONST CHAR8 *pc; } un; } POINTER; #define pw un.pw #define pc un.pc typedef struct _pitem { POINTER Item; CHAR16 Scratch[PRINT_ITEM_BUFFER_LEN]; UINTN Width; UINTN FieldWidth; UINTN *WidthParse; CHAR16 Pad; BOOLEAN PadBefore; BOOLEAN Comma; BOOLEAN Long; } PRINT_ITEM; typedef struct _pstate { // Input POINTER fmt; va_list args; // Output CHAR16 *Buffer; CHAR16 *End; CHAR16 *Pos; UINTN Len; UINTN Attr; UINTN RestoreAttr; UINTN AttrNorm; UINTN AttrHighlight; UINTN AttrError; INTN (EFIAPI *Output)(VOID *context, CHAR16 *str); INTN (EFIAPI *SetAttr)(VOID *context, UINTN attr); VOID *Context; // Current item being formatted struct _pitem *Item; } PRINT_STATE; // // Internal fucntions // STATIC UINTN _Print ( IN PRINT_STATE *ps ); STATIC UINTN _IPrint ( IN UINTN Column, IN UINTN Row, IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, IN CONST CHAR16 *fmt, IN CONST CHAR8 *fmta, IN va_list args ); STATIC INTN EFIAPI _DbgOut ( IN VOID *Context, IN CHAR16 *Buffer ); STATIC VOID PFLUSH ( IN OUT PRINT_STATE *ps ); STATIC VOID PPUTC ( IN OUT PRINT_STATE *ps, IN CHAR16 c ); STATIC VOID PITEM ( IN OUT PRINT_STATE *ps ); STATIC CHAR16 PGETC ( IN POINTER *p ); STATIC VOID PSETATTR ( IN OUT PRINT_STATE *ps, IN UINTN Attr ); // // // INTN EFIAPI _SPrint ( IN VOID *Context, IN CHAR16 *Buffer ); INTN EFIAPI _PoolPrint ( IN VOID *Context, IN CHAR16 *Buffer ); INTN DbgPrint ( IN INTN mask, IN CONST CHAR8 *fmt, ... ) /*++ Routine Description: Prints a formatted unicode string to the default StandardError console Arguments: mask - Bit mask of debug string. If a bit is set in the mask that is also set in EFIDebug the string is printed; otherwise, the string is not printed fmt - Format string Returns: Length of string printed to the StandardError console --*/ { SIMPLE_TEXT_OUTPUT_INTERFACE *DbgOut; PRINT_STATE ps; va_list args; UINTN back; UINTN attr; UINTN SavedAttribute; if (!(EFIDebug & mask)) { return 0; } va_start (args, fmt); ZeroMem (&ps, sizeof(ps)); ps.Output = _DbgOut; ps.fmt.Ascii = TRUE; ps.fmt.pc = fmt; va_copy(ps.args, args); ps.Attr = EFI_TEXT_ATTR(EFI_LIGHTGRAY, EFI_RED); DbgOut = LibRuntimeDebugOut; if (!DbgOut) { DbgOut = ST->StdErr; } if (DbgOut) { ps.Attr = DbgOut->Mode->Attribute; ps.Context = DbgOut; ps.SetAttr = (INTN (EFIAPI *)(VOID *, UINTN)) DbgOut->SetAttribute; } SavedAttribute = ps.Attr; back = (ps.Attr >> 4) & 0xf; ps.AttrNorm = EFI_TEXT_ATTR(EFI_LIGHTGRAY, back); ps.AttrHighlight = EFI_TEXT_ATTR(EFI_WHITE, back); ps.AttrError = EFI_TEXT_ATTR(EFI_YELLOW, back); attr = ps.AttrNorm; if (mask & D_WARN) { attr = ps.AttrHighlight; } if (mask & D_ERROR) { attr = ps.AttrError; } if (ps.SetAttr) { ps.Attr = attr; uefi_call_wrapper(ps.SetAttr, 2, ps.Context, attr); } _Print (&ps); va_end (ps.args); va_end (args); // // Restore original attributes // if (ps.SetAttr) { uefi_call_wrapper(ps.SetAttr, 2, ps.Context, SavedAttribute); } return 0; } STATIC INTN IsLocalPrint(void *func) { if (func == _DbgOut || func == _SPrint || func == _PoolPrint) return 1; return 0; } STATIC INTN EFIAPI _DbgOut ( IN VOID *Context, IN CHAR16 *Buffer ) // Append string worker for DbgPrint { SIMPLE_TEXT_OUTPUT_INTERFACE *DbgOut; DbgOut = Context; // if (!DbgOut && ST && ST->ConOut) { // DbgOut = ST->ConOut; // } if (DbgOut) { if (IsLocalPrint(DbgOut->OutputString)) DbgOut->OutputString(DbgOut, Buffer); else uefi_call_wrapper(DbgOut->OutputString, 2, DbgOut, Buffer); } return 0; } INTN EFIAPI _SPrint ( IN VOID *Context, IN CHAR16 *Buffer ) // Append string worker for UnicodeSPrint, PoolPrint and CatPrint { UINTN len; POOL_PRINT *spc; spc = Context; len = StrLen(Buffer); // // Is the string is over the max truncate it // if (spc->len + len > spc->maxlen) { len = spc->maxlen - spc->len; } // // Append the new text // CopyMem (spc->str + spc->len, Buffer, len * sizeof(CHAR16)); spc->len += len; // // Null terminate it // if (spc->len < spc->maxlen) { spc->str[spc->len] = 0; } else if (spc->maxlen) { spc->str[spc->maxlen] = 0; } return 0; } INTN EFIAPI _PoolPrint ( IN VOID *Context, IN CHAR16 *Buffer ) // Append string worker for PoolPrint and CatPrint { UINTN newlen; POOL_PRINT *spc; spc = Context; newlen = spc->len + StrLen(Buffer) + 1; // // Is the string is over the max, grow the buffer // if (newlen > spc->maxlen) { // // Grow the pool buffer // newlen += PRINT_STRING_LEN; spc->maxlen = newlen; spc->str = ReallocatePool ( spc->len * sizeof(CHAR16), spc->maxlen * sizeof(CHAR16), spc->str ); if (!spc->str) { spc->len = 0; spc->maxlen = 0; } } // // Append the new text // return _SPrint (Context, Buffer); } VOID _PoolCatPrint ( IN CONST CHAR16 *fmt, IN va_list args, IN OUT POOL_PRINT *spc, IN INTN (EFIAPI *Output)(VOID *context, CHAR16 *str) ) // Dispatch function for UnicodeSPrint, PoolPrint, and CatPrint { PRINT_STATE ps; ZeroMem (&ps, sizeof(ps)); ps.Output = Output; ps.Context = spc; ps.fmt.pw = fmt; va_copy(ps.args, args); _Print (&ps); va_end(ps.args); } UINTN UnicodeVSPrint ( OUT CHAR16 *Str, IN UINTN StrSize, IN CONST CHAR16 *fmt, va_list args ) /*++ Routine Description: Prints a formatted unicode string to a buffer using a va_list Arguments: Str - Output buffer to print the formatted string into StrSize - Size of Str. String is truncated to this size. A size of 0 means there is no limit fmt - The format string args - va_list Returns: String length returned in buffer --*/ { POOL_PRINT spc; spc.str = Str; spc.maxlen = StrSize / sizeof(CHAR16) - 1; spc.len = 0; _PoolCatPrint (fmt, args, &spc, _SPrint); return spc.len; } UINTN UnicodeSPrint ( OUT CHAR16 *Str, IN UINTN StrSize, IN CONST CHAR16 *fmt, ... ) /*++ Routine Description: Prints a formatted unicode string to a buffer Arguments: Str - Output buffer to print the formatted string into StrSize - Size of Str. String is truncated to this size. A size of 0 means there is no limit fmt - The format string Returns: String length returned in buffer --*/ { va_list args; UINTN len; va_start (args, fmt); len = UnicodeVSPrint(Str, StrSize, fmt, args); va_end (args); return len; } CHAR16 * VPoolPrint ( IN CONST CHAR16 *fmt, va_list args ) /*++ Routine Description: Prints a formatted unicode string to allocated pool using va_list argument. The caller must free the resulting buffer. Arguments: fmt - The format string args - The arguments in va_list form Returns: Allocated buffer with the formatted string printed in it. The caller must free the allocated buffer. The buffer allocation is not packed. --*/ { POOL_PRINT spc; ZeroMem (&spc, sizeof(spc)); _PoolCatPrint (fmt, args, &spc, _PoolPrint); return spc.str; } CHAR16 * PoolPrint ( IN CONST CHAR16 *fmt, ... ) /*++ Routine Description: Prints a formatted unicode string to allocated pool. The caller must free the resulting buffer. Arguments: fmt - The format string Returns: Allocated buffer with the formatted string printed in it. The caller must free the allocated buffer. The buffer allocation is not packed. --*/ { va_list args; CHAR16 *pool; va_start (args, fmt); pool = VPoolPrint(fmt, args); va_end (args); return pool; } CHAR16 * CatPrint ( IN OUT POOL_PRINT *Str, IN CONST CHAR16 *fmt, ... ) /*++ Routine Description: Concatenates a formatted unicode string to allocated pool. The caller must free the resulting buffer. Arguments: Str - Tracks the allocated pool, size in use, and amount of pool allocated. fmt - The format string Returns: Allocated buffer with the formatted string printed in it. The caller must free the allocated buffer. The buffer allocation is not packed. --*/ { va_list args; va_start (args, fmt); _PoolCatPrint (fmt, args, Str, _PoolPrint); va_end (args); return Str->str; } UINTN Print ( IN CONST CHAR16 *fmt, ... ) /*++ Routine Description: Prints a formatted unicode string to the default console Arguments: fmt - Format string Returns: Length of string printed to the console --*/ { va_list args; UINTN back; va_start (args, fmt); back = _IPrint ((UINTN) -1, (UINTN) -1, ST->ConOut, fmt, NULL, args); va_end (args); return back; } UINTN VPrint ( IN CONST CHAR16 *fmt, va_list args ) /*++ Routine Description: Prints a formatted unicode string to the default console using a va_list Arguments: fmt - Format string args - va_list Returns: Length of string printed to the console --*/ { return _IPrint ((UINTN) -1, (UINTN) -1, ST->ConOut, fmt, NULL, args); } UINTN PrintAt ( IN UINTN Column, IN UINTN Row, IN CONST CHAR16 *fmt, ... ) /*++ Routine Description: Prints a formatted unicode string to the default console, at the supplied cursor position Arguments: Column, Row - The cursor position to print the string at fmt - Format string Returns: Length of string printed to the console --*/ { va_list args; UINTN back; va_start (args, fmt); back = _IPrint (Column, Row, ST->ConOut, fmt, NULL, args); va_end (args); return back; } UINTN IPrint ( IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, IN CONST CHAR16 *fmt, ... ) /*++ Routine Description: Prints a formatted unicode string to the specified console Arguments: Out - The console to print the string too fmt - Format string Returns: Length of string printed to the console --*/ { va_list args; UINTN back; va_start (args, fmt); back = _IPrint ((UINTN) -1, (UINTN) -1, Out, fmt, NULL, args); va_end (args); return back; } UINTN IPrintAt ( IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, IN UINTN Column, IN UINTN Row, IN CONST CHAR16 *fmt, ... ) /*++ Routine Description: Prints a formatted unicode string to the specified console, at the supplied cursor position Arguments: Out - The console to print the string to Column, Row - The cursor position to print the string at fmt - Format string Returns: Length of string printed to the console --*/ { va_list args; UINTN back; va_start (args, fmt); back = _IPrint (Column, Row, Out, fmt, NULL, args); va_end (args); return back; } UINTN _IPrint ( IN UINTN Column, IN UINTN Row, IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, IN CONST CHAR16 *fmt, IN CONST CHAR8 *fmta, IN va_list args ) // Display string worker for: Print, PrintAt, IPrint, IPrintAt { PRINT_STATE ps; UINTN back; ZeroMem (&ps, sizeof(ps)); ps.Context = Out; ps.Output = (INTN (EFIAPI *)(VOID *, CHAR16 *)) Out->OutputString; ps.SetAttr = (INTN (EFIAPI *)(VOID *, UINTN)) Out->SetAttribute; ps.Attr = Out->Mode->Attribute; back = (ps.Attr >> 4) & 0xF; ps.AttrNorm = EFI_TEXT_ATTR(EFI_LIGHTGRAY, back); ps.AttrHighlight = EFI_TEXT_ATTR(EFI_WHITE, back); ps.AttrError = EFI_TEXT_ATTR(EFI_YELLOW, back); if (fmt) { ps.fmt.pw = fmt; } else { ps.fmt.Ascii = TRUE; ps.fmt.pc = fmta; } va_copy(ps.args, args); if (Column != (UINTN) -1) { uefi_call_wrapper(Out->SetCursorPosition, 3, Out, Column, Row); } back = _Print (&ps); va_end(ps.args); return back; } UINTN AsciiPrint ( IN CONST CHAR8 *fmt, ... ) /*++ Routine Description: For those whom really can't deal with unicode, a print function that takes an ascii format string Arguments: fmt - ascii format string Returns: Length of string printed to the console --*/ { va_list args; UINTN back; va_start (args, fmt); back = _IPrint ((UINTN) -1, (UINTN) -1, ST->ConOut, NULL, fmt, args); va_end (args); return back; } UINTN AsciiVSPrint ( OUT CHAR8 *Str, IN UINTN StrSize, IN CONST CHAR8 *fmt, va_list args ) /*++ Routine Description: Prints a formatted ascii string to a buffer using a va_list Arguments: Str - Output buffer to print the formatted string into StrSize - Size of Str. String is truncated to this size. A size of 0 means there is no limit fmt - The format string args - va_list Returns: String length returned in buffer --*/ // Use UnicodeVSPrint() and convert back to ASCII { CHAR16 *UnicodeStr, *UnicodeFmt; UINTN i, Len; UnicodeStr = AllocatePool(StrSize * sizeof(CHAR16)); if (!UnicodeStr) return 0; UnicodeFmt = PoolPrint(u"%a", fmt); if (!UnicodeFmt) { FreePool(UnicodeStr); return 0; } Len = UnicodeVSPrint(UnicodeStr, StrSize, UnicodeFmt, args); FreePool(UnicodeFmt); // The strings are ASCII so just do a plain Unicode conversion for (i = 0; i < Len; i++) Str[i] = (CHAR8)UnicodeStr[i]; Str[Len] = 0; FreePool(UnicodeStr); return Len; } STATIC VOID PFLUSH ( IN OUT PRINT_STATE *ps ) { *ps->Pos = 0; if (IsLocalPrint(ps->Output)) ps->Output(ps->Context, ps->Buffer); else uefi_call_wrapper(ps->Output, 2, ps->Context, ps->Buffer); ps->Pos = ps->Buffer; } STATIC VOID PSETATTR ( IN OUT PRINT_STATE *ps, IN UINTN Attr ) { PFLUSH (ps); ps->RestoreAttr = ps->Attr; if (ps->SetAttr) { uefi_call_wrapper(ps->SetAttr, 2, ps->Context, Attr); } ps->Attr = Attr; } STATIC VOID PPUTC ( IN OUT PRINT_STATE *ps, IN CHAR16 c ) { // if this is a newline, add a carraige return if (c == '\n') { PPUTC (ps, '\r'); } *ps->Pos = c; ps->Pos += 1; ps->Len += 1; // if at the end of the buffer, flush it if (ps->Pos >= ps->End) { PFLUSH(ps); } } STATIC CHAR16 PGETC ( IN POINTER *p ) { CHAR16 c; c = p->Ascii ? p->pc[p->Index] : p->pw[p->Index]; p->Index += 1; return c; } STATIC VOID PITEM ( IN OUT PRINT_STATE *ps ) { UINTN Len, i; PRINT_ITEM *Item; CHAR16 c; // Get the length of the item Item = ps->Item; Item->Item.Index = 0; while (Item->Item.Index < Item->FieldWidth) { c = PGETC(&Item->Item); if (!c) { Item->Item.Index -= 1; break; } } Len = Item->Item.Index; // if there is no item field width, use the items width if (Item->FieldWidth == (UINTN) -1) { Item->FieldWidth = Len; } // if item is larger then width, update width if (Len > Item->Width) { Item->Width = Len; } // if pad field before, add pad char if (Item->PadBefore) { for (i=Item->Width; i < Item->FieldWidth; i+=1) { PPUTC (ps, ' '); } } // pad item for (i=Len; i < Item->Width; i++) { PPUTC (ps, Item->Pad); } // add the item Item->Item.Index=0; while (Item->Item.Index < Len) { PPUTC (ps, PGETC(&Item->Item)); } // If pad at the end, add pad char if (!Item->PadBefore) { for (i=Item->Width; i < Item->FieldWidth; i+=1) { PPUTC (ps, ' '); } } } STATIC UINTN _Print ( IN PRINT_STATE *ps ) /*++ Routine Description: %w.lF - w = width l = field width F = format of arg Args F: 0 - pad with zeros - - justify on left (default is on right) , - add comma's to field * - width provided on stack n - Set output attribute to normal (for this field only) h - Set output attribute to highlight (for this field only) e - Set output attribute to error (for this field only) l - Value is 64 bits a - ascii string s - unicode string X - fixed 8 byte value in hex x - hex value d - value as signed decimal u - value as unsigned decimal f - value as floating point c - Unicode char t - EFI time structure g - Pointer to GUID r - EFI status code (result code) D - pointer to Device Path with normal ending. N - Set output attribute to normal H - Set output attribute to highlight E - Set output attribute to error % - Print a % Arguments: SystemTable - The system table Returns: Number of charactors written --*/ { CHAR16 c; UINTN Attr; PRINT_ITEM Item; CHAR16 Buffer[PRINT_STRING_LEN]; ps->Len = 0; ps->Buffer = Buffer; ps->Pos = Buffer; ps->End = Buffer + PRINT_STRING_LEN - 1; ps->Item = &Item; ps->fmt.Index = 0; while ((c = PGETC(&ps->fmt))) { if (c != '%') { PPUTC ( ps, c ); continue; } // setup for new item Item.FieldWidth = (UINTN) -1; Item.Width = 0; Item.WidthParse = &Item.Width; Item.Pad = ' '; Item.PadBefore = TRUE; Item.Comma = FALSE; Item.Long = FALSE; Item.Item.Ascii = FALSE; Item.Item.pw = NULL; ps->RestoreAttr = 0; Attr = 0; while ((c = PGETC(&ps->fmt))) { switch (c) { case '%': // // %% -> % // Item.Scratch[0] = '%'; Item.Scratch[1] = 0; Item.Item.pw = Item.Scratch; break; case ',': Item.Comma = TRUE; break; case '-': Item.PadBefore = FALSE; break; case '*': *Item.WidthParse = va_arg(ps->args, UINTN); break; case '.': Item.WidthParse = &Item.FieldWidth; break; case '0': Item.Pad = '0'; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': *Item.WidthParse = 0; do { *Item.WidthParse = *Item.WidthParse * 10 + c - '0'; c = PGETC(&ps->fmt); } while (c >= '0' && c <= '9') ; ps->fmt.Index -= 1; break; case 'a': Item.Item.pc = va_arg(ps->args, CHAR8 *); Item.Item.Ascii = TRUE; if (!Item.Item.pc) { Item.Item.pc = (CHAR8 *)"(null)"; } break; case 'c': Item.Scratch[0] = (CHAR16) va_arg(ps->args, UINTN); Item.Scratch[1] = 0; Item.Item.pw = Item.Scratch; break; case 'D': { EFI_DEVICE_PATH *dp = va_arg(ps->args, EFI_DEVICE_PATH *); CHAR16 *dpstr = DevicePathToStr(dp); StrnCpy(Item.Scratch, dpstr, PRINT_ITEM_BUFFER_LEN); Item.Scratch[PRINT_ITEM_BUFFER_LEN-1] = L'\0'; FreePool(dpstr); Item.Item.pw = Item.Scratch; break; } case 'd': ValueToString ( Item.Scratch, Item.Comma, Item.Long ? va_arg(ps->args, INT64) : va_arg(ps->args, INT32) ); Item.Item.pw = Item.Scratch; break; case 'E': Attr = ps->AttrError; break; case 'e': PSETATTR(ps, ps->AttrError); break; case 'f': FloatToString ( Item.Scratch, Item.Comma, va_arg(ps->args, double) ); Item.Item.pw = Item.Scratch; break; case 'g': GuidToString (Item.Scratch, va_arg(ps->args, EFI_GUID *)); Item.Item.pw = Item.Scratch; break; case 'H': Attr = ps->AttrHighlight; break; case 'h': PSETATTR(ps, ps->AttrHighlight); break; case 'l': Item.Long = TRUE; break; case 'N': Attr = ps->AttrNorm; break; case 'n': PSETATTR(ps, ps->AttrNorm); break; case 'p': Item.Width = sizeof(void *) == (8 ? 16 : 8) + 2; Item.Pad = '0'; Item.Scratch[0] = ' '; Item.Scratch[1] = ' '; ValueToHex ( Item.Scratch+2, Item.Long ? va_arg(ps->args, UINT64) : va_arg(ps->args, UINT32) ); Item.Scratch[0] = '0'; Item.Scratch[1] = 'x'; Item.Item.pw = Item.Scratch; break; case 'r': StatusToString (Item.Scratch, va_arg(ps->args, EFI_STATUS)); Item.Item.pw = Item.Scratch; break; case 's': Item.Item.pw = va_arg(ps->args, CHAR16 *); if (!Item.Item.pw) { Item.Item.pw = u"(null)"; } break; case 't': TimeToString (Item.Scratch, va_arg(ps->args, EFI_TIME *)); Item.Item.pw = Item.Scratch; break; case 'u': ValueToString ( Item.Scratch, Item.Comma, Item.Long ? va_arg(ps->args, UINT64) : va_arg(ps->args, UINT32) ); Item.Item.pw = Item.Scratch; break; case 'X': Item.Width = Item.Long ? 16 : 8; Item.Pad = '0'; #if __GNUC__ >= 7 __attribute__ ((fallthrough)); #endif case 'x': ValueToHex ( Item.Scratch, Item.Long ? va_arg(ps->args, UINT64) : va_arg(ps->args, UINT32) ); Item.Item.pw = Item.Scratch; break; default: Item.Scratch[0] = '?'; Item.Scratch[1] = 0; Item.Item.pw = Item.Scratch; break; } // if we have an Item if (Item.Item.pw) { PITEM (ps); break; } // if we have an Attr set if (Attr) { PSETATTR(ps, Attr); ps->RestoreAttr = 0; break; } } if (ps->RestoreAttr) { PSETATTR(ps, ps->RestoreAttr); } } // Flush buffer PFLUSH (ps); return ps->Len; } STATIC CHAR8 Hex[] = {'0','1','2','3','4','5','6','7', '8','9','A','B','C','D','E','F'}; VOID ValueToHex ( IN CHAR16 *Buffer, IN UINT64 v ) { CHAR8 str[30], *p1; CHAR16 *p2; if (!v) { Buffer[0] = '0'; Buffer[1] = 0; return ; } p1 = str; p2 = Buffer; while (v) { // Without the cast, the MSVC compiler may insert a reference to __allmull *(p1++) = Hex[(UINTN)(v & 0xf)]; v = RShiftU64 (v, 4); } while (p1 != str) { *(p2++) = *(--p1); } *p2 = 0; } VOID ValueToString ( IN CHAR16 *Buffer, IN BOOLEAN Comma, IN INT64 v ) { STATIC CHAR8 ca[] = { 3, 1, 2 }; CHAR8 str[40], *p1; CHAR16 *p2; UINTN c, r; if (!v) { Buffer[0] = '0'; Buffer[1] = 0; return ; } p1 = str; p2 = Buffer; if (v < 0) { *(p2++) = '-'; v = -v; } while (v) { v = (INT64)DivU64x32 ((UINT64)v, 10, &r); *(p1++) = (CHAR8)r + '0'; } c = (UINTN) (Comma ? ca[(p1 - str) % 3] : 999) + 1; while (p1 != str) { c -= 1; if (!c) { *(p2++) = ','; c = 3; } *(p2++) = *(--p1); } *p2 = 0; } // Having this call inlined by VS2022 on Release builds produces an // "Undefined OpCode Exception" on ARM32 whenever Print() is invoked, // even when no part of the code below is actually being executed... // For safety, add an explicit clause to prevent inlining on all platforms. EFI_NOINLINE VOID FloatToString ( IN CHAR16 *Buffer, IN BOOLEAN Comma, IN double v ) { /* * Integer part. */ INTN i = (INTN)v; ValueToString(Buffer, Comma, i); /* * Decimal point. */ UINTN x = StrLen(Buffer); Buffer[x] = L'.'; x++; /* * Keep fractional part. */ float f = (float)(v - i); if (f < 0) f = -f; /* * Leading fractional zeroes. */ f *= 10.0; while ( (f != 0) && ((INTN)f == 0)) { Buffer[x] = L'0'; x++; f *= 10.0; } /* * Fractional digits. */ while ((float)(INTN)f != f) { f *= 10; } ValueToString(Buffer + x, FALSE, (INTN)f); return; } VOID TimeToString ( OUT CHAR16 *Buffer, IN EFI_TIME *Time ) { UINTN Hour, Year; CHAR16 AmPm; AmPm = 'a'; Hour = Time->Hour; if (Time->Hour == 0) { Hour = 12; } else if (Time->Hour >= 12) { AmPm = 'p'; if (Time->Hour >= 13) { Hour -= 12; } } Year = Time->Year % 100; // bugbug: for now just print it any old way UnicodeSPrint (Buffer, 0, u"%02d/%02d/%02d %02d:%02d%c", Time->Month, Time->Day, Year, Hour, Time->Minute, AmPm ); } VOID DumpHex ( IN UINTN Indent, IN UINTN Offset, IN UINTN DataSize, IN VOID *UserData ) { CHAR8 *Data, Val[50], Str[20], c; UINTN Size, Index; UINTN ScreenCount; UINTN TempColumn; UINTN ScreenSize; CHAR16 ReturnStr[1]; uefi_call_wrapper(ST->ConOut->QueryMode, 4, ST->ConOut, ST->ConOut->Mode->Mode, &TempColumn, &ScreenSize); ScreenCount = 0; ScreenSize -= 2; Data = UserData; while (DataSize) { Size = 16; if (Size > DataSize) { Size = DataSize; } for (Index=0; Index < Size; Index += 1) { c = Data[Index]; Val[Index*3+0] = Hex[c>>4]; Val[Index*3+1] = Hex[c&0xF]; Val[Index*3+2] = (Index == 7)?'-':' '; Str[Index] = (c < ' ' || c > 'z') ? '.' : c; } Val[Index*3] = 0; Str[Index] = 0; Print (u"%*a%X: %-.48a *%a*\n", Indent, "", Offset, Val, Str); Data += Size; Offset += Size; DataSize -= Size; ScreenCount++; if (ScreenCount >= ScreenSize && ScreenSize != 0) { // // If ScreenSize == 0 we have the console redirected so don't // block updates // ScreenCount = 0; Print (u"Press Enter to continue :"); Input (u"", ReturnStr, sizeof(ReturnStr)/sizeof(CHAR16)); Print (u"\n"); } } } ncroxon-gnu-efi-157d47c/lib/riscv64/000077500000000000000000000000001471215650600171455ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/lib/riscv64/initplat.c000066400000000000000000000003371471215650600211400ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause #include "lib.h" VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle EFI_UNUSED, IN EFI_SYSTEM_TABLE *SystemTable EFI_UNUSED ) { } ncroxon-gnu-efi-157d47c/lib/riscv64/math.c000066400000000000000000000015331471215650600202440ustar00rootroot00000000000000// SPDX-License-Identifier: BSD-2-Clause-Patent /* * This code is based on EDK II MdePkg/Library/BaseLib/Math64.c * Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved. */ #include "lib.h" /** * LShiftU64() - left shift */ UINT64 LShiftU64 ( IN UINT64 Operand, IN UINTN Count ) { return Operand << Count; } /** * RShiftU64() - right shift */ UINT64 RShiftU64 ( IN UINT64 Operand, IN UINTN Count ) { return Operand >> Count; } /** * MultU64x32() - multiply */ UINT64 MultU64x32 ( IN UINT64 Multiplicand, IN UINTN Multiplier ) { return Multiplicand * Multiplier; } /** * DivU64x32() - divide */ UINT64 DivU64x32 ( IN UINT64 Dividend, IN UINTN Divisor, OUT UINTN *Remainder OPTIONAL ) { ASSERT(Divisor != 0); if (Remainder) { *Remainder = Dividend % Divisor; } return Dividend / Divisor; } ncroxon-gnu-efi-157d47c/lib/riscv64/setjmp.S000066400000000000000000000024051471215650600205740ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause /* * Copyright Heinrich Schuchardt */ .text .p2align 3 #define GREG_LIST \ REG_ONE(s0, 0); \ REG_ONE(s1, 8); \ REG_ONE(s2, 16); \ REG_ONE(s3, 24); \ REG_ONE(s4, 32); \ REG_ONE(s5, 40); \ REG_ONE(s6, 48); \ REG_ONE(s7, 56); \ REG_ONE(s8, 64); \ REG_ONE(s9, 72); \ REG_ONE(s10, 80); \ REG_ONE(s11, 88); \ REG_ONE(sp, 96); \ REG_ONE(ra, 104); #define FREG_LIST \ FREG_ONE(fs0, 112); \ FREG_ONE(fs1, 120); \ FREG_ONE(fs2, 128); \ FREG_ONE(fs3, 136); \ FREG_ONE(fs4, 144); \ FREG_ONE(fs5, 152); \ FREG_ONE(fs6, 160); \ FREG_ONE(fs7, 168); \ FREG_ONE(fs8, 176); \ FREG_ONE(fs9, 184); \ FREG_ONE(fs10, 192); \ FREG_ONE(fs11, 200); #define REG_ONE(R, P) sd R, P(a0) #define FREG_ONE(R, P) fsd R, P(a0) .globl setjmp .type setjmp, @function setjmp: GREG_LIST #ifndef __riscv_float_abi_soft FREG_LIST #endif li a0, 0 ret #undef REG_ONE #undef FREG_ONE #define REG_ONE(R, P) ld R, P(a0) #define FREG_ONE(R, P) fld R, P(a0) .globl longjmp .type longjmp, @function longjmp: GREG_LIST #ifndef __riscv_float_abi_soft FREG_LIST #endif seqz a0, a1 add a0, a0, a1 ret #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/runtime/000077500000000000000000000000001471215650600173305ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/lib/runtime/efirtlib.c000066400000000000000000000054601471215650600213010ustar00rootroot00000000000000/*++ Copyright (c) 1999 Intel Corporation Module Name: EfiRtLib.h Abstract: EFI Runtime library functions Revision History --*/ #include "efi.h" #include "efilib.h" #include "efirtlib.h" #ifndef __GNUC__ #pragma RUNTIME_CODE(RtZeroMem) #endif VOID RUNTIMEFUNCTION RtZeroMem ( IN VOID *Buffer, IN UINTN Size ) { INT8 *pt; pt = Buffer; while (Size--) { *(pt++) = 0; } } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtSetMem) #endif VOID EFIAPI RUNTIMEFUNCTION RtSetMem ( IN VOID *Buffer, IN UINTN Size, IN UINT8 Value ) { INT8 *pt; pt = Buffer; while (Size--) { *(pt++) = Value; } } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtCopyMem) #endif VOID EFIAPI RUNTIMEFUNCTION RtCopyMem ( IN VOID *Dest, IN VOID *Src, IN UINTN len ) { CHAR8 *d = (CHAR8*)Dest; CHAR8 *s = (CHAR8*)Src; if (d == NULL || s == NULL || s == d) return; // If the beginning of the destination range overlaps with the end of // the source range, make sure to start the copy from the end so that // we don't end up overwriting source data that we need for the copy. if ((d > s) && (d < s + len)) { for (d += len, s += len; len--; ) *--d = *--s; } else { while (len--) *d++ = *s++; } } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtCopyMemC) #endif VOID EFIAPI RUNTIMEFUNCTION RtCopyMemC ( IN VOID *Dest, IN CONST VOID *Src, IN UINTN len ) { /* CopyMem matches ISO C apart from the change to NON-CONST Src Overwriting Src is an intended outcome if overlapping occurs (per memmove) This function is useful to avoid GCC dying in changing pointer setup */ RtCopyMem(Dest, (VOID*)Src, len); } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtCompareMem) #endif INTN RUNTIMEFUNCTION RtCompareMem ( IN CONST VOID *Dest, IN CONST VOID *Src, IN UINTN len ) { CONST CHAR8 *d = Dest, *s = Src; while (len--) { if (*d != *s) { return *d - *s; } d += 1; s += 1; } return 0; } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtCompareGuid) #endif BOOLEAN EFIAPI RUNTIMEFUNCTION RtCompareGuid ( IN CONST EFI_GUID *Guid1, IN CONST EFI_GUID *Guid2 ) /*++ Routine Description: Compares to GUIDs Arguments: Guid1 - guid to compare Guid2 - guid to compare Returns: = 1 if Guid1 == Guid2 --*/ { INT32 *g1, *g2, r; // // Compare 32 bits at a time // g1 = (INT32 *) Guid1; g2 = (INT32 *) Guid2; r = g1[0] - g2[0]; r |= g1[1] - g2[1]; r |= g1[2] - g2[2]; r |= g1[3] - g2[3]; if (r==0) { return 1; } else { return 0; } } ncroxon-gnu-efi-157d47c/lib/runtime/rtdata.c000066400000000000000000000020051471215650600207500ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: data.c Abstract: EFI library global data Revision History --*/ #include "lib.h" // // These globals are runtime globals // // N.B. The Microsoft C compiler will only put the data in the // right data section if it is explicitly initialized.. // #ifndef __GNUC__ #pragma BEGIN_RUNTIME_DATA() #endif // // RT - pointer to the runtime table // EFI_RUNTIME_SERVICES *RT; // // LibStandalone - TRUE if lib is linked in as part of the firmware. // N.B. The EFI fw sets this value directly // BOOLEAN LibFwInstance; // // EFIDebug - Debug mask // UINTN EFIDebug = EFI_DBUG_MASK; // // LibRuntimeDebugOut - Runtime Debug Output device // SIMPLE_TEXT_OUTPUT_INTERFACE *LibRuntimeDebugOut; // // LibRuntimeRaiseTPL, LibRuntimeRestoreTPL - pointers to Runtime functions from the // Boot Services Table // EFI_RAISE_TPL LibRuntimeRaiseTPL = NULL; EFI_RESTORE_TPL LibRuntimeRestoreTPL = NULL; ncroxon-gnu-efi-157d47c/lib/runtime/rtlock.c000066400000000000000000000027241471215650600207770ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: lock.c Abstract: Implements FLOCK Revision History --*/ #include "lib.h" #ifndef __GNUC__ #pragma RUNTIME_CODE(RtAcquireLock) #endif VOID RtAcquireLock ( IN FLOCK *Lock ) /*++ Routine Description: Raising to the task priority level of the mutual exclusion lock, and then acquires ownership of the lock. Arguments: Lock - The lock to acquire Returns: Lock owned --*/ { if (BS) { if (BS->RaiseTPL != NULL) { Lock->OwnerTpl = uefi_call_wrapper(BS->RaiseTPL, 1, Lock->Tpl); } } else { if (LibRuntimeRaiseTPL != NULL) { Lock->OwnerTpl = LibRuntimeRaiseTPL(Lock->Tpl); } } Lock->Lock += 1; ASSERT (Lock->Lock == 1); } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtAcquireLock) #endif VOID RtReleaseLock ( IN FLOCK *Lock ) /*++ Routine Description: Releases ownership of the mutual exclusion lock, and restores the previous task priority level. Arguments: Lock - The lock to release Returns: Lock unowned --*/ { EFI_TPL Tpl; Tpl = Lock->OwnerTpl; ASSERT(Lock->Lock == 1); Lock->Lock -= 1; if (BS) { if (BS->RestoreTPL != NULL) { uefi_call_wrapper(BS->RestoreTPL, 1, Tpl); } } else { if (LibRuntimeRestoreTPL != NULL) { LibRuntimeRestoreTPL(Tpl); } } } ncroxon-gnu-efi-157d47c/lib/runtime/rtstr.c000066400000000000000000000066641471215650600206660ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: str.c Abstract: String runtime functions Revision History --*/ #include "lib.h" #ifndef __GNUC__ #pragma RUNTIME_CODE(RtStrCmp) #endif INTN RUNTIMEFUNCTION RtStrCmp ( IN CONST CHAR16 *s1, IN CONST CHAR16 *s2 ) // compare strings { while (*s1) { if (*s1 != *s2) { break; } s1 += 1; s2 += 1; } return *s1 - *s2; } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtStrCpy) #endif VOID RUNTIMEFUNCTION RtStrCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ) // copy strings { while (*Src) { *(Dest++) = *(Src++); } *Dest = 0; } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtStrnCpy) #endif VOID RUNTIMEFUNCTION RtStrnCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ) // copy strings { UINTN Size = RtStrnLen(Src, Len); if (Size != Len) RtSetMem(Dest + Size, (Len - Size) * sizeof(CHAR16), '\0'); RtCopyMemC(Dest, Src, Size * sizeof(CHAR16)); } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtStpCpy) #endif CHAR16 * RUNTIMEFUNCTION RtStpCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ) // copy strings { while (*Src) { *(Dest++) = *(Src++); } *Dest = 0; return Dest; } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtStpnCpy) #endif CHAR16 * RUNTIMEFUNCTION RtStpnCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ) // copy strings { UINTN Size = RtStrnLen(Src, Len); if (Size != Len) RtSetMem(Dest + Size, (Len - Size) * sizeof(CHAR16), '\0'); RtCopyMemC(Dest, Src, Size * sizeof(CHAR16)); return Dest + Size; } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtStrCat) #endif VOID RUNTIMEFUNCTION RtStrCat ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ) { RtStrCpy(Dest+RtStrLen(Dest), Src); } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtStrnCat) #endif VOID RUNTIMEFUNCTION RtStrnCat ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ) { UINTN DestSize, Size; DestSize = RtStrLen(Dest); Size = RtStrnLen(Src, Len); RtCopyMemC(Dest + DestSize, Src, Size * sizeof(CHAR16)); Dest[DestSize + Size] = '\0'; } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtStrLen) #endif UINTN RUNTIMEFUNCTION RtStrLen ( IN CONST CHAR16 *s1 ) // string length { UINTN len; for (len=0; *s1; s1+=1, len+=1) ; return len; } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtStrnLen) #endif UINTN RUNTIMEFUNCTION RtStrnLen ( IN CONST CHAR16 *s1, IN UINTN Len ) // string length { UINTN i; for (i = 0; *s1 && i < Len; i++) s1++; return i; } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtStrSize) #endif UINTN RUNTIMEFUNCTION RtStrSize ( IN CONST CHAR16 *s1 ) // string size { UINTN len; for (len=0; *s1; s1+=1, len+=1) ; return (len + 1) * sizeof(CHAR16); } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtBCDtoDecimal) #endif UINT8 RUNTIMEFUNCTION RtBCDtoDecimal( IN UINT8 BcdValue ) { UINTN High, Low; High = BcdValue >> 4; Low = BcdValue - (High << 4); return ((UINT8)(Low + (High * 10))); } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtDecimaltoBCD) #endif UINT8 RUNTIMEFUNCTION RtDecimaltoBCD ( IN UINT8 DecValue ) { UINTN High, Low; High = DecValue / 10; Low = DecValue - (High * 10); return ((UINT8)(Low + (High << 4))); } ncroxon-gnu-efi-157d47c/lib/runtime/vm.c000066400000000000000000000045141471215650600201220ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: vm.c Abstract: EFI Hell to remap runtime address into the new virual address space that was registered by the OS for RT calls. So the code image needs to be relocated. All pointers need to be manually fixed up since the address map changes. GOOD LUCK NOT HAVING BUGS IN YOUR CODE! PLEASE TEST A LOT. MAKE SURE EXIT BOOTSERVICES OVER WRITES ALL BOOTSERVICE MEMORY & DATA SPACES WHEN YOU TEST. Revision History --*/ #include "lib.h" #ifndef __GNUC__ #pragma RUNTIME_CODE(RtLibEnableVirtualMappings) #endif VOID RUNTIMEFUNCTION RtLibEnableVirtualMappings ( VOID ) { EFI_CONVERT_POINTER ConvertPointer; // // If this copy of the lib is linked into the firmware, then // do not update the pointers yet. // if (!LibFwInstance) { // // Different components are updating to the new virtual // mappings at differnt times. The only function that // is safe to call at this notification is ConvertAddress // ConvertPointer = RT->ConvertPointer; // // Fix any pointers that the lib created, that may be needed // during runtime. // ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&RT); ConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&LibRuntimeDebugOut); ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&LibRuntimeRaiseTPL); ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&LibRuntimeRestoreTPL); // that was it :^) } } #ifndef __GNUC__ #pragma RUNTIME_CODE(RtConvertList) #endif VOID RUNTIMEFUNCTION RtConvertList ( IN UINTN DebugDisposition, IN OUT LIST_ENTRY *ListHead ) { LIST_ENTRY *Link; LIST_ENTRY *NextLink; EFI_CONVERT_POINTER ConvertPointer; ConvertPointer = RT->ConvertPointer; // // Convert all the Flink & Blink pointers in the list // Link = ListHead; do { NextLink = Link->Flink; ConvertPointer ( Link->Flink == ListHead ? DebugDisposition : 0, (VOID **)&Link->Flink ); ConvertPointer ( Link->Blink == ListHead ? DebugDisposition : 0, (VOID **)&Link->Blink ); Link = NextLink; } while (Link != ListHead); } ncroxon-gnu-efi-157d47c/lib/smbios.c000066400000000000000000000070361471215650600173130ustar00rootroot00000000000000/*++ Copyright (c) 2000 Intel Corporation Module Name: Smbios.c Abstract: Lib fucntions for SMBIOS. Used to get system serial number and GUID Revision History --*/ #include "lib.h" /* * We convert 32 bit values to pointers. In 64 bit mode the compiler will issue a * warning stating that the value is too small for the pointer: * "warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]" * we can safely ignore them here. */ #ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wint-to-pointer-cast" #endif EFI_STATUS LibGetSmbiosSystemGuidAndSerialNumber ( IN EFI_GUID *SystemGuid, OUT CHAR8 **SystemSerialNumber ) { EFI_STATUS Status; SMBIOS_STRUCTURE_TABLE *SmbiosTable; SMBIOS_STRUCTURE_POINTER Smbios; SMBIOS_STRUCTURE_POINTER SmbiosEnd; UINT16 Index; Status = LibGetSystemConfigurationTable(&SMBIOSTableGuid, (VOID**)&SmbiosTable); if (EFI_ERROR(Status)) { return EFI_NOT_FOUND; } Smbios.Hdr = (SMBIOS_HEADER *)SmbiosTable->TableAddress; SmbiosEnd.Raw = (UINT8 *)((UINTN)SmbiosTable->TableAddress + SmbiosTable->TableLength); for (Index = 0; Index < SmbiosTable->TableLength ; Index++) { if (Smbios.Hdr->Type == 1) { if (Smbios.Hdr->Length < 0x19) { // // Older version did not support Guid and Serial number // continue; } // // SMBIOS tables are byte packed so we need to do a byte copy to // prevend alignment faults on IA-64. CopyMem (SystemGuid, &Smbios.Type1->Uuid, sizeof(EFI_GUID)); *SystemSerialNumber = LibGetSmbiosString(&Smbios, Smbios.Type1->SerialNumber); return EFI_SUCCESS; } // // Make Smbios point to the next record // LibGetSmbiosString (&Smbios, -1); if (Smbios.Raw >= SmbiosEnd.Raw) { // // SMBIOS 2.1 incorrectly stated the length of SmbiosTable as 0x1e. // given this we must double check against the lenght of /// the structure. My home PC has this bug.ruthard // return EFI_SUCCESS; } } return EFI_SUCCESS; } CHAR8* LibGetSmbiosString ( IN SMBIOS_STRUCTURE_POINTER *Smbios, IN UINT16 StringNumber ) /*++ Return SMBIOS string given the string number. Arguments: Smbios - Pointer to SMBIOS structure StringNumber - String number to return. -1 is used to skip all strings and point to the next SMBIOS structure. Returns: Pointer to string, or pointer to next SMBIOS strcuture if StringNumber == -1 --*/ { UINT16 Index; CHAR8 *String; // // Skip over formatted section // String = (CHAR8 *)(Smbios->Raw + Smbios->Hdr->Length); // // Look through unformated section // for (Index = 1; Index <= StringNumber; Index++) { if (StringNumber == Index) { return String; } // // Skip string // for (; *String != 0; String++); String++; if (*String == 0) { // // If double NULL then we are done. // Retrun pointer to next structure in Smbios. // if you pass in a -1 you will always get here // Smbios->Raw = (UINT8 *)++String; return NULL; } } return NULL; } ncroxon-gnu-efi-157d47c/lib/sread.c000066400000000000000000000201151471215650600171060ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: sread.c Abstract: Simple read file access Revision History --*/ #include "lib.h" #define SIMPLE_READ_SIGNATURE EFI_SIGNATURE_32('s','r','d','r') typedef struct _SIMPLE_READ_FILE { UINTN Signature; BOOLEAN FreeBuffer; VOID *Source; UINTN SourceSize; EFI_FILE_HANDLE FileHandle; } SIMPLE_READ_HANDLE; EFI_STATUS OpenSimpleReadFile ( IN BOOLEAN BootPolicy, IN VOID *SourceBuffer OPTIONAL, IN UINTN SourceSize, IN OUT EFI_DEVICE_PATH **FilePath, OUT EFI_HANDLE *DeviceHandle, OUT SIMPLE_READ_FILE *SimpleReadHandle ) /*++ Routine Description: Opens a file for (simple) reading. The simple read abstraction will access the file either from a memory copy, from a file system interface, or from the load file interface. Arguments: Returns: A handle to access the file --*/ { SIMPLE_READ_HANDLE *FHand; EFI_DEVICE_PATH *UserFilePath; EFI_DEVICE_PATH *TempFilePath; EFI_DEVICE_PATH *TempFilePathPtr; FILEPATH_DEVICE_PATH *FilePathNode; EFI_FILE_HANDLE FileHandle, LastHandle; EFI_STATUS Status; EFI_LOAD_FILE_INTERFACE *LoadFile; FHand = NULL; UserFilePath = *FilePath; // // Allocate a new simple read handle structure // FHand = AllocateZeroPool (sizeof(SIMPLE_READ_HANDLE)); if (!FHand) { Status = EFI_OUT_OF_RESOURCES; goto Done; } *SimpleReadHandle = (SIMPLE_READ_FILE) FHand; FHand->Signature = SIMPLE_READ_SIGNATURE; // // If the caller passed a copy of the file, then just use it // if (SourceBuffer) { FHand->Source = SourceBuffer; FHand->SourceSize = SourceSize; *DeviceHandle = NULL; Status = EFI_SUCCESS; goto Done; } // // Attempt to access the file via a file system interface // FileHandle = NULL; Status = uefi_call_wrapper(BS->LocateDevicePath, 3, &FileSystemProtocol, FilePath, DeviceHandle); if (!EFI_ERROR(Status)) { FileHandle = LibOpenRoot (*DeviceHandle); } Status = FileHandle ? EFI_SUCCESS : EFI_UNSUPPORTED; // // To access as a filesystem, the filepath should only // contain filepath components. Follow the filepath nodes // and find the target file // FilePathNode = (FILEPATH_DEVICE_PATH *) *FilePath; while (!IsDevicePathEnd(&FilePathNode->Header)) { // // For filesystem access each node should be a filepath component // if (DevicePathType(&FilePathNode->Header) != MEDIA_DEVICE_PATH || DevicePathSubType(&FilePathNode->Header) != MEDIA_FILEPATH_DP) { Status = EFI_UNSUPPORTED; } // // If there's been an error, stop // if (EFI_ERROR(Status)) { break; } // // Open this file path node // LastHandle = FileHandle; FileHandle = NULL; Status = uefi_call_wrapper( LastHandle->Open, 5, LastHandle, &FileHandle, FilePathNode->PathName, EFI_FILE_MODE_READ, 0 ); // // Close the last node // uefi_call_wrapper(LastHandle->Close, 1, LastHandle); // // Get the next node // FilePathNode = (FILEPATH_DEVICE_PATH *) NextDevicePathNode(&FilePathNode->Header); } // // If success, return the FHand // if (!EFI_ERROR(Status)) { ASSERT(FileHandle); FHand->FileHandle = FileHandle; goto Done; } // // Cleanup from filesystem access // if (FileHandle) { uefi_call_wrapper(FileHandle->Close, 1, FileHandle); FileHandle = NULL; *FilePath = UserFilePath; } // // If the error is something other then unsupported, return it // if (Status != EFI_UNSUPPORTED) { goto Done; } // // Attempt to access the file via the load file protocol // Status = LibDevicePathToInterface (&LoadFileProtocol, *FilePath, (VOID*)&LoadFile); if (!EFI_ERROR(Status)) { TempFilePath = DuplicateDevicePath (*FilePath); TempFilePathPtr = TempFilePath; Status = uefi_call_wrapper(BS->LocateDevicePath, 3, &LoadFileProtocol, &TempFilePath, DeviceHandle); FreePool (TempFilePathPtr); // // Determine the size of buffer needed to hold the file // SourceSize = 0; Status = uefi_call_wrapper( LoadFile->LoadFile, 5, LoadFile, *FilePath, BootPolicy, &SourceSize, NULL ); // // We expect a buffer too small error to inform us // of the buffer size needed // if (Status == EFI_BUFFER_TOO_SMALL) { SourceBuffer = AllocatePool (SourceSize); if (SourceBuffer) { FHand->FreeBuffer = TRUE; FHand->Source = SourceBuffer; FHand->SourceSize = SourceSize; Status = uefi_call_wrapper( LoadFile->LoadFile, 5, LoadFile, *FilePath, BootPolicy, &SourceSize, SourceBuffer ); } } // // If success, return FHand // if (!EFI_ERROR(Status) || Status == EFI_ALREADY_STARTED) { goto Done; } } // // Nothing else to try // DEBUG ((D_LOAD|D_WARN, "OpenSimpleReadFile: Device did not support a known load protocol\n")); Status = EFI_UNSUPPORTED; Done: // // If the file was not accessed, clean up // if (EFI_ERROR(Status) && (Status != EFI_ALREADY_STARTED)) { if (FHand) { if (FHand->FreeBuffer) { FreePool (FHand->Source); } FreePool (FHand); } } return Status; } EFI_STATUS ReadSimpleReadFile ( IN SIMPLE_READ_FILE UserHandle, IN UINTN Offset, IN OUT UINTN *ReadSize, OUT VOID *Buffer ) { UINTN EndPos; SIMPLE_READ_HANDLE *FHand; EFI_STATUS Status; FHand = UserHandle; ASSERT (FHand->Signature == SIMPLE_READ_SIGNATURE); if (FHand->Source) { // // Move data from our local copy of the file // EndPos = Offset + *ReadSize; if (EndPos > FHand->SourceSize) { *ReadSize = FHand->SourceSize - Offset; if (Offset >= FHand->SourceSize) { *ReadSize = 0; } } CopyMem (Buffer, (CHAR8 *) FHand->Source + Offset, *ReadSize); Status = EFI_SUCCESS; } else { // // Read data from the file // Status = uefi_call_wrapper(FHand->FileHandle->SetPosition, 2, FHand->FileHandle, Offset); if (!EFI_ERROR(Status)) { Status = uefi_call_wrapper(FHand->FileHandle->Read, 3, FHand->FileHandle, ReadSize, Buffer); } } return Status; } VOID CloseSimpleReadFile ( IN SIMPLE_READ_FILE UserHandle ) { SIMPLE_READ_HANDLE *FHand; FHand = UserHandle; ASSERT (FHand->Signature == SIMPLE_READ_SIGNATURE); // // Free any file handle we opened // if (FHand->FileHandle) { uefi_call_wrapper(FHand->FileHandle->Close, 1, FHand->FileHandle); } // // If we allocated the Source buffer, free it // if (FHand->FreeBuffer) { FreePool (FHand->Source); } // // Done with this simple read file handle // FreePool (FHand); } ncroxon-gnu-efi-157d47c/lib/str.c000066400000000000000000000164421471215650600166300ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: str.c Abstract: Revision History --*/ #include "lib.h" INTN StrCmp ( IN CONST CHAR16 *s1, IN CONST CHAR16 *s2 ) // compare strings { return RtStrCmp(s1, s2); } INTN StrnCmp ( IN CONST CHAR16 *s1, IN CONST CHAR16 *s2, IN UINTN len ) // compare strings { while (*s1 && len) { if (*s1 != *s2) { break; } s1 += 1; s2 += 1; len -= 1; } return len ? *s1 - *s2 : 0; } INTN EFIAPI LibStubStriCmp ( IN EFI_UNICODE_COLLATION_INTERFACE *This EFI_UNUSED, IN CHAR16 *s1, IN CHAR16 *s2 ) { return StrCmp (s1, s2); } VOID EFIAPI LibStubStrLwrUpr ( IN EFI_UNICODE_COLLATION_INTERFACE *This EFI_UNUSED, IN CHAR16 *Str EFI_UNUSED ) { } INTN StriCmp ( IN CONST CHAR16 *s1, IN CONST CHAR16 *s2 ) // compare strings { if (UnicodeInterface == &LibStubUnicodeInterface) return UnicodeInterface->StriColl(UnicodeInterface, (CHAR16 *)s1, (CHAR16 *)s2); else return uefi_call_wrapper(UnicodeInterface->StriColl, 3, UnicodeInterface, (CHAR16 *)s1, (CHAR16 *)s2); } VOID StrLwr ( IN CHAR16 *Str ) // lwoer case string { if (UnicodeInterface == &LibStubUnicodeInterface) UnicodeInterface->StrLwr(UnicodeInterface, Str); else uefi_call_wrapper(UnicodeInterface->StrLwr, 2, UnicodeInterface, Str); } VOID StrUpr ( IN CHAR16 *Str ) // upper case string { if (UnicodeInterface == &LibStubUnicodeInterface) UnicodeInterface->StrUpr(UnicodeInterface, Str); else uefi_call_wrapper(UnicodeInterface->StrUpr, 2, UnicodeInterface, Str); } VOID StrCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ) // copy strings { RtStrCpy (Dest, Src); } VOID StrnCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ) // copy strings { RtStrnCpy (Dest, Src, Len); } CHAR16 * StpCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ) // copy strings { return RtStpCpy (Dest, Src); } CHAR16 * StpnCpy ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ) // copy strings { return RtStpnCpy (Dest, Src, Len); } VOID StrCat ( IN CHAR16 *Dest, IN CONST CHAR16 *Src ) { RtStrCat(Dest, Src); } VOID StrnCat ( IN CHAR16 *Dest, IN CONST CHAR16 *Src, IN UINTN Len ) { RtStrnCat(Dest, Src, Len); } UINTN StrnLen ( IN CONST CHAR16 *s1, IN UINTN Len ) // string length { return RtStrnLen(s1, Len); } UINTN StrLen ( IN CONST CHAR16 *s1 ) // string length { return RtStrLen(s1); } UINTN StrSize ( IN CONST CHAR16 *s1 ) // string size { return RtStrSize(s1); } CHAR16 * StrDuplicate ( IN CONST CHAR16 *Src ) // duplicate a string { CHAR16 *Dest; UINTN Size; Size = StrSize(Src); Dest = AllocatePool (Size); if (Dest) { CopyMemC (Dest, Src, Size); } return Dest; } UINTN AsciiStrLen ( IN CONST CHAR8 *s1 ) // string length { UINTN len; for (len=0; *s1; s1+=1, len+=1) ; return len; } UINTN AsciiStrCmp ( IN CONST CHAR8 *s1, IN CONST CHAR8 *s2 ) // compare strings { while (*s1) { if (*s1 != *s2) { break; } s1 += 1; s2 += 1; } return *s1 - *s2; } UINTN AsciiStrnCmp ( IN CONST CHAR8 *s1, IN CONST CHAR8 *s2, IN UINTN len ) // compare strings { while (*s1 && len) { if (*s1 != *s2) { break; } s1 += 1; s2 += 1; len -= 1; } return len ? *s1 - *s2 : 0; } UINTN xtoi ( CONST CHAR16 *str ) // convert hex string to uint { UINTN u; CHAR16 c; // skip preceeding white space while (*str == ' ') { str += 1; } // convert hex digits u = 0; while ((c = *(str++))) { if (c >= 'a' && c <= 'f') { c -= 'a' - 'A'; } if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) { u = (u << 4) | ((UINTN)c - (c >= 'A' ? 'A'-10 : '0')); } else { break; } } return u; } UINTN Atoi ( CONST CHAR16 *str ) // convert hex string to uint { UINTN u; CHAR16 c; // skip preceeding white space while (*str == ' ') { str += 1; } // convert digits u = 0; while ((c = *(str++))) { if (c >= '0' && c <= '9') { u = (u * 10) + c - '0'; } else { break; } } return u; } BOOLEAN MetaMatch ( IN CHAR16 *String, IN CHAR16 *Pattern ) { CHAR16 c, p, l; for (; ;) { p = *Pattern; Pattern += 1; switch (p) { case 0: // End of pattern. If end of string, TRUE match return *String ? FALSE : TRUE; case '*': // Match zero or more chars while (*String) { if (MetaMatch (String, Pattern)) { return TRUE; } String += 1; } return MetaMatch (String, Pattern); case '?': // Match any one char if (!*String) { return FALSE; } String += 1; break; case '[': // Match char set c = *String; if (!c) { return FALSE; // syntax problem } l = 0; while ((p = *Pattern++)) { if (p == ']') { return FALSE; } if (p == '-') { // if range of chars, p = *Pattern; // get high range if (p == 0 || p == ']') { return FALSE; // syntax problem } if (c >= l && c <= p) { // if in range, break; // it's a match } } l = p; if (c == p) { // if char matches break; // move on } } // skip to end of match char set while (p && p != ']') { p = *Pattern; Pattern += 1; } String += 1; break; default: c = *String; if (c != p) { return FALSE; } String += 1; break; } } } BOOLEAN EFIAPI LibStubMetaiMatch ( IN EFI_UNICODE_COLLATION_INTERFACE *This EFI_UNUSED, IN CHAR16 *String, IN CHAR16 *Pattern ) { return MetaMatch (String, Pattern); } BOOLEAN MetaiMatch ( IN CHAR16 *String, IN CHAR16 *Pattern ) { if (UnicodeInterface == &LibStubUnicodeInterface) return UnicodeInterface->MetaiMatch(UnicodeInterface, String, Pattern); else return uefi_call_wrapper(UnicodeInterface->MetaiMatch, 3, UnicodeInterface, String, Pattern); } ncroxon-gnu-efi-157d47c/lib/x86_64/000077500000000000000000000000001471215650600166035ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/lib/x86_64/callwrap.c000066400000000000000000000034651471215650600205640ustar00rootroot00000000000000/* * Convert SysV calling convention to EFI x86_64 calling convention * * Copyright (C) 2007-2010 Intel Corp * Bibo Mao * Chandramouli Narayanan * Huang Ying * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - 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. * - Neither the name of Hewlett-Packard Co. 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 OWNER OR CONTRIBUTORS * BE LIABLE FOR ANYDIRECT, 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. */ /* uefi_call_wrapper() is a macro in efibind.h */ ncroxon-gnu-efi-157d47c/lib/x86_64/efi_stub.S000066400000000000000000000076061471215650600205400ustar00rootroot00000000000000/* * Function calling ABI conversion from Linux to EFI for x86_64 * * Copyright (C) 2007 Intel Corp * Bibo Mao * Huang Ying * Copyright (C) 2012 Felipe Contreras */ #if !defined(HAVE_USE_MS_ABI) /* * EFI calling conventions are documented at: * http://msdn.microsoft.com/en-us/library/ms235286%28v=vs.80%29.aspx * ELF calling conventions are documented at: * http://www.x86-64.org/documentation/abi.pdf * * Basically here are the conversion rules: * a) our function pointer is in %rdi * b) rsi through r8 (elf) aka rcx through r9 (ms) require stack space * on the MS side even though it's not getting used at all. * c) 8(%rsp) is always aligned to 16 in ELF, so %rsp is shifted 8 bytes extra * d) arguments are as follows: (elf -> ms) * 1) rdi -> rcx (32 saved) * 2) rsi -> rdx (32 saved) * 3) rdx -> r8 (32 saved) * 4) rcx -> r9 (32 saved) * 5) r8 -> 32(%rsp) (32 saved) * 6) r9 -> 40(%rsp) (48 saved) * 7) 8(%rsp) -> 48(%rsp) (48 saved) * 8) 16(%rsp) -> 56(%rsp) (64 saved) * 9) 24(%rsp) -> 64(%rsp) (64 saved) * 10) 32(%rsp) -> 72(%rsp) (80 saved) * e) because the first argument we recieve in a thunker is actually the * function to be called, arguments are offset as such: * 0) rdi -> caller * 1) rsi -> rcx (32 saved) * 2) rdx -> rdx (32 saved) * 3) rcx -> r8 (32 saved) * 4) r8 -> r9 (32 saved) * 5) r9 -> 32(%rsp) (32 saved) * 6) 8(%rsp) -> 40(%rsp) (48 saved) * 7) 16(%rsp) -> 48(%rsp) (48 saved) * 8) 24(%rsp) -> 56(%rsp) (64 saved) * 9) 32(%rsp) -> 64(%rsp) (64 saved) * 10) 40(%rsp) -> 72(%rsp) (80 saved) * f) arguments need to be moved in opposite order to avoid clobbering */ #define ENTRY(name) \ .globl name; \ name: ENTRY(efi_call0) subq $40, %rsp call *%rdi addq $40, %rsp ret ENTRY(efi_call1) subq $40, %rsp mov %rsi, %rcx call *%rdi addq $40, %rsp ret ENTRY(efi_call2) subq $40, %rsp /* mov %rdx, %rdx */ mov %rsi, %rcx call *%rdi addq $40, %rsp ret ENTRY(efi_call3) subq $40, %rsp mov %rcx, %r8 /* mov %rdx, %rdx */ mov %rsi, %rcx call *%rdi addq $40, %rsp ret ENTRY(efi_call4) subq $40, %rsp mov %r8, %r9 mov %rcx, %r8 /* mov %rdx, %rdx */ mov %rsi, %rcx call *%rdi addq $40, %rsp ret ENTRY(efi_call5) subq $40, %rsp mov %r9, 32(%rsp) mov %r8, %r9 mov %rcx, %r8 /* mov %rdx, %rdx */ mov %rsi, %rcx call *%rdi addq $40, %rsp ret ENTRY(efi_call6) subq $56, %rsp mov 56+8(%rsp), %rax mov %rax, 40(%rsp) mov %r9, 32(%rsp) mov %r8, %r9 mov %rcx, %r8 /* mov %rdx, %rdx */ mov %rsi, %rcx call *%rdi addq $56, %rsp ret ENTRY(efi_call7) subq $56, %rsp mov 56+16(%rsp), %rax mov %rax, 48(%rsp) mov 56+8(%rsp), %rax mov %rax, 40(%rsp) mov %r9, 32(%rsp) mov %r8, %r9 mov %rcx, %r8 /* mov %rdx, %rdx */ mov %rsi, %rcx call *%rdi addq $56, %rsp ret ENTRY(efi_call8) subq $72, %rsp mov 72+24(%rsp), %rax mov %rax, 56(%rsp) mov 72+16(%rsp), %rax mov %rax, 48(%rsp) mov 72+8(%rsp), %rax mov %rax, 40(%rsp) mov %r9, 32(%rsp) mov %r8, %r9 mov %rcx, %r8 /* mov %rdx, %rdx */ mov %rsi, %rcx call *%rdi addq $72, %rsp ret ENTRY(efi_call9) subq $72, %rsp mov 72+32(%rsp), %rax mov %rax, 64(%rsp) mov 72+24(%rsp), %rax mov %rax, 56(%rsp) mov 72+16(%rsp), %rax mov %rax, 48(%rsp) mov 72+8(%rsp), %rax mov %rax, 40(%rsp) mov %r9, 32(%rsp) mov %r8, %r9 mov %rcx, %r8 /* mov %rdx, %rdx */ mov %rsi, %rcx call *%rdi addq $72, %rsp ret ENTRY(efi_call10) subq $88, %rsp mov 88+40(%rsp), %rax mov %rax, 72(%rsp) mov 88+32(%rsp), %rax mov %rax, 64(%rsp) mov 88+24(%rsp), %rax mov %rax, 56(%rsp) mov 88+16(%rsp), %rax mov %rax, 48(%rsp) mov 88+8(%rsp), %rax mov %rax, 40(%rsp) mov %r9, 32(%rsp) mov %r8, %r9 mov %rcx, %r8 /* mov %rdx, %rdx */ mov %rsi, %rcx call *%rdi addq $88, %rsp ret #endif #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/lib/x86_64/initplat.c000066400000000000000000000004231471215650600205720ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: initplat.c Abstract: Revision History --*/ #include "lib.h" VOID InitializeLibPlatform ( IN EFI_HANDLE ImageHandle EFI_UNUSED, IN EFI_SYSTEM_TABLE *SystemTable EFI_UNUSED ) { } ncroxon-gnu-efi-157d47c/lib/x86_64/math.c000066400000000000000000000067021471215650600177050ustar00rootroot00000000000000/*++ Copyright (c) 1998 Intel Corporation Module Name: math.c Abstract: Revision History --*/ #include "lib.h" // // Declare runtime functions // #ifdef RUNTIME_CODE #ifndef __GNUC__ #pragma RUNTIME_CODE(LShiftU64) #pragma RUNTIME_CODE(RShiftU64) #pragma RUNTIME_CODE(MultU64x32) #pragma RUNTIME_CODE(DivU64x32) #endif #endif // // // UINT64 LShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Left shift 64bit by 32bit and get a 64bit result { #if defined(__GNUC__) || defined(_MSC_EXTENSIONS) return Operand << Count; #else UINT64 Result; _asm { mov eax, dword ptr Operand[0] mov edx, dword ptr Operand[4] mov ecx, Count and ecx, 63 shld edx, eax, cl shl eax, cl cmp ecx, 32 jc short ls10 mov edx, eax xor eax, eax ls10: mov dword ptr Result[0], eax mov dword ptr Result[4], edx } return Result; #endif } UINT64 RShiftU64 ( IN UINT64 Operand, IN UINTN Count ) // Right shift 64bit by 32bit and get a 64bit result { #if defined(__GNUC__) || defined(_MSC_EXTENSIONS) return Operand >> Count; #else UINT64 Result; _asm { mov eax, dword ptr Operand[0] mov edx, dword ptr Operand[4] mov ecx, Count and ecx, 63 shrd eax, edx, cl shr edx, cl cmp ecx, 32 jc short rs10 mov eax, edx xor edx, edx rs10: mov dword ptr Result[0], eax mov dword ptr Result[4], edx } return Result; #endif } UINT64 MultU64x32 ( IN UINT64 Multiplicand, IN UINTN Multiplier ) // Multiple 64bit by 32bit and get a 64bit result { #if defined(__GNUC__) || defined(_MSC_EXTENSIONS) return Multiplicand * Multiplier; #else UINT64 Result; _asm { mov eax, dword ptr Multiplicand[0] mul Multiplier mov dword ptr Result[0], eax mov dword ptr Result[4], edx mov eax, dword ptr Multiplicand[4] mul Multiplier add dword ptr Result[4], eax } return Result; #endif } UINT64 DivU64x32 ( IN UINT64 Dividend, IN UINTN Divisor, OUT UINTN *Remainder OPTIONAL ) // divide 64bit by 32bit and get a 64bit result // N.B. only works for 31bit divisors!! { #if defined(__GNUC__) || defined(_MSC_EXTENSIONS) if (Remainder) *Remainder = Dividend % Divisor; return Dividend / Divisor; #else UINT32 Rem; UINT32 bit; ASSERT (Divisor != 0); ASSERT ((Divisor >> 31) == 0); // // For each bit in the dividend // Rem = 0; for (bit=0; bit < 64; bit++) { _asm { shl dword ptr Dividend[0], 1 ; shift rem:dividend left one rcl dword ptr Dividend[4], 1 rcl dword ptr Rem, 1 mov eax, Rem cmp eax, Divisor ; Is Rem >= Divisor? cmc ; No - do nothing sbb eax, eax ; Else, sub dword ptr Dividend[0], eax ; set low bit in dividen and eax, Divisor ; and sub Rem, eax ; subtract divisor } } if (Remainder) { *Remainder = Rem; } return Dividend; #endif } ncroxon-gnu-efi-157d47c/lib/x86_64/setjmp.S000066400000000000000000000014561471215650600202370ustar00rootroot00000000000000 .text .globl setjmp #ifndef __MINGW32__ .type setjmp, @function #else .def setjmp; .scl 2; .type 32; .endef #endif setjmp: pop %rsi movq %rbx,0x00(%rdi) movq %rsp,0x08(%rdi) push %rsi movq %rbp,0x10(%rdi) movq %r12,0x18(%rdi) movq %r13,0x20(%rdi) movq %r14,0x28(%rdi) movq %r15,0x30(%rdi) movq %rsi,0x38(%rdi) xor %rax,%rax ret .globl longjmp #ifndef __MINGW32__ .type longjmp, @function #else .def longjmp; .scl 2; .type 32; .endef #endif longjmp: movl %esi, %eax movq 0x00(%rdi), %rbx movq 0x08(%rdi), %rsp movq 0x10(%rdi), %rbp movq 0x18(%rdi), %r12 movq 0x20(%rdi), %r13 movq 0x28(%rdi), %r14 movq 0x30(%rdi), %r15 xor %rdx,%rdx mov $1,%rcx cmp %rax,%rdx cmove %rcx,%rax jmp *0x38(%rdi) #if defined(__ELF__) && defined(__linux__) .section .note.GNU-stack,"",%progbits #endif ncroxon-gnu-efi-157d47c/licenses/000077500000000000000000000000001471215650600167045ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/licenses/LICENSE.edk2000066400000000000000000000051711471215650600205410ustar00rootroot00000000000000Copyright (c) 2019, TianoCore and contributors. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent 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. Subject to the terms and conditions of this license, each copyright holder and contributor hereby grants to those receiving rights under this license a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except for failure to satisfy the conditions of this license) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer this software, where such license applies only to those patent claims, already acquired or hereafter acquired, licensable by such copyright holder or contributor that are necessarily infringed by: (a) their Contribution(s) (the licensed copyrights of copyright holders and non-copyrightable additions of contributors, in source or binary form) alone; or (b) combination of their Contribution(s) with the work of authorship to which such Contribution(s) was added by such copyright holder or contributor, if, at the time the Contribution is added, such addition causes such combination to be necessarily infringed. The patent license shall not apply to any other combinations which include the Contribution. Except as expressly stated above, no rights or licenses from any copyright holder or contributor is granted under this license, whether expressly, by implication, estoppel or otherwise. DISCLAIMER 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 HOLDERS 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. ncroxon-gnu-efi-157d47c/licenses/LICENSE.efilib000066400000000000000000000030231471215650600211400ustar00rootroot00000000000000 The files in the "lib" and "inc" subdirectories are using the EFI Application Toolkit distributed by Intel at http://developer.intel.com/technology/efi This code is covered by the following agreement: Copyright (c) 1998-2000 Intel Corporation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED ``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 INTEL 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. THE EFI SPECIFICATION AND ALL OTHER INFORMATION ON THIS WEB SITE ARE PROVIDED "AS IS" WITH NO WARRANTIES, AND ARE SUBJECT TO CHANGE WITHOUT NOTICE. ncroxon-gnu-efi-157d47c/tests/000077500000000000000000000000001471215650600162415ustar00rootroot00000000000000ncroxon-gnu-efi-157d47c/tests/gen_tests.sh000077500000000000000000000020461471215650600205750ustar00rootroot00000000000000#!/usr/bin/env bash ## @file # Test generation script for gnu-efi. # # Copyright (c) 2023-2024, Pete Batard # # SPDX-License-Identifier: GPL-2.0-or-later # ## TEST_DIR=./run rm -rf $TEST_DIR mkdir $TEST_DIR test_number=0 while IFS=$'\r\n' read -r line; do if [[ ${line:0:1} == "#" ]]; then test_number=$((test_number + 1)) data_file=$(printf "%s/%03d %s.dat" $TEST_DIR $test_number "${line:2}") setup_file=$(printf "%s/%03d setup.sh" $TEST_DIR $test_number) teardown_file=$(printf "%s/%03d teardown.sh" $TEST_DIR $test_number) elif [[ ${line:0:1} == ">" ]]; then if [[ ! -f "$setup_file" ]]; then echo "#!/usr/bin/env bash" > "$setup_file" chmod 755 "$setup_file" fi echo "${line:2}" >> "$setup_file" elif [[ ${line:0:1} == "<" ]]; then if [[ ! -f "$teardown_file" ]]; then echo "#!/usr/bin/env bash" > "$teardown_file" chmod 755 "$teardown_file" fi echo "${line:2}" >> "$teardown_file" elif [[ ! -z "$line" ]]; then echo "${line}" >> "$data_file" fi done < $1 ncroxon-gnu-efi-157d47c/tests/run_tests.sh000077500000000000000000000051201471215650600206240ustar00rootroot00000000000000#!/usr/bin/env bash ## @file # Test script for gnu-efi. # # Copyright (c) 2023-2024, Pete Batard # # SPDX-License-Identifier: GPL-2.0-or-later # ## TEST_DIR=./run LINE_LEN=64 TIMEOUT=2m MIN_TEST="${1:-001}" MAX_TEST="${2:-999}" NUM_PASS=0 NUM_FAIL=0 NUM_ERROR=0 if [[ -z "$QEMU_CMD" ]]; then echo '$QEMU_CMD is not set' exit 1 fi for t in $TEST_DIR/*.dat; do base=$(basename "${t%.dat}") test_number=${base:0:3} test_name=${base:4} test_desc="Test #$test_number: ${test_name}... " nb_lines=$(wc -l < "$t") if [[ $nb_lines -eq 0 ]]; then nb_lines=1 fi # Arguments can be provided to run only a specified range of tests if [[ 10#$test_number -lt 10#$MIN_TEST ]]; then continue fi if [[ 10#$test_number -gt 10#$MAX_TEST ]]; then break fi # Run pre test script if required if [[ -x "$TEST_DIR/$test_number setup.sh" ]]; then . "$TEST_DIR/$test_number setup.sh" > /dev/null 2>&1 fi echo -n "$test_desc" num_blanks=$((LINE_LEN - ${#test_desc})) if [[ $num_blanks -gt 0 ]]; then padding="$(printf '%*s' $num_blanks)" echo -n "$padding" fi # Run qemu with a timeout rm -f output.txt error.txt timeout --foreground $TIMEOUT bash -c "${QEMU_CMD} 1>output.txt 2>error.txt" err=$? if [[ $err -eq 124 ]]; then echo "[ERROR] (Time out)" NUM_ERROR=$((NUM_ERROR + 1)) elif [[ $err -ne 0 ]]; then echo "[ERROR] ($err)" cat error.txt NUM_ERROR=$((NUM_ERROR + 1)) else tail -n $nb_lines output.txt | diff -Z --strip-trailing-cr -q "$t" - >/dev/null 2>&1 if [[ $? -eq 0 ]]; then echo "[PASS]" NUM_PASS=$((NUM_PASS + 1)) else echo "[FAIL]" NUM_FAIL=$((NUM_FAIL + 1)) echo "Output of failed test was:" echo "-------------------------------------------------------------------------------" tail -n +3 output.txt echo "-------------------------------------------------------------------------------" fi fi # Run post test script if required if [[ -x "$TEST_DIR/$test_number teardown.sh" ]]; then . "$TEST_DIR/$test_number teardown.sh" > /dev/null 2>&1 fi done echo echo "===============================================================================" echo "# Test summary for gnu-efi" echo "===============================================================================" echo "# TOTAL: $((NUM_PASS + NUM_FAIL + NUM_ERROR))" echo "# PASS: $NUM_PASS" echo "# FAIL: $NUM_FAIL" echo "# ERROR: $NUM_ERROR" echo "===============================================================================" if [[ $NUM_FAIL -ne 0 || $NUM_ERROR -ne 0 ]]; then exit 1 fi ncroxon-gnu-efi-157d47c/tests/test_list.txt000066400000000000000000000026141471215650600210170ustar00rootroot00000000000000# ConOut text output > cp t.efi $UEFI_DIR > echo "@echo -off" > $UEFI_DIR/startup.nsh > echo "FS0:\t.efi" >> $UEFI_DIR/startup.nsh > echo "reset -s" >> $UEFI_DIR/startup.nsh Hello World! Hello World! < rm $UEFI_DIR/*.efi # Test args > cp tcc.efi $UEFI_DIR > echo "@echo -off" > $UEFI_DIR/startup.nsh > echo "FS0:\tcc.efi" >> $UEFI_DIR/startup.nsh > echo "reset -s" >> $UEFI_DIR/startup.nsh Hello Returning Failure works 0 args works just fine here. 1 arg works just fine here. 2 args works just fine here. 3 args works just fine here. 4 args works just fine here. 5 args works just fine here. 6 args works just fine here. 7 args works just fine here. 8 args works just fine here. 9 args works just fine here. 10 args works just fine here. < rm $UEFI_DIR/*.efi # Print args > cp t8.efi $UEFI_DIR > echo "@echo -off" > $UEFI_DIR/startup.nsh > echo "FS0:\t8.efi Test1 Test2" >> $UEFI_DIR/startup.nsh > echo "reset -s" >> $UEFI_DIR/startup.nsh Hello World, started with Argc=3 Argv[0] = 'FS0:\t8.efi' Argv[1] = 'Test1' Argv[2] = 'Test2' Bye. < rm $UEFI_DIR/*.efi # Test driver > cp drv0.efi drv0_use.efi $UEFI_DIR > echo "@echo -off" > $UEFI_DIR/startup.nsh > echo "load FS0:\drv0.efi" >> $UEFI_DIR/startup.nsh > echo "FS0:\drv0_use.efi" >> $UEFI_DIR/startup.nsh > echo "reset -s" >> $UEFI_DIR/startup.nsh Playing with driver instance 0... Hello Sample UEFI Driver! Hello was called 1 time(s). < rm $UEFI_DIR/*.efi