moved everything to chookspace
This commit is contained in:
1324
gnu-efi/ChangeLog
Normal file
1324
gnu-efi/ChangeLog
Normal file
File diff suppressed because it is too large
Load Diff
183
gnu-efi/Make.defaults
Normal file
183
gnu-efi/Make.defaults
Normal file
@@ -0,0 +1,183 @@
|
||||
# -*- makefile -*-
|
||||
# Copyright (c) 1999-2007 Hewlett-Packard Development Company, L.P.
|
||||
# Contributed by David Mosberger <davidm@hpl.hp.com>
|
||||
# Contributed by Stephane Eranian <eranian@hpl.hp.com>
|
||||
#
|
||||
# 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
|
||||
#
|
||||
INSTALLROOT := /
|
||||
PREFIX := /usr/local
|
||||
LIBDIR := $(PREFIX)/lib
|
||||
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
|
||||
|
||||
|
||||
# Host/target identification
|
||||
OS := $(shell uname -s)
|
||||
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
|
||||
|
||||
#
|
||||
# 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
|
||||
|
||||
ifeq ($(ARCH),x86_64)
|
||||
GCCVERSION := $(shell $(CC) -dumpversion | cut -f1 -d.)
|
||||
GCCMINOR := $(shell $(CC) -dumpversion | cut -f2 -d.)
|
||||
USING_CLANG := $(shell $(CC) -v 2>&1 | grep -q 'clang version' && echo clang)
|
||||
|
||||
# Rely on GCC MS ABI support?
|
||||
GCCNEWENOUGH := $(shell ( [ $(GCCVERSION) -gt "4" ] \
|
||||
|| ( [ $(GCCVERSION) -eq "4" ] \
|
||||
&& [ $(GCCMINOR) -ge "7" ] ) ) \
|
||||
&& echo 1)
|
||||
ifeq ($(GCCNEWENOUGH),1)
|
||||
CPPFLAGS += -DGNU_EFI_USE_MS_ABI -maccumulate-outgoing-args --std=c11
|
||||
else ifeq ($(USING_CLANG),clang)
|
||||
CPPFLAGS += -DGNU_EFI_USE_MS_ABI --std=c11
|
||||
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 >/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
|
||||
#
|
||||
ifneq ($(ARCH),aarch64)
|
||||
ifneq ($(ARCH),arm)
|
||||
ifneq ($(ARCH),mips64el)
|
||||
export HAVE_EFI_OBJCOPY=y
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq ($(ARCH),arm)
|
||||
export LIBGCC=$(shell $(CC) $(ARCH3264) -print-libgcc-file-name)
|
||||
endif
|
||||
|
||||
ifeq ($(ARCH),arm)
|
||||
CFLAGS += -marm
|
||||
endif
|
||||
|
||||
# Generic compilation flags
|
||||
INCDIR += -I$(SRCDIR) -I$(TOPDIR)/inc -I$(TOPDIR)/inc/$(ARCH) \
|
||||
-I$(TOPDIR)/inc/protocol
|
||||
|
||||
# Only enable -fpic for non MinGW compilers (unneeded on MinGW)
|
||||
GCCMACHINE := $(shell $(CC) -dumpmachine)
|
||||
ifneq (mingw32,$(findstring mingw32, $(GCCMACHINE)))
|
||||
CFLAGS += -fpic
|
||||
endif
|
||||
|
||||
ifeq (FreeBSD, $(findstring FreeBSD, $(OS)))
|
||||
CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \
|
||||
-fshort-wchar -fno-strict-aliasing \
|
||||
-ffreestanding -fno-stack-protector
|
||||
else
|
||||
CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \
|
||||
-fshort-wchar -fno-strict-aliasing \
|
||||
-ffreestanding -fno-stack-protector -fno-stack-check \
|
||||
-fno-stack-check \
|
||||
$(if $(findstring gcc,$(CC)),-fno-merge-all-constants,)
|
||||
endif
|
||||
|
||||
ARFLAGS := rDv
|
||||
ASFLAGS += $(ARCH3264)
|
||||
LDFLAGS += -nostdlib --warn-common --no-undefined --fatal-warnings \
|
||||
--build-id=sha1
|
||||
64
gnu-efi/Make.rules
Normal file
64
gnu-efi/Make.rules
Normal file
@@ -0,0 +1,64 @@
|
||||
#
|
||||
# Copyright (C) 1999-2007 Hewlett-Packard Co.
|
||||
# Contributed by David Mosberger <davidm@hpl.hp.com>
|
||||
# Contributed by Stephane Eranian <eranian@hpl.hp.com>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
%.efi: %.so
|
||||
$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \
|
||||
-j .rela -j .rel.* -j .rela.* -j .rel* -j .rela* \
|
||||
-j .reloc $(FORMAT) $*.so $@
|
||||
|
||||
%.efi.debug: %.so
|
||||
$(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
|
||||
$(LD) $(LDFLAGS) $^ -o $@ $(LOADLIBES)
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
|
||||
|
||||
%.s: %.c
|
||||
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -S $< -o $@
|
||||
|
||||
%.i: %.c
|
||||
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -E $< -o $@
|
||||
|
||||
%.o: %.S
|
||||
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
|
||||
|
||||
%.s: %.S
|
||||
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -E $< -o $@
|
||||
129
gnu-efi/Makefile
Normal file
129
gnu-efi/Makefile
Normal file
@@ -0,0 +1,129 @@
|
||||
#
|
||||
# Copyright (C) 1999-2007 Hewlett-Packard Co.
|
||||
# Contributed by David Mosberger <davidm@hpl.hp.com>
|
||||
# Contributed by Stephane Eranian <eranian@hpl.hp.com>
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
VERSION = 3.0.12
|
||||
|
||||
MKFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
|
||||
SRCDIR = $(dir $(MKFILE_PATH))
|
||||
|
||||
VPATH = $(SRCDIR)
|
||||
|
||||
include $(SRCDIR)/Make.defaults
|
||||
|
||||
SUBDIRS = lib gnuefi inc apps bootloader
|
||||
gnuefi: lib
|
||||
|
||||
all: check_gcc $(SUBDIRS)
|
||||
|
||||
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 -f *~
|
||||
@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:
|
||||
@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"
|
||||
|
||||
30
gnu-efi/README.efilib
Normal file
30
gnu-efi/README.efilib
Normal file
@@ -0,0 +1,30 @@
|
||||
|
||||
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.
|
||||
19
gnu-efi/README.elilo
Normal file
19
gnu-efi/README.elilo
Normal file
@@ -0,0 +1,19 @@
|
||||
|
||||
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:
|
||||
|
||||
http://www.sf.net/projects/gnu-efi
|
||||
http://www.sf.net/projects/elilo
|
||||
21
gnu-efi/README.git
Normal file
21
gnu-efi/README.git
Normal file
@@ -0,0 +1,21 @@
|
||||
README.git
|
||||
|
||||
Generating releases from git a very simple process;
|
||||
|
||||
1) Edit the file "Makefile". Changing the "VERSION" line to the new version.
|
||||
2) Do a "git commit" just for the version number change.
|
||||
3) Then do a "make test-archive".
|
||||
That will make a file in the current directory gnu-efi-$VERSION.tar.bz2 ,
|
||||
with its top level directory gnu-efi-$VERSION/ and the source tree under that.
|
||||
|
||||
Once you've tested that and you're sure it's what you want to release,
|
||||
4) Do "make archive", which will tag a release in git and generate a
|
||||
final tarball from it.
|
||||
|
||||
You then push to the archive, being sure to include the tag:
|
||||
5) "git push origin master:master --tags"
|
||||
|
||||
And upload the archive wherever it's supposed to go.
|
||||
|
||||
|
||||
|
||||
405
gnu-efi/README.gnuefi
Normal file
405
gnu-efi/README.gnuefi
Normal file
@@ -0,0 +1,405 @@
|
||||
-------------------------------------------------
|
||||
Building EFI Applications Using the GNU Toolchain
|
||||
-------------------------------------------------
|
||||
|
||||
David Mosberger <davidm@hpl.hp.com>
|
||||
|
||||
23 September 1999
|
||||
|
||||
|
||||
Copyright (c) 1999-2007 Hewlett-Packard Co.
|
||||
Copyright (c) 2006-2010 Intel Co.
|
||||
|
||||
Last update: 04/09/2007
|
||||
|
||||
* 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 x86 and x86_64 EFI applications, the following tools are needed:
|
||||
|
||||
- gcc-3.0 or newer (gcc 2.7.2 is NOT sufficient!)
|
||||
As of gnu-efi-3.0b, the Redhat 8.0 toolchain is known to work,
|
||||
but the Redhat 9.0 toolchain is not currently supported.
|
||||
|
||||
- A version of "objcopy" that supports EFI applications. 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" 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.
|
||||
|
||||
To develop IA-64 EFI applications, the following tools are needed:
|
||||
|
||||
- A version of gcc newer than July 30th 1999 (older versions
|
||||
had problems with generating position independent code).
|
||||
As of gnu-efi-3.0b, gcc-3.1 is known to work well.
|
||||
|
||||
- A version of "objcopy" that supports EFI applications. To
|
||||
check if your version includes EFI support, issue the
|
||||
command:
|
||||
|
||||
objcopy --help
|
||||
|
||||
Verify that the line "supported targets" contains the string
|
||||
"efi-app-ia64" and that the "-j" option accepts wildcards.
|
||||
|
||||
- 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.
|
||||
|
||||
|
||||
** 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.
|
||||
|
||||
** 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
|
||||
<efilib.h>. 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 spec at
|
||||
|
||||
http://msdn.microsoft.com/library/specs/msdn_pecoff.htm.
|
||||
|
||||
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:
|
||||
|
||||
.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=<sysv|gnu|both> 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.
|
||||
|
||||
.text
|
||||
Collects all sections containing executable code.
|
||||
|
||||
.data
|
||||
Collects read-only and read-write data, literal string data,
|
||||
global offset tables, the uninitialized data segment (bss) and
|
||||
various other sections containing data.
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
.dynamic, .dynsym, .rela, .rel, .reloc
|
||||
These sections contains the dynamic information necessary to
|
||||
self-relocate the binary (see below).
|
||||
|
||||
A couple of more points worth noting about the linker script:
|
||||
|
||||
o 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".
|
||||
|
||||
o 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... ;-).
|
||||
|
||||
o 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.
|
||||
|
||||
o 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:
|
||||
|
||||
(a) build an ELF shared object
|
||||
|
||||
(b) link it together with a self-relocator that takes care of
|
||||
applying the dynamic relocations that may be present in the
|
||||
ELF shared object
|
||||
|
||||
(c) 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
|
||||
|
||||
As of gnu-efi-3.0, we make use (and somewhat abuse) 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
|
||||
|
||||
* * * The End * * *
|
||||
184
gnu-efi/apps/AllocPages.c
Normal file
184
gnu-efi/apps/AllocPages.c
Normal file
@@ -0,0 +1,184 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) 2013 Jerry Hoemann <jerry.hoemann@hp.com>
|
||||
*
|
||||
*
|
||||
* 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 <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
|
||||
#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(L"AllocatePage: __AllocType__ __MemType__ __NumPages__ [__Addr__]\n");
|
||||
Print(L"__AllocType__ {0,1,2} -- Any, MaxAddr, Addr\n");
|
||||
Print(L"__MemType__ {0..13}, Reserved ==0, LCode==1, LData==2, BSCode==3, BSData==4, ...\n");
|
||||
Print(L"__NumPages__ {0..%x}\n", MAX_NUM_PAGES);
|
||||
Print(L"[__Addr__] 0... %llx\n", MAX_ADDR);
|
||||
Print(L"All numbers in hex no leading 0x\n");
|
||||
Print(L"\n");
|
||||
|
||||
#if DEBUG
|
||||
Print(L"Now get argc/argv\n");
|
||||
#endif
|
||||
argc = GetShellArgcArgv(image, &argv);
|
||||
#if DEBUG
|
||||
Print(L"argc = %d\n", argc);
|
||||
#endif
|
||||
|
||||
#if DEBUG
|
||||
for (c = 0; c < argc; c++ ) {
|
||||
Print(L"argv[%d] = <%s>\n", c, argv[c]);
|
||||
}
|
||||
#endif
|
||||
if ( (argc < 4) || (argc > 5) ) {
|
||||
Print(L"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(L"Invalid AllocType\n");
|
||||
err++;
|
||||
}
|
||||
if ( (MemType < 0) || (MemType > 13) ) {
|
||||
Print(L"Invalid MemType\n");
|
||||
err++;
|
||||
}
|
||||
if ( (NumPages < 0) || (NumPages > MAX_NUM_PAGES) ) {
|
||||
Print(L"Inavlid NumPages\n");
|
||||
err++;
|
||||
}
|
||||
if ( Addr > MAX_ADDR ) {
|
||||
Print(L"Inavlid Address\n");
|
||||
err++;
|
||||
}
|
||||
if ( err ) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Print(L"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(L"Allocate Pages Failed: %d\n", efi_status);
|
||||
return efi_status;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
145
gnu-efi/apps/FreePages.c
Normal file
145
gnu-efi/apps/FreePages.c
Normal file
@@ -0,0 +1,145 @@
|
||||
|
||||
|
||||
/*
|
||||
* Copyright (C) 2013 Jerry Hoemann <jerry.hoemann@hp.com>
|
||||
*
|
||||
* 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 <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
/*
|
||||
* 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(L"FreePages: __PhysAddr__ __PgCnt__\n");
|
||||
Print(L"__PhysAddr__ 0... %llx\n", MAX_ADDR);
|
||||
Print(L"__PgCnt__ [0..%lx]\n", MAX_NUM_PAGES);
|
||||
Print(L"All numbers hex w/ no leading 0x\n");
|
||||
Print(L"\n");
|
||||
|
||||
#if DEBUG
|
||||
Print(L"Now parse argc/argv\n");
|
||||
#endif
|
||||
argc = GetShellArgcArgv(image, &argv);
|
||||
#if DEBUG
|
||||
Print(L"argc = %d\n", argc);
|
||||
#endif
|
||||
|
||||
#if DEBUG
|
||||
for (c = 0; c < argc; c++ ) {
|
||||
Print(L"argv[%d] = <%s>\n", c, argv[c]);
|
||||
}
|
||||
#endif
|
||||
if (argc != 3) {
|
||||
Print(L"Invalid argument count\n");
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
PhysAddr = xtoi(argv[1]);
|
||||
PgCnt = xtoi(argv[2]);
|
||||
|
||||
if ( (PgCnt < 0) || (PgCnt > MAX_NUM_PAGES) ) {
|
||||
Print(L"Inavlid PgCnt\n");
|
||||
err++;
|
||||
}
|
||||
if ( PhysAddr > MAX_ADDR ) {
|
||||
Print(L"Inavlid Address\n");
|
||||
err++;
|
||||
}
|
||||
if ( err ) {
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
Print(L"FreePages(%lx,%d)\n", PhysAddr, PgCnt);
|
||||
|
||||
efi_status = uefi_call_wrapper(BS->FreePages, 2, PhysAddr, PgCnt);
|
||||
|
||||
if ( EFI_ERROR(efi_status) ) {
|
||||
Print(L"Free Pages Failed: %d\n", efi_status);
|
||||
return efi_status;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
95
gnu-efi/apps/Makefile
Normal file
95
gnu-efi/apps/Makefile
Normal file
@@ -0,0 +1,95 @@
|
||||
#
|
||||
# Copyright (C) 1999-2001 Hewlett-Packard Co.
|
||||
# Contributed by David Mosberger <davidm@hpl.hp.com>
|
||||
# Contributed by Stephane Eranian <eranian@hpl.hp.com>
|
||||
#
|
||||
# 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)
|
||||
|
||||
include $(SRCDIR)/../Make.defaults
|
||||
|
||||
TOPDIR = $(SRCDIR)/..
|
||||
|
||||
CDIR=$(TOPDIR)/..
|
||||
LINUX_HEADERS = /usr/src/sys/build
|
||||
CPPFLAGS += -D__KERNEL__ -I$(LINUX_HEADERS)/include
|
||||
CRTOBJS = ../gnuefi/crt0-efi-$(ARCH).o
|
||||
|
||||
LDSCRIPT = $(TOPDIR)/gnuefi/elf_$(ARCH)_efi.lds
|
||||
ifneq (,$(findstring FreeBSD,$(OS)))
|
||||
LDSCRIPT = $(TOPDIR)/gnuefi/elf_$(ARCH)_fbsd_efi.lds
|
||||
endif
|
||||
|
||||
LDFLAGS += -shared -Bsymbolic -L../lib -L../gnuefi $(CRTOBJS)
|
||||
|
||||
LOADLIBES += -lefi -lgnuefi
|
||||
LOADLIBES += $(LIBGCC)
|
||||
LOADLIBES += -T $(LDSCRIPT)
|
||||
|
||||
TARGET_APPS = t.efi t2.efi t3.efi t4.efi t5.efi t6.efi \
|
||||
printenv.efi t7.efi t8.efi tcc.efi modelist.efi \
|
||||
route80h.efi drv0_use.efi AllocPages.efi exit.efi \
|
||||
FreePages.efi setjmp.efi debughook.efi debughook.efi.debug \
|
||||
bltgrid.efi lfbgrid.efi setdbg.efi unsetdbg.efi
|
||||
TARGET_BSDRIVERS = drv0.efi
|
||||
TARGET_RTDRIVERS =
|
||||
|
||||
ifneq ($(HAVE_EFI_OBJCOPY),)
|
||||
|
||||
FORMAT := --target efi-app-$(ARCH)
|
||||
$(TARGET_BSDRIVERS): FORMAT=--target efi-bsdrv-$(ARCH)
|
||||
$(TARGET_RTDRIVERS): FORMAT=--target efi-rtdrv-$(ARCH)
|
||||
|
||||
else
|
||||
|
||||
SUBSYSTEM := 0xa
|
||||
$(TARGET_BSDRIVERS): SUBSYSTEM = 0xb
|
||||
$(TARGET_RTDRIVERS): SUBSYSTEM = 0xc
|
||||
|
||||
FORMAT := -O binary
|
||||
LDFLAGS += --defsym=EFI_SUBSYSTEM=$(SUBSYSTEM)
|
||||
|
||||
endif
|
||||
|
||||
TARGETS = $(TARGET_APPS) $(TARGET_BSDRIVERS) $(TARGET_RTDRIVERS)
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
clean:
|
||||
rm -f $(TARGETS) *~ *.o *.so
|
||||
|
||||
.PHONY: install
|
||||
|
||||
include $(SRCDIR)/../Make.rules
|
||||
131
gnu-efi/apps/bltgrid.c
Normal file
131
gnu-efi/apps/bltgrid.c
Normal file
@@ -0,0 +1,131 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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(L"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 (EFI_ERROR(rc) && rc == EFI_NOT_STARTED) {
|
||||
Print(L"gop->QueryMode() returned %r\n", rc);
|
||||
Print(L"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(L"%d: Bad response from QueryMode: %r (%d)\n",
|
||||
i, rc, rc);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (CompareMem(info, gop->Mode->Info, sizeof (*info)))
|
||||
continue;
|
||||
|
||||
NumPixels = info->VerticalResolution * info->HorizontalResolution;
|
||||
BufferSize = NumPixels * sizeof(UINT32);
|
||||
|
||||
PixelBuffer = AllocatePool(BufferSize);
|
||||
if (!PixelBuffer) {
|
||||
Print(L"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);
|
||||
return;
|
||||
}
|
||||
Print(L"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(L"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(L"Could not locate GOP: %r\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (!gop) {
|
||||
Print(L"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc);
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
draw_boxes(gop);
|
||||
|
||||
SetWatchdog(0);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
97
gnu-efi/apps/debughook.c
Normal file
97
gnu-efi/apps/debughook.c
Normal file
@@ -0,0 +1,97 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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}};
|
||||
|
||||
#if defined(__clang__)
|
||||
# define _OPTNONE __attribute__((optnone))
|
||||
#else
|
||||
# define _OPTNONE __attribute__((__optimize__("0")))
|
||||
#endif
|
||||
|
||||
static _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(L"DUMMY_DEBUG", &data, &dataSize, guid);
|
||||
if (EFI_ERROR(efi_status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Print(L"add-symbol-file /usr/lib/debug/boot/efi/debughook.debug "
|
||||
L"0x%08x -s .data 0x%08x\n", &_text, &_data);
|
||||
|
||||
Print(L"Pausing for debugger attachment.\n");
|
||||
Print(L"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;
|
||||
}
|
||||
191
gnu-efi/apps/drv0.c
Normal file
191
gnu-efi/apps/drv0.c
Normal file
@@ -0,0 +1,191 @@
|
||||
/*
|
||||
* Copyright (C) 2013 David Decotigny <decot@googlers.com>
|
||||
*
|
||||
* 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 <efi.h>
|
||||
#include <efilib.h>
|
||||
#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(L"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(L"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(L"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(L"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(L"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() */
|
||||
}
|
||||
35
gnu-efi/apps/drv0.h
Normal file
35
gnu-efi/apps/drv0.h
Normal file
@@ -0,0 +1,35 @@
|
||||
#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
|
||||
79
gnu-efi/apps/drv0_use.c
Normal file
79
gnu-efi/apps/drv0_use.c
Normal file
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (C) 2013 David Decotigny <decot@googlers.com>
|
||||
*
|
||||
* See drv0.c for an example session.
|
||||
*/
|
||||
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
#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(L"Cannot open proto: %d\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = uefi_call_wrapper(drv->SayHello, 2, L"Sample UEFI Driver");
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"Cannot call SayHello: %d\n", Status);
|
||||
}
|
||||
|
||||
Status = uefi_call_wrapper(drv->GetNumberOfHello, 2, &NumberOfHello);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"Cannot call GetNumberOfHello: %d\n", Status);
|
||||
} else {
|
||||
Print(L"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(L"Error looking up handles for proto: %d\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < NoHandles ; ++i)
|
||||
{
|
||||
Print(L"Playing with driver instance %d...\n", i);
|
||||
Status = PlayWithGnuEfiAppsDrv0Protocol(Handles[i]);
|
||||
if (EFI_ERROR(Status))
|
||||
Print(L"Error playing with instance %d, skipping\n", i);
|
||||
}
|
||||
|
||||
if (Handles)
|
||||
FreePool(Handles);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
12
gnu-efi/apps/exit.c
Normal file
12
gnu-efi/apps/exit.c
Normal file
@@ -0,0 +1,12 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
EFI_STATUS
|
||||
efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab)
|
||||
{
|
||||
InitializeLib(image_handle, systab);
|
||||
|
||||
Exit(EFI_SUCCESS, 0, NULL);
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
170
gnu-efi/apps/lfbgrid.c
Normal file
170
gnu-efi/apps/lfbgrid.c
Normal file
@@ -0,0 +1,170 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
extern EFI_GUID GraphicsOutputProtocol;
|
||||
|
||||
#define be32_to_cpu(x) __builtin_bswap32(x)
|
||||
|
||||
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(L"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 defined(__x86_64__) || defined(__aarch64__)
|
||||
UINT64 FrameBufferAddr;
|
||||
#elif defined(__i386__) || defined(__arm__)
|
||||
UINT32 FrameBufferAddr;
|
||||
#else
|
||||
#error YOUR ARCH HERE
|
||||
#endif
|
||||
|
||||
if (gop->Mode) {
|
||||
imax = gop->Mode->MaxMode;
|
||||
} else {
|
||||
Print(L"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 (EFI_ERROR(rc) && rc == EFI_NOT_STARTED) {
|
||||
Print(L"gop->QueryMode() returned %r\n", rc);
|
||||
Print(L"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(L"%d: Bad response from QueryMode: %r (%d)\n",
|
||||
i, rc, rc);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (CompareMem(info, gop->Mode->Info, sizeof (*info)))
|
||||
continue;
|
||||
|
||||
NumPixels = info->VerticalResolution * info->PixelsPerScanLine;
|
||||
BufferSize = NumPixels * sizeof(UINT32);
|
||||
if (BufferSize == gop->Mode->FrameBufferSize) {
|
||||
CopySize = BufferSize;
|
||||
} else {
|
||||
CopySize = BufferSize < gop->Mode->FrameBufferSize ?
|
||||
BufferSize : gop->Mode->FrameBufferSize;
|
||||
Print(L"height * pitch * pixelsize = %lu buf fb size is %lu; using %lu\n",
|
||||
BufferSize, gop->Mode->FrameBufferSize, CopySize);
|
||||
}
|
||||
|
||||
PixelBuffer = AllocatePool(BufferSize);
|
||||
if (!PixelBuffer) {
|
||||
Print(L"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(L"No linear framebuffer on this device.\n");
|
||||
return;
|
||||
}
|
||||
#if defined(__x86_64__) || defined(__aarch64__)
|
||||
FrameBufferAddr = (UINT64)gop->Mode->FrameBufferBase;
|
||||
#elif defined(__i386__) || defined(__arm__)
|
||||
FrameBufferAddr = (UINT32)(UINT64)gop->Mode->FrameBufferBase;
|
||||
#else
|
||||
#error YOUR ARCH HERE
|
||||
#endif
|
||||
|
||||
CopyMem((VOID *)FrameBufferAddr, PixelBuffer, CopySize);
|
||||
return;
|
||||
}
|
||||
Print(L"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(L"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(L"Could not locate GOP: %r\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (!gop) {
|
||||
Print(L"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc);
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
draw_boxes(gop);
|
||||
|
||||
SetWatchdog(0);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
108
gnu-efi/apps/modelist.c
Normal file
108
gnu-efi/apps/modelist.c
Normal file
@@ -0,0 +1,108 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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(L"GOP reports MaxMode %d\n", imax);
|
||||
} else {
|
||||
Print(L"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 (EFI_ERROR(rc) && rc == EFI_NOT_STARTED) {
|
||||
Print(L"gop->QueryMode() returned %r\n", rc);
|
||||
Print(L"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(L"%d: Bad response from QueryMode: %r (%d)\n",
|
||||
i, rc, rc);
|
||||
continue;
|
||||
}
|
||||
Print(L"%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(L"RGBR");
|
||||
break;
|
||||
case PixelBlueGreenRedReserved8BitPerColor:
|
||||
Print(L"BGRR");
|
||||
break;
|
||||
case PixelBitMask:
|
||||
Print(L"R:%08x G:%08x B:%08x X:%08x",
|
||||
info->PixelInformation.RedMask,
|
||||
info->PixelInformation.GreenMask,
|
||||
info->PixelInformation.BlueMask,
|
||||
info->PixelInformation.ReservedMask);
|
||||
break;
|
||||
case PixelBltOnly:
|
||||
Print(L"(blt only)");
|
||||
break;
|
||||
default:
|
||||
Print(L"(Invalid pixel format)");
|
||||
break;
|
||||
}
|
||||
Print(L" 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(L"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(L"Could not locate GOP: %r\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (!gop) {
|
||||
Print(L"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc);
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
print_modes(gop);
|
||||
|
||||
SetWatchdog(0);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
32
gnu-efi/apps/printenv.c
Normal file
32
gnu-efi/apps/printenv.c
Normal file
@@ -0,0 +1,32 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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(L"GUID Variable Name Value\n");
|
||||
Print(L"=================================== ==================== ========\n");
|
||||
|
||||
StrCpy(fmt, L"%.-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;
|
||||
}
|
||||
136
gnu-efi/apps/route80h.c
Normal file
136
gnu-efi/apps/route80h.c
Normal file
@@ -0,0 +1,136 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
/* 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(L"current value is 0x%2x\n", val);
|
||||
|
||||
if (value) {
|
||||
val |= (1 << bit);
|
||||
} else {
|
||||
val &= ~(1 << bit);
|
||||
}
|
||||
Print(L"setting value to 0x%2x\n", val);
|
||||
*flag = val;
|
||||
val = *flag;
|
||||
Print(L"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(L"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(L"rcrb is not mapped, cannot route port 80h\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
lpcif.rcba &= ~1UL;
|
||||
|
||||
Print(L"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;
|
||||
}
|
||||
37
gnu-efi/apps/setdbg.c
Normal file
37
gnu-efi/apps/setdbg.c
Normal file
@@ -0,0 +1,37 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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(L"SHIM_DEBUG", &SHIM_GUID,
|
||||
EFI_VARIABLE_NON_VOLATILE |
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
sizeof(data), &data);
|
||||
if (EFI_ERROR(status))
|
||||
Print(L"SetVariable failed: %r\n", status);
|
||||
#endif
|
||||
|
||||
status = RT->SetVariable(L"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(L"SetVariable(GRUB_ENV) failed: %r\n", status);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
32
gnu-efi/apps/setjmp.c
Normal file
32
gnu-efi/apps/setjmp.c
Normal file
@@ -0,0 +1,32 @@
|
||||
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
#include <efisetjmp.h>
|
||||
|
||||
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(L"setjmp() = %d\n", rc);
|
||||
|
||||
if (rc == 3) {
|
||||
Print(L"3 worked\n");
|
||||
longjmp(env, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (rc == 1) {
|
||||
Print(L"0 got to be one yay\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
longjmp(env, 3);
|
||||
return 0;
|
||||
}
|
||||
27
gnu-efi/apps/t.c
Normal file
27
gnu-efi/apps/t.c
Normal file
@@ -0,0 +1,27 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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 *)L"Hello World!\n\r");
|
||||
uefi_call_wrapper(conout->OutputString, 2, conout, a2u("Hello World!\n\r"));
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
14
gnu-efi/apps/t2.c
Normal file
14
gnu-efi/apps/t2.c
Normal file
@@ -0,0 +1,14 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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, L"Hello World!\n\r");
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
95
gnu-efi/apps/t3.c
Normal file
95
gnu-efi/apps/t3.c
Normal file
@@ -0,0 +1,95 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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(L"Hello World! (0xd=0x%x, 13=%d)\n", 13, 13);
|
||||
|
||||
Print(L"before InitializeLib(): PoolAllocationType=%d\n",
|
||||
pat);
|
||||
|
||||
Print(L" after InitializeLib(): PoolAllocationType=%d\n",
|
||||
PoolAllocationType);
|
||||
|
||||
/*
|
||||
* Locate loaded_image_handle instance.
|
||||
*/
|
||||
|
||||
Print(L"BS->HandleProtocol() ");
|
||||
|
||||
efi_status = uefi_call_wrapper(
|
||||
BS->HandleProtocol,
|
||||
3,
|
||||
image_handle,
|
||||
&loaded_image_protocol,
|
||||
&void_li_p);
|
||||
li = void_li_p;
|
||||
|
||||
Print(L"%xh (%r)\n", efi_status, efi_status);
|
||||
|
||||
if (efi_status != EFI_SUCCESS) {
|
||||
return efi_status;
|
||||
}
|
||||
|
||||
Print(L" li: %xh\n", li);
|
||||
|
||||
if (!li) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Print(L" li->Revision: %xh\n", li->Revision);
|
||||
Print(L" li->ParentHandle: %xh\n", li->ParentHandle);
|
||||
Print(L" li->SystemTable: %xh\n", li->SystemTable);
|
||||
Print(L" li->DeviceHandle: %xh\n", li->DeviceHandle);
|
||||
Print(L" li->FilePath: %xh\n", li->FilePath);
|
||||
Print(L" li->Reserved: %xh\n", li->Reserved);
|
||||
Print(L" li->LoadOptionsSize: %xh\n", li->LoadOptionsSize);
|
||||
Print(L" li->LoadOptions: %xh\n", li->LoadOptions);
|
||||
Print(L" li->ImageBase: %xh\n", li->ImageBase);
|
||||
Print(L" li->ImageSize: %xh\n", li->ImageSize);
|
||||
Print(L" li->ImageCodeType: %xh\n", li->ImageCodeType);
|
||||
Print(L" li->ImageDataType: %xh\n", li->ImageDataType);
|
||||
Print(L" 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;
|
||||
}
|
||||
14
gnu-efi/apps/t4.c
Normal file
14
gnu-efi/apps/t4.c
Normal file
@@ -0,0 +1,14 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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, L"Hello application started\r\n");
|
||||
uefi_call_wrapper(systab->ConOut->OutputString, 2, systab->ConOut, L"\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;
|
||||
}
|
||||
13
gnu-efi/apps/t5.c
Normal file
13
gnu-efi/apps/t5.c
Normal file
@@ -0,0 +1,13 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
EFI_STATUS
|
||||
efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
|
||||
{
|
||||
InitializeLib(image, systab);
|
||||
Print(L"HelloLib application started\n");
|
||||
Print(L"\n\n\nHit any key to exit this image\n");
|
||||
WaitForSingleEvent(ST->ConIn->WaitForKey, 0);
|
||||
uefi_call_wrapper(ST->ConOut->OutputString, 2, ST->ConOut, L"\n\n");
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
43
gnu-efi/apps/t6.c
Normal file
43
gnu-efi/apps/t6.c
Normal file
@@ -0,0 +1,43 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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(L"handleprotocol: %r\n", status);
|
||||
}
|
||||
|
||||
#if 0
|
||||
BS->HandleProtocol(loaded_image->DeviceHandle, &DevicePathProtocol, (void **) &dev_path);
|
||||
|
||||
Print(L"Image device : %s\n", DevicePathToStr(dev_path));
|
||||
Print(L"Image file : %s\n", DevicePathToStr(loaded_image->FilePath));
|
||||
#endif
|
||||
Print(L"Image base : %lx\n", loaded_image->ImageBase);
|
||||
Print(L"Image size : %lx\n", loaded_image->ImageSize);
|
||||
Print(L"Load options size : %lx\n", loaded_image->LoadOptionsSize);
|
||||
Print(L"Load options : %s\n", loaded_image->LoadOptions);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
25
gnu-efi/apps/t7.c
Normal file
25
gnu-efi/apps/t7.c
Normal file
@@ -0,0 +1,25 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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(L"HelloLib application started\n");
|
||||
|
||||
Print(L"\n\n\nHit any key to exit this image\n");
|
||||
WaitForSingleEvent(ST->ConIn->WaitForKey, 0);
|
||||
|
||||
uefi_call_wrapper(ST->ConOut->OutputString, 2, ST->ConOut, L"\n\n");
|
||||
|
||||
efi_status = uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, &efi_input_key);
|
||||
|
||||
Print(L"ScanCode: %xh UnicodeChar: %xh CallRtStatus: %x\n",
|
||||
efi_input_key.ScanCode, efi_input_key.UnicodeChar, efi_status);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
19
gnu-efi/apps/t8.c
Normal file
19
gnu-efi/apps/t8.c
Normal file
@@ -0,0 +1,19 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
EFI_STATUS
|
||||
efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
|
||||
{
|
||||
INTN Argc, i;
|
||||
CHAR16 **Argv;
|
||||
|
||||
InitializeLib(ImageHandle, SystemTable);
|
||||
Argc = GetShellArgcArgv(ImageHandle, &Argv);
|
||||
|
||||
Print(L"Hello World, started with Argc=%d\n", Argc);
|
||||
for (i = 0 ; i < Argc ; ++i)
|
||||
Print(L" Argv[%d] = '%s'\n", i, Argv[i]);
|
||||
|
||||
Print(L"Bye.\n");
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
431
gnu-efi/apps/tcc.c
Normal file
431
gnu-efi/apps/tcc.c
Normal file
@@ -0,0 +1,431 @@
|
||||
/*
|
||||
* Test if our calling convention gymnastics actually work
|
||||
*/
|
||||
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
#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(L"%%rsp: 0x%08x%08x stack:\r\n",
|
||||
(rsp_val & 0xffffffff00000000) >>32,
|
||||
rsp_val & 0xffffffff);
|
||||
for (x = 0; x < 8; x++) {
|
||||
Print(L"%08x: ", ((uint64_t)rsp) & 0xffffffff);
|
||||
Print(L"%016x ", *rsp++);
|
||||
Print(L"%016x ", *rsp++);
|
||||
Print(L"%016x ", *rsp++);
|
||||
Print(L"%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(L"Hello\r\n");
|
||||
rc = test_failure();
|
||||
if (EFI_ERROR(rc)) {
|
||||
Print(L"Returning Failure works\n");
|
||||
} else {
|
||||
Print(L"Returning failure doesn't work.\r\n");
|
||||
Print(L"%%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(L"0 args works just fine here.\r\n");
|
||||
} else {
|
||||
Print(L"0 args failed: 0x%016x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = test_call1();
|
||||
if (!EFI_ERROR(rc)) {
|
||||
Print(L"1 arg works just fine here.\r\n");
|
||||
} else {
|
||||
Print(L"1 arg failed: 0x%016x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = test_call2();
|
||||
if (!EFI_ERROR(rc)) {
|
||||
Print(L"2 args works just fine here.\r\n");
|
||||
} else {
|
||||
Print(L"2 args failed: 0x%016x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = test_call3();
|
||||
if (!EFI_ERROR(rc)) {
|
||||
Print(L"3 args works just fine here.\r\n");
|
||||
} else {
|
||||
Print(L"3 args failed: 0x%016x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = test_call4();
|
||||
if (!EFI_ERROR(rc)) {
|
||||
Print(L"4 args works just fine here.\r\n");
|
||||
} else {
|
||||
Print(L"4 args failed: 0x%016x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = test_call5();
|
||||
if (!EFI_ERROR(rc)) {
|
||||
Print(L"5 args works just fine here.\r\n");
|
||||
} else {
|
||||
Print(L"5 args failed: 0x%016x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = test_call6();
|
||||
if (!EFI_ERROR(rc)) {
|
||||
Print(L"6 args works just fine here.\r\n");
|
||||
} else {
|
||||
Print(L"6 args failed: 0x%016x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = test_call7();
|
||||
if (!EFI_ERROR(rc)) {
|
||||
Print(L"7 args works just fine here.\r\n");
|
||||
} else {
|
||||
Print(L"7 args failed: 0x%016x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = test_call8();
|
||||
if (!EFI_ERROR(rc)) {
|
||||
Print(L"8 args works just fine here.\r\n");
|
||||
} else {
|
||||
Print(L"8 args failed: 0x%016x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = test_call9();
|
||||
if (!EFI_ERROR(rc)) {
|
||||
Print(L"9 args works just fine here.\r\n");
|
||||
} else {
|
||||
Print(L"9 args failed: 0x%016x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = test_call10();
|
||||
if (!EFI_ERROR(rc)) {
|
||||
Print(L"10 args works just fine here.\r\n");
|
||||
} else {
|
||||
Print(L"10 args failed: 0x%016x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
9
gnu-efi/apps/tpause.c
Normal file
9
gnu-efi/apps/tpause.c
Normal file
@@ -0,0 +1,9 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
EFI_STATUS
|
||||
efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
|
||||
{
|
||||
Print(L"Press `q' to quit, any other key to continue:\n");
|
||||
|
||||
}
|
||||
43
gnu-efi/apps/trivial.S
Normal file
43
gnu-efi/apps/trivial.S
Normal file
@@ -0,0 +1,43 @@
|
||||
.text
|
||||
.align 4
|
||||
|
||||
.globl _start
|
||||
_start:
|
||||
#if 0
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
pushl %ebx # save ebx
|
||||
movl 12(%ebp),%eax # eax <- systab
|
||||
movl 24(%eax),%ebx # ebx <- systab->FirmwareVendor
|
||||
pushl %ebx
|
||||
movl 44(%eax),%ebx # ebx <- systab->ConOut
|
||||
pushl %ebx
|
||||
movl 4(%ebx),%eax # eax <- conout->OutputString
|
||||
call *%eax
|
||||
movl -4(%ebp),%ebx # restore ebx
|
||||
leave
|
||||
ret
|
||||
|
||||
#else
|
||||
|
||||
pushl %ebp
|
||||
movl %esp,%ebp
|
||||
pushl %ebx
|
||||
call 0f
|
||||
0: popl %eax
|
||||
addl $hello-0b,%eax
|
||||
pushl %eax
|
||||
movl 12(%ebp),%eax # eax <- systab
|
||||
movl 44(%eax),%ebx # ebx <- systab->ConOut
|
||||
pushl %ebx
|
||||
movl 4(%ebx),%eax # eax <- conout->OutputString
|
||||
call *%eax
|
||||
movl -4(%ebp),%ebx
|
||||
leave
|
||||
ret
|
||||
|
||||
.section .rodata
|
||||
.align 2
|
||||
hello: .byte 'h',0,'e',0,'l',0,'l',0,'o',0,'\n',0,'\r',0,0,0
|
||||
|
||||
#endif
|
||||
37
gnu-efi/apps/unsetdbg.c
Normal file
37
gnu-efi/apps/unsetdbg.c
Normal file
@@ -0,0 +1,37 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
|
||||
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(L"SHIM_DEBUG", &SHIM_GUID,
|
||||
EFI_VARIABLE_NON_VOLATILE |
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS,
|
||||
0, &data);
|
||||
if (EFI_ERROR(status))
|
||||
Print(L"SetVariable failed: %r\n", status);
|
||||
|
||||
#if 0
|
||||
status = RT->SetVariable(L"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(L"SetVariable(GRUB_ENV) failed: %r\n", status);
|
||||
#endif
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
93
gnu-efi/bootloader/Makefile
Normal file
93
gnu-efi/bootloader/Makefile
Normal file
@@ -0,0 +1,93 @@
|
||||
#
|
||||
# Copyright (C) 1999-2001 Hewlett-Packard Co.
|
||||
# Contributed by David Mosberger <davidm@hpl.hp.com>
|
||||
# Contributed by Stephane Eranian <eranian@hpl.hp.com>
|
||||
#
|
||||
# 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)
|
||||
|
||||
include $(SRCDIR)/../Make.defaults
|
||||
|
||||
TOPDIR = $(SRCDIR)/..
|
||||
|
||||
CDIR=$(TOPDIR)/..
|
||||
LINUX_HEADERS = /usr/src/sys/build
|
||||
CPPFLAGS += -D__KERNEL__ -I$(LINUX_HEADERS)/include
|
||||
CRTOBJS = ../gnuefi/crt0-efi-$(ARCH).o
|
||||
|
||||
LDSCRIPT = $(TOPDIR)/gnuefi/elf_$(ARCH)_efi.lds
|
||||
ifneq (,$(findstring FreeBSD,$(OS)))
|
||||
LDSCRIPT = $(TOPDIR)/gnuefi/elf_$(ARCH)_fbsd_efi.lds
|
||||
endif
|
||||
|
||||
LDFLAGS += -shared -Bsymbolic -L../lib -L../gnuefi $(CRTOBJS)
|
||||
|
||||
LOADLIBES += -lefi -lgnuefi
|
||||
LOADLIBES += $(LIBGCC)
|
||||
LOADLIBES += -T $(LDSCRIPT)
|
||||
|
||||
TARGET_APPS = main.efi
|
||||
TARGET_BSDRIVERS =
|
||||
TARGET_RTDRIVERS =
|
||||
|
||||
ifneq ($(HAVE_EFI_OBJCOPY),)
|
||||
|
||||
FORMAT := --target efi-app-$(ARCH)
|
||||
$(TARGET_BSDRIVERS): FORMAT=--target efi-bsdrv-$(ARCH)
|
||||
$(TARGET_RTDRIVERS): FORMAT=--target efi-rtdrv-$(ARCH)
|
||||
|
||||
else
|
||||
|
||||
SUBSYSTEM := 0xa
|
||||
$(TARGET_BSDRIVERS): SUBSYSTEM = 0xb
|
||||
$(TARGET_RTDRIVERS): SUBSYSTEM = 0xc
|
||||
|
||||
FORMAT := -O binary
|
||||
LDFLAGS += --defsym=EFI_SUBSYSTEM=$(SUBSYSTEM)
|
||||
|
||||
endif
|
||||
|
||||
TARGETS = $(TARGET_APPS) $(TARGET_BSDRIVERS) $(TARGET_RTDRIVERS)
|
||||
|
||||
CFLAGS += -Wno-error=unused-parameter -Wno-error=unused-variable
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
clean:
|
||||
rm -f $(TARGETS) *~ *.o *.so
|
||||
|
||||
.PHONY: install
|
||||
|
||||
include $(SRCDIR)/../Make.rules
|
||||
214
gnu-efi/bootloader/main.c
Normal file
214
gnu-efi/bootloader/main.c
Normal file
@@ -0,0 +1,214 @@
|
||||
#include <efi.h>
|
||||
#include <efilib.h>
|
||||
#include <elf.h>
|
||||
|
||||
typedef unsigned long long size_t;
|
||||
|
||||
typedef struct {
|
||||
void* BaseAddress;
|
||||
size_t BufferSize;
|
||||
unsigned int Width;
|
||||
unsigned int Height;
|
||||
unsigned int PixelsPerScanline;
|
||||
} Framebuffer;
|
||||
|
||||
#define PSF1_MAGIC0 0x36
|
||||
#define PSF1_MAGIC1 0x04
|
||||
|
||||
typedef struct {
|
||||
unsigned char magic[2];
|
||||
unsigned char mode;
|
||||
unsigned char charsize;
|
||||
} PSF1_HEADER;
|
||||
|
||||
typedef struct {
|
||||
PSF1_HEADER* psf1_Header;
|
||||
void* glyphBuffer;
|
||||
} PSF1_FONT;
|
||||
|
||||
Framebuffer framebuffer;
|
||||
Framebuffer* InitializeGOP() {
|
||||
EFI_GUID gopGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL* gop;
|
||||
EFI_STATUS status;
|
||||
|
||||
status = uefi_call_wrapper(BS->LocateProtocol, 3, &gopGuid, NULL, (void**)&gop);
|
||||
if (EFI_ERROR(status)) {
|
||||
Print(L"FATAL ERROR: Unable to locate GOP\n\r");
|
||||
return NULL;
|
||||
} else {
|
||||
Print(L"GOP located!\n\r");
|
||||
}
|
||||
|
||||
framebuffer.BaseAddress = (void*)gop->Mode->FrameBufferBase;
|
||||
framebuffer.BufferSize = gop->Mode->FrameBufferSize;
|
||||
framebuffer.Width = gop->Mode->Info->HorizontalResolution;
|
||||
framebuffer.Height = gop->Mode->Info->VerticalResolution;
|
||||
framebuffer.PixelsPerScanline = gop->Mode->Info->PixelsPerScanLine;
|
||||
|
||||
return &framebuffer;
|
||||
}
|
||||
|
||||
EFI_FILE* LoadFile(EFI_FILE* Directory, CHAR16* Path, EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTable){
|
||||
EFI_FILE* LoadedFile;
|
||||
|
||||
EFI_LOADED_IMAGE_PROTOCOL* LoadedImage;
|
||||
SystemTable->BootServices->HandleProtocol(ImageHandle, &gEfiLoadedImageProtocolGuid, (void**)&LoadedImage);
|
||||
|
||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* FileSystem;
|
||||
SystemTable->BootServices->HandleProtocol(LoadedImage->DeviceHandle, &gEfiSimpleFileSystemProtocolGuid, (void**)&FileSystem);
|
||||
|
||||
if (Directory == NULL){
|
||||
FileSystem->OpenVolume(FileSystem, &Directory);
|
||||
}
|
||||
|
||||
EFI_STATUS s = Directory->Open(Directory, &LoadedFile, Path, EFI_FILE_MODE_READ, EFI_FILE_READ_ONLY);
|
||||
if (s != EFI_SUCCESS){
|
||||
return NULL;
|
||||
}
|
||||
return LoadedFile;
|
||||
|
||||
}
|
||||
|
||||
PSF1_FONT* LoadPSF1Font(EFI_FILE* Directory, CHAR16* Path, EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTable) {
|
||||
EFI_FILE* font = LoadFile(Directory, Path, ImageHandle, SystemTable);
|
||||
if (font == NULL) return NULL;
|
||||
|
||||
// load the font's header into memory
|
||||
PSF1_HEADER* fontHeader;
|
||||
SystemTable->BootServices->AllocatePool(EfiLoaderData, sizeof(PSF1_HEADER), (void**)&fontHeader);
|
||||
UINTN size = sizeof(PSF1_HEADER);
|
||||
font->Read(font, &size, fontHeader);
|
||||
|
||||
// check if its actually even a PSF1 font.
|
||||
if (fontHeader->magic[0] != PSF1_MAGIC0 || fontHeader->magic[1] != PSF1_MAGIC1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
UINTN glyphBufferSize = fontHeader->charsize * 256;
|
||||
if (fontHeader->mode == 1) { // 512 glyph mode
|
||||
glyphBufferSize = fontHeader->charsize * 512;
|
||||
}
|
||||
|
||||
void* glyphBuffer;
|
||||
{
|
||||
font->SetPosition(font, sizeof(PSF1_HEADER));
|
||||
SystemTable->BootServices->AllocatePool(EfiLoaderData, glyphBufferSize, (void**)&glyphBuffer);
|
||||
font->Read(font, &glyphBufferSize, glyphBuffer);
|
||||
}
|
||||
|
||||
PSF1_FONT* finishedFont;
|
||||
SystemTable->BootServices->AllocatePool(EfiLoaderData, sizeof(PSF1_FONT), (void**)&finishedFont);
|
||||
finishedFont->psf1_Header = fontHeader;
|
||||
finishedFont->glyphBuffer = glyphBuffer;
|
||||
return finishedFont;
|
||||
}
|
||||
|
||||
int memcmp(const void* aptr, const void* bptr, size_t n){
|
||||
const unsigned char* a = aptr, *b = bptr;
|
||||
for (size_t i = 0; i < n; i++){
|
||||
if (a[i] < b[i]) return -1;
|
||||
else if (a[i] > b[i]) return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
EFI_STATUS efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTable) {
|
||||
|
||||
// sets up UEFI environment to be able to use
|
||||
// certain commands
|
||||
InitializeLib(ImageHandle, SystemTable);
|
||||
Print(L"=== SplenkOS V2 ===\n\n\r");
|
||||
Print(L"Searching for kernel.elf...\n\r");
|
||||
|
||||
EFI_FILE* Kernel = LoadFile(NULL, L"kernel.elf", ImageHandle, SystemTable);
|
||||
// we're pretty screwed
|
||||
if (Kernel == NULL) {
|
||||
|
||||
Print(L"FATAL ERROR: Could not load kernel! kernel.elf was not found in the root of the filesystem.\n\r");
|
||||
} else {
|
||||
Print(L"Found kernel.elf!\n\r");
|
||||
}
|
||||
|
||||
Elf64_Ehdr header;
|
||||
{
|
||||
UINTN FileInfoSize;
|
||||
EFI_FILE_INFO* FileInfo;
|
||||
Kernel->GetInfo(Kernel, &gEfiFileInfoGuid, &FileInfoSize, NULL);
|
||||
SystemTable->BootServices->AllocatePool(EfiLoaderData, FileInfoSize, (void**)&FileInfo);
|
||||
Kernel->GetInfo(Kernel, &gEfiFileInfoGuid, &FileInfoSize, (void**)&FileInfo);
|
||||
|
||||
UINTN size = sizeof(header);
|
||||
Kernel->Read(Kernel, &size, &header);
|
||||
}
|
||||
|
||||
if (
|
||||
memcmp(&header.e_ident[EI_MAG0], ELFMAG, SELFMAG) != 0 ||
|
||||
header.e_ident[EI_CLASS] != ELFCLASS64 ||
|
||||
header.e_ident[EI_DATA] != ELFDATA2LSB ||
|
||||
header.e_type != ET_EXEC ||
|
||||
header.e_machine != EM_X86_64 ||
|
||||
header.e_version != EV_CURRENT
|
||||
)
|
||||
{
|
||||
Print(L"FATAL ERROR: Kernel format is bad.\n\r");
|
||||
}
|
||||
else
|
||||
{
|
||||
Print(L"Kernel header successfully verified.\n\r");
|
||||
}
|
||||
|
||||
Elf64_Phdr* phdrs;
|
||||
{
|
||||
Kernel->SetPosition(Kernel, header.e_phoff);
|
||||
UINTN size = header.e_phnum * header.e_phentsize;
|
||||
SystemTable->BootServices->AllocatePool(EfiLoaderData, size, (void**)&phdrs);
|
||||
Kernel->Read(Kernel, &size, phdrs);
|
||||
}
|
||||
|
||||
// loop over all the headers
|
||||
for (
|
||||
Elf64_Phdr* phdr = phdrs;
|
||||
(char*)phdr < (char*)phdrs + header.e_phnum * header.e_phentsize;
|
||||
phdr = (Elf64_Phdr*)((char*)phdr + header.e_phentsize)
|
||||
)
|
||||
{
|
||||
switch (phdr->p_type) {
|
||||
case PT_LOAD:
|
||||
{
|
||||
int pages = (phdr->p_memsz * 0x1000 - 1) / 0x1000;
|
||||
Elf64_Addr segment = phdr->p_paddr;
|
||||
SystemTable->BootServices->AllocatePages(AllocateAddress, EfiLoaderData, pages, &segment);
|
||||
|
||||
Kernel->SetPosition(Kernel, phdr->p_offset);
|
||||
UINTN size = phdr->p_filesz;
|
||||
Kernel->Read(Kernel, &size, (void*)segment);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Print(L"Kernel loaded!\n\r");
|
||||
|
||||
// Run the kernel's main function! :D
|
||||
void (*KernelStart)(Framebuffer*, PSF1_FONT*) = ((__attribute__((sysv_abi)) void (*)(Framebuffer*, PSF1_FONT*) ) header.e_entry);
|
||||
|
||||
PSF1_FONT* newFont = LoadPSF1Font(NULL, L"zap-light18.psf", ImageHandle, SystemTable);
|
||||
if (newFont == NULL) {
|
||||
Print(L"Font is invalid or wasn't found.\n\r");
|
||||
} else {
|
||||
Print(L"Found font! char size = %d\n\r", newFont->psf1_Header->charsize);
|
||||
}
|
||||
|
||||
Framebuffer* newBuffer = InitializeGOP(); // setup graphics output protocol and screen
|
||||
Print(L" - Base: 0x%x\n\r - Size: 0x%x\n\r - Width: %d\n\r - Height: %d\n\r - PixelsPerScanline: %d\n\r\n\r",
|
||||
newBuffer->BaseAddress,
|
||||
newBuffer->BufferSize,
|
||||
newBuffer->Width,
|
||||
newBuffer->Height,
|
||||
newBuffer->PixelsPerScanline);
|
||||
|
||||
KernelStart(newBuffer, newFont);
|
||||
|
||||
return EFI_SUCCESS; // Exit the UEFI application
|
||||
}
|
||||
11
gnu-efi/git folder/COMMIT_EDITMSG
Normal file
11
gnu-efi/git folder/COMMIT_EDITMSG
Normal file
@@ -0,0 +1,11 @@
|
||||
load psf1 font
|
||||
# Please enter the commit message for your changes. Lines starting
|
||||
# with '#' will be ignored, and an empty message aborts the commit.
|
||||
#
|
||||
# On branch main
|
||||
# Your branch is up to date with 'origin/main'.
|
||||
#
|
||||
# Changes to be committed:
|
||||
# modified: bootloader/main.c
|
||||
# modified: x86_64/bootloader/main.efi
|
||||
#
|
||||
1
gnu-efi/git folder/FETCH_HEAD
Normal file
1
gnu-efi/git folder/FETCH_HEAD
Normal file
@@ -0,0 +1 @@
|
||||
76da8603cc06ab15c5e32773ea77ccdafc4674b7 branch 'main' of https://github.com/SpookyDervish/gnu-efi
|
||||
1
gnu-efi/git folder/HEAD
Normal file
1
gnu-efi/git folder/HEAD
Normal file
@@ -0,0 +1 @@
|
||||
ref: refs/heads/main
|
||||
1
gnu-efi/git folder/ORIG_HEAD
Normal file
1
gnu-efi/git folder/ORIG_HEAD
Normal file
@@ -0,0 +1 @@
|
||||
76da8603cc06ab15c5e32773ea77ccdafc4674b7
|
||||
15
gnu-efi/git folder/config
Normal file
15
gnu-efi/git folder/config
Normal file
@@ -0,0 +1,15 @@
|
||||
[core]
|
||||
repositoryformatversion = 0
|
||||
filemode = true
|
||||
bare = false
|
||||
logallrefupdates = true
|
||||
[remote "upstream"]
|
||||
url = https://github.com/Absurdponcho/gnu-efi
|
||||
fetch = +refs/heads/*:refs/remotes/upstream/*
|
||||
[branch "main"]
|
||||
remote = origin
|
||||
vscode-merge-base = origin/main
|
||||
merge = refs/heads/main
|
||||
[remote "origin"]
|
||||
url = https://github.com/SpookyDervish/gnu-efi.git
|
||||
fetch = +refs/heads/*:refs/remotes/origin/*
|
||||
1
gnu-efi/git folder/description
Normal file
1
gnu-efi/git folder/description
Normal file
@@ -0,0 +1 @@
|
||||
Unnamed repository; edit this file 'description' to name the repository.
|
||||
15
gnu-efi/git folder/hooks/applypatch-msg.sample
Executable file
15
gnu-efi/git folder/hooks/applypatch-msg.sample
Executable file
@@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to check the commit log message taken by
|
||||
# applypatch from an e-mail message.
|
||||
#
|
||||
# The hook should exit with non-zero status after issuing an
|
||||
# appropriate message if it wants to stop the commit. The hook is
|
||||
# allowed to edit the commit message file.
|
||||
#
|
||||
# To enable this hook, rename this file to "applypatch-msg".
|
||||
|
||||
. git-sh-setup
|
||||
commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
|
||||
test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
|
||||
:
|
||||
24
gnu-efi/git folder/hooks/commit-msg.sample
Executable file
24
gnu-efi/git folder/hooks/commit-msg.sample
Executable file
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to check the commit log message.
|
||||
# Called by "git commit" with one argument, the name of the file
|
||||
# that has the commit message. The hook should exit with non-zero
|
||||
# status after issuing an appropriate message if it wants to stop the
|
||||
# commit. The hook is allowed to edit the commit message file.
|
||||
#
|
||||
# To enable this hook, rename this file to "commit-msg".
|
||||
|
||||
# Uncomment the below to add a Signed-off-by line to the message.
|
||||
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
|
||||
# hook is more suited to it.
|
||||
#
|
||||
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
|
||||
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
|
||||
|
||||
# This example catches duplicate Signed-off-by lines.
|
||||
|
||||
test "" = "$(grep '^Signed-off-by: ' "$1" |
|
||||
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
|
||||
echo >&2 Duplicate Signed-off-by lines.
|
||||
exit 1
|
||||
}
|
||||
174
gnu-efi/git folder/hooks/fsmonitor-watchman.sample
Executable file
174
gnu-efi/git folder/hooks/fsmonitor-watchman.sample
Executable file
@@ -0,0 +1,174 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use IPC::Open2;
|
||||
|
||||
# An example hook script to integrate Watchman
|
||||
# (https://facebook.github.io/watchman/) with git to speed up detecting
|
||||
# new and modified files.
|
||||
#
|
||||
# The hook is passed a version (currently 2) and last update token
|
||||
# formatted as a string and outputs to stdout a new update token and
|
||||
# all files that have been modified since the update token. Paths must
|
||||
# be relative to the root of the working tree and separated by a single NUL.
|
||||
#
|
||||
# To enable this hook, rename this file to "query-watchman" and set
|
||||
# 'git config core.fsmonitor .git/hooks/query-watchman'
|
||||
#
|
||||
my ($version, $last_update_token) = @ARGV;
|
||||
|
||||
# Uncomment for debugging
|
||||
# print STDERR "$0 $version $last_update_token\n";
|
||||
|
||||
# Check the hook interface version
|
||||
if ($version ne 2) {
|
||||
die "Unsupported query-fsmonitor hook version '$version'.\n" .
|
||||
"Falling back to scanning...\n";
|
||||
}
|
||||
|
||||
my $git_work_tree = get_working_dir();
|
||||
|
||||
my $retry = 1;
|
||||
|
||||
my $json_pkg;
|
||||
eval {
|
||||
require JSON::XS;
|
||||
$json_pkg = "JSON::XS";
|
||||
1;
|
||||
} or do {
|
||||
require JSON::PP;
|
||||
$json_pkg = "JSON::PP";
|
||||
};
|
||||
|
||||
launch_watchman();
|
||||
|
||||
sub launch_watchman {
|
||||
my $o = watchman_query();
|
||||
if (is_work_tree_watched($o)) {
|
||||
output_result($o->{clock}, @{$o->{files}});
|
||||
}
|
||||
}
|
||||
|
||||
sub output_result {
|
||||
my ($clockid, @files) = @_;
|
||||
|
||||
# Uncomment for debugging watchman output
|
||||
# open (my $fh, ">", ".git/watchman-output.out");
|
||||
# binmode $fh, ":utf8";
|
||||
# print $fh "$clockid\n@files\n";
|
||||
# close $fh;
|
||||
|
||||
binmode STDOUT, ":utf8";
|
||||
print $clockid;
|
||||
print "\0";
|
||||
local $, = "\0";
|
||||
print @files;
|
||||
}
|
||||
|
||||
sub watchman_clock {
|
||||
my $response = qx/watchman clock "$git_work_tree"/;
|
||||
die "Failed to get clock id on '$git_work_tree'.\n" .
|
||||
"Falling back to scanning...\n" if $? != 0;
|
||||
|
||||
return $json_pkg->new->utf8->decode($response);
|
||||
}
|
||||
|
||||
sub watchman_query {
|
||||
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
|
||||
or die "open2() failed: $!\n" .
|
||||
"Falling back to scanning...\n";
|
||||
|
||||
# In the query expression below we're asking for names of files that
|
||||
# changed since $last_update_token but not from the .git folder.
|
||||
#
|
||||
# To accomplish this, we're using the "since" generator to use the
|
||||
# recency index to select candidate nodes and "fields" to limit the
|
||||
# output to file names only. Then we're using the "expression" term to
|
||||
# further constrain the results.
|
||||
my $last_update_line = "";
|
||||
if (substr($last_update_token, 0, 1) eq "c") {
|
||||
$last_update_token = "\"$last_update_token\"";
|
||||
$last_update_line = qq[\n"since": $last_update_token,];
|
||||
}
|
||||
my $query = <<" END";
|
||||
["query", "$git_work_tree", {$last_update_line
|
||||
"fields": ["name"],
|
||||
"expression": ["not", ["dirname", ".git"]]
|
||||
}]
|
||||
END
|
||||
|
||||
# Uncomment for debugging the watchman query
|
||||
# open (my $fh, ">", ".git/watchman-query.json");
|
||||
# print $fh $query;
|
||||
# close $fh;
|
||||
|
||||
print CHLD_IN $query;
|
||||
close CHLD_IN;
|
||||
my $response = do {local $/; <CHLD_OUT>};
|
||||
|
||||
# Uncomment for debugging the watch response
|
||||
# open ($fh, ">", ".git/watchman-response.json");
|
||||
# print $fh $response;
|
||||
# close $fh;
|
||||
|
||||
die "Watchman: command returned no output.\n" .
|
||||
"Falling back to scanning...\n" if $response eq "";
|
||||
die "Watchman: command returned invalid output: $response\n" .
|
||||
"Falling back to scanning...\n" unless $response =~ /^\{/;
|
||||
|
||||
return $json_pkg->new->utf8->decode($response);
|
||||
}
|
||||
|
||||
sub is_work_tree_watched {
|
||||
my ($output) = @_;
|
||||
my $error = $output->{error};
|
||||
if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
|
||||
$retry--;
|
||||
my $response = qx/watchman watch "$git_work_tree"/;
|
||||
die "Failed to make watchman watch '$git_work_tree'.\n" .
|
||||
"Falling back to scanning...\n" if $? != 0;
|
||||
$output = $json_pkg->new->utf8->decode($response);
|
||||
$error = $output->{error};
|
||||
die "Watchman: $error.\n" .
|
||||
"Falling back to scanning...\n" if $error;
|
||||
|
||||
# Uncomment for debugging watchman output
|
||||
# open (my $fh, ">", ".git/watchman-output.out");
|
||||
# close $fh;
|
||||
|
||||
# Watchman will always return all files on the first query so
|
||||
# return the fast "everything is dirty" flag to git and do the
|
||||
# Watchman query just to get it over with now so we won't pay
|
||||
# the cost in git to look up each individual file.
|
||||
my $o = watchman_clock();
|
||||
$error = $output->{error};
|
||||
|
||||
die "Watchman: $error.\n" .
|
||||
"Falling back to scanning...\n" if $error;
|
||||
|
||||
output_result($o->{clock}, ("/"));
|
||||
$last_update_token = $o->{clock};
|
||||
|
||||
eval { launch_watchman() };
|
||||
return 0;
|
||||
}
|
||||
|
||||
die "Watchman: $error.\n" .
|
||||
"Falling back to scanning...\n" if $error;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub get_working_dir {
|
||||
my $working_dir;
|
||||
if ($^O =~ 'msys' || $^O =~ 'cygwin') {
|
||||
$working_dir = Win32::GetCwd();
|
||||
$working_dir =~ tr/\\/\//;
|
||||
} else {
|
||||
require Cwd;
|
||||
$working_dir = Cwd::cwd();
|
||||
}
|
||||
|
||||
return $working_dir;
|
||||
}
|
||||
8
gnu-efi/git folder/hooks/post-update.sample
Executable file
8
gnu-efi/git folder/hooks/post-update.sample
Executable file
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to prepare a packed repository for use over
|
||||
# dumb transports.
|
||||
#
|
||||
# To enable this hook, rename this file to "post-update".
|
||||
|
||||
exec git update-server-info
|
||||
14
gnu-efi/git folder/hooks/pre-applypatch.sample
Executable file
14
gnu-efi/git folder/hooks/pre-applypatch.sample
Executable file
@@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to verify what is about to be committed
|
||||
# by applypatch from an e-mail message.
|
||||
#
|
||||
# The hook should exit with non-zero status after issuing an
|
||||
# appropriate message if it wants to stop the commit.
|
||||
#
|
||||
# To enable this hook, rename this file to "pre-applypatch".
|
||||
|
||||
. git-sh-setup
|
||||
precommit="$(git rev-parse --git-path hooks/pre-commit)"
|
||||
test -x "$precommit" && exec "$precommit" ${1+"$@"}
|
||||
:
|
||||
49
gnu-efi/git folder/hooks/pre-commit.sample
Executable file
49
gnu-efi/git folder/hooks/pre-commit.sample
Executable file
@@ -0,0 +1,49 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to verify what is about to be committed.
|
||||
# Called by "git commit" with no arguments. The hook should
|
||||
# exit with non-zero status after issuing an appropriate message if
|
||||
# it wants to stop the commit.
|
||||
#
|
||||
# To enable this hook, rename this file to "pre-commit".
|
||||
|
||||
if git rev-parse --verify HEAD >/dev/null 2>&1
|
||||
then
|
||||
against=HEAD
|
||||
else
|
||||
# Initial commit: diff against an empty tree object
|
||||
against=$(git hash-object -t tree /dev/null)
|
||||
fi
|
||||
|
||||
# If you want to allow non-ASCII filenames set this variable to true.
|
||||
allownonascii=$(git config --type=bool hooks.allownonascii)
|
||||
|
||||
# Redirect output to stderr.
|
||||
exec 1>&2
|
||||
|
||||
# Cross platform projects tend to avoid non-ASCII filenames; prevent
|
||||
# them from being added to the repository. We exploit the fact that the
|
||||
# printable range starts at the space character and ends with tilde.
|
||||
if [ "$allownonascii" != "true" ] &&
|
||||
# Note that the use of brackets around a tr range is ok here, (it's
|
||||
# even required, for portability to Solaris 10's /usr/bin/tr), since
|
||||
# the square bracket bytes happen to fall in the designated range.
|
||||
test $(git diff-index --cached --name-only --diff-filter=A -z $against |
|
||||
LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
|
||||
then
|
||||
cat <<\EOF
|
||||
Error: Attempt to add a non-ASCII file name.
|
||||
|
||||
This can cause problems if you want to work with people on other platforms.
|
||||
|
||||
To be portable it is advisable to rename the file.
|
||||
|
||||
If you know what you are doing you can disable this check using:
|
||||
|
||||
git config hooks.allownonascii true
|
||||
EOF
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# If there are whitespace errors, print the offending file names and fail.
|
||||
exec git diff-index --check --cached $against --
|
||||
13
gnu-efi/git folder/hooks/pre-merge-commit.sample
Executable file
13
gnu-efi/git folder/hooks/pre-merge-commit.sample
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to verify what is about to be committed.
|
||||
# Called by "git merge" with no arguments. The hook should
|
||||
# exit with non-zero status after issuing an appropriate message to
|
||||
# stderr if it wants to stop the merge commit.
|
||||
#
|
||||
# To enable this hook, rename this file to "pre-merge-commit".
|
||||
|
||||
. git-sh-setup
|
||||
test -x "$GIT_DIR/hooks/pre-commit" &&
|
||||
exec "$GIT_DIR/hooks/pre-commit"
|
||||
:
|
||||
53
gnu-efi/git folder/hooks/pre-push.sample
Executable file
53
gnu-efi/git folder/hooks/pre-push.sample
Executable file
@@ -0,0 +1,53 @@
|
||||
#!/bin/sh
|
||||
|
||||
# An example hook script to verify what is about to be pushed. Called by "git
|
||||
# push" after it has checked the remote status, but before anything has been
|
||||
# pushed. If this script exits with a non-zero status nothing will be pushed.
|
||||
#
|
||||
# This hook is called with the following parameters:
|
||||
#
|
||||
# $1 -- Name of the remote to which the push is being done
|
||||
# $2 -- URL to which the push is being done
|
||||
#
|
||||
# If pushing without using a named remote those arguments will be equal.
|
||||
#
|
||||
# Information about the commits which are being pushed is supplied as lines to
|
||||
# the standard input in the form:
|
||||
#
|
||||
# <local ref> <local oid> <remote ref> <remote oid>
|
||||
#
|
||||
# This sample shows how to prevent push of commits where the log message starts
|
||||
# with "WIP" (work in progress).
|
||||
|
||||
remote="$1"
|
||||
url="$2"
|
||||
|
||||
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
|
||||
|
||||
while read local_ref local_oid remote_ref remote_oid
|
||||
do
|
||||
if test "$local_oid" = "$zero"
|
||||
then
|
||||
# Handle delete
|
||||
:
|
||||
else
|
||||
if test "$remote_oid" = "$zero"
|
||||
then
|
||||
# New branch, examine all commits
|
||||
range="$local_oid"
|
||||
else
|
||||
# Update to existing branch, examine new commits
|
||||
range="$remote_oid..$local_oid"
|
||||
fi
|
||||
|
||||
# Check for WIP commit
|
||||
commit=$(git rev-list -n 1 --grep '^WIP' "$range")
|
||||
if test -n "$commit"
|
||||
then
|
||||
echo >&2 "Found WIP commit in $local_ref, not pushing"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0
|
||||
169
gnu-efi/git folder/hooks/pre-rebase.sample
Executable file
169
gnu-efi/git folder/hooks/pre-rebase.sample
Executable file
@@ -0,0 +1,169 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2006, 2008 Junio C Hamano
|
||||
#
|
||||
# The "pre-rebase" hook is run just before "git rebase" starts doing
|
||||
# its job, and can prevent the command from running by exiting with
|
||||
# non-zero status.
|
||||
#
|
||||
# The hook is called with the following parameters:
|
||||
#
|
||||
# $1 -- the upstream the series was forked from.
|
||||
# $2 -- the branch being rebased (or empty when rebasing the current branch).
|
||||
#
|
||||
# This sample shows how to prevent topic branches that are already
|
||||
# merged to 'next' branch from getting rebased, because allowing it
|
||||
# would result in rebasing already published history.
|
||||
|
||||
publish=next
|
||||
basebranch="$1"
|
||||
if test "$#" = 2
|
||||
then
|
||||
topic="refs/heads/$2"
|
||||
else
|
||||
topic=`git symbolic-ref HEAD` ||
|
||||
exit 0 ;# we do not interrupt rebasing detached HEAD
|
||||
fi
|
||||
|
||||
case "$topic" in
|
||||
refs/heads/??/*)
|
||||
;;
|
||||
*)
|
||||
exit 0 ;# we do not interrupt others.
|
||||
;;
|
||||
esac
|
||||
|
||||
# Now we are dealing with a topic branch being rebased
|
||||
# on top of master. Is it OK to rebase it?
|
||||
|
||||
# Does the topic really exist?
|
||||
git show-ref -q "$topic" || {
|
||||
echo >&2 "No such branch $topic"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Is topic fully merged to master?
|
||||
not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
|
||||
if test -z "$not_in_master"
|
||||
then
|
||||
echo >&2 "$topic is fully merged to master; better remove it."
|
||||
exit 1 ;# we could allow it, but there is no point.
|
||||
fi
|
||||
|
||||
# Is topic ever merged to next? If so you should not be rebasing it.
|
||||
only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
|
||||
only_next_2=`git rev-list ^master ${publish} | sort`
|
||||
if test "$only_next_1" = "$only_next_2"
|
||||
then
|
||||
not_in_topic=`git rev-list "^$topic" master`
|
||||
if test -z "$not_in_topic"
|
||||
then
|
||||
echo >&2 "$topic is already up to date with master"
|
||||
exit 1 ;# we could allow it, but there is no point.
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
|
||||
/usr/bin/perl -e '
|
||||
my $topic = $ARGV[0];
|
||||
my $msg = "* $topic has commits already merged to public branch:\n";
|
||||
my (%not_in_next) = map {
|
||||
/^([0-9a-f]+) /;
|
||||
($1 => 1);
|
||||
} split(/\n/, $ARGV[1]);
|
||||
for my $elem (map {
|
||||
/^([0-9a-f]+) (.*)$/;
|
||||
[$1 => $2];
|
||||
} split(/\n/, $ARGV[2])) {
|
||||
if (!exists $not_in_next{$elem->[0]}) {
|
||||
if ($msg) {
|
||||
print STDERR $msg;
|
||||
undef $msg;
|
||||
}
|
||||
print STDERR " $elem->[1]\n";
|
||||
}
|
||||
}
|
||||
' "$topic" "$not_in_next" "$not_in_master"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
<<\DOC_END
|
||||
|
||||
This sample hook safeguards topic branches that have been
|
||||
published from being rewound.
|
||||
|
||||
The workflow assumed here is:
|
||||
|
||||
* Once a topic branch forks from "master", "master" is never
|
||||
merged into it again (either directly or indirectly).
|
||||
|
||||
* Once a topic branch is fully cooked and merged into "master",
|
||||
it is deleted. If you need to build on top of it to correct
|
||||
earlier mistakes, a new topic branch is created by forking at
|
||||
the tip of the "master". This is not strictly necessary, but
|
||||
it makes it easier to keep your history simple.
|
||||
|
||||
* Whenever you need to test or publish your changes to topic
|
||||
branches, merge them into "next" branch.
|
||||
|
||||
The script, being an example, hardcodes the publish branch name
|
||||
to be "next", but it is trivial to make it configurable via
|
||||
$GIT_DIR/config mechanism.
|
||||
|
||||
With this workflow, you would want to know:
|
||||
|
||||
(1) ... if a topic branch has ever been merged to "next". Young
|
||||
topic branches can have stupid mistakes you would rather
|
||||
clean up before publishing, and things that have not been
|
||||
merged into other branches can be easily rebased without
|
||||
affecting other people. But once it is published, you would
|
||||
not want to rewind it.
|
||||
|
||||
(2) ... if a topic branch has been fully merged to "master".
|
||||
Then you can delete it. More importantly, you should not
|
||||
build on top of it -- other people may already want to
|
||||
change things related to the topic as patches against your
|
||||
"master", so if you need further changes, it is better to
|
||||
fork the topic (perhaps with the same name) afresh from the
|
||||
tip of "master".
|
||||
|
||||
Let's look at this example:
|
||||
|
||||
o---o---o---o---o---o---o---o---o---o "next"
|
||||
/ / / /
|
||||
/ a---a---b A / /
|
||||
/ / / /
|
||||
/ / c---c---c---c B /
|
||||
/ / / \ /
|
||||
/ / / b---b C \ /
|
||||
/ / / / \ /
|
||||
---o---o---o---o---o---o---o---o---o---o---o "master"
|
||||
|
||||
|
||||
A, B and C are topic branches.
|
||||
|
||||
* A has one fix since it was merged up to "next".
|
||||
|
||||
* B has finished. It has been fully merged up to "master" and "next",
|
||||
and is ready to be deleted.
|
||||
|
||||
* C has not merged to "next" at all.
|
||||
|
||||
We would want to allow C to be rebased, refuse A, and encourage
|
||||
B to be deleted.
|
||||
|
||||
To compute (1):
|
||||
|
||||
git rev-list ^master ^topic next
|
||||
git rev-list ^master next
|
||||
|
||||
if these match, topic has not merged in next at all.
|
||||
|
||||
To compute (2):
|
||||
|
||||
git rev-list master..topic
|
||||
|
||||
if this is empty, it is fully merged to "master".
|
||||
|
||||
DOC_END
|
||||
24
gnu-efi/git folder/hooks/pre-receive.sample
Executable file
24
gnu-efi/git folder/hooks/pre-receive.sample
Executable file
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to make use of push options.
|
||||
# The example simply echoes all push options that start with 'echoback='
|
||||
# and rejects all pushes when the "reject" push option is used.
|
||||
#
|
||||
# To enable this hook, rename this file to "pre-receive".
|
||||
|
||||
if test -n "$GIT_PUSH_OPTION_COUNT"
|
||||
then
|
||||
i=0
|
||||
while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
|
||||
do
|
||||
eval "value=\$GIT_PUSH_OPTION_$i"
|
||||
case "$value" in
|
||||
echoback=*)
|
||||
echo "echo from the pre-receive-hook: ${value#*=}" >&2
|
||||
;;
|
||||
reject)
|
||||
exit 1
|
||||
esac
|
||||
i=$((i + 1))
|
||||
done
|
||||
fi
|
||||
42
gnu-efi/git folder/hooks/prepare-commit-msg.sample
Executable file
42
gnu-efi/git folder/hooks/prepare-commit-msg.sample
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to prepare the commit log message.
|
||||
# Called by "git commit" with the name of the file that has the
|
||||
# commit message, followed by the description of the commit
|
||||
# message's source. The hook's purpose is to edit the commit
|
||||
# message file. If the hook fails with a non-zero status,
|
||||
# the commit is aborted.
|
||||
#
|
||||
# To enable this hook, rename this file to "prepare-commit-msg".
|
||||
|
||||
# This hook includes three examples. The first one removes the
|
||||
# "# Please enter the commit message..." help message.
|
||||
#
|
||||
# The second includes the output of "git diff --name-status -r"
|
||||
# into the message, just before the "git status" output. It is
|
||||
# commented because it doesn't cope with --amend or with squashed
|
||||
# commits.
|
||||
#
|
||||
# The third example adds a Signed-off-by line to the message, that can
|
||||
# still be edited. This is rarely a good idea.
|
||||
|
||||
COMMIT_MSG_FILE=$1
|
||||
COMMIT_SOURCE=$2
|
||||
SHA1=$3
|
||||
|
||||
/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
|
||||
|
||||
# case "$COMMIT_SOURCE,$SHA1" in
|
||||
# ,|template,)
|
||||
# /usr/bin/perl -i.bak -pe '
|
||||
# print "\n" . `git diff --cached --name-status -r`
|
||||
# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
|
||||
# *) ;;
|
||||
# esac
|
||||
|
||||
# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
|
||||
# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE"
|
||||
# if test -z "$COMMIT_SOURCE"
|
||||
# then
|
||||
# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
|
||||
# fi
|
||||
78
gnu-efi/git folder/hooks/push-to-checkout.sample
Executable file
78
gnu-efi/git folder/hooks/push-to-checkout.sample
Executable file
@@ -0,0 +1,78 @@
|
||||
#!/bin/sh
|
||||
|
||||
# An example hook script to update a checked-out tree on a git push.
|
||||
#
|
||||
# This hook is invoked by git-receive-pack(1) when it reacts to git
|
||||
# push and updates reference(s) in its repository, and when the push
|
||||
# tries to update the branch that is currently checked out and the
|
||||
# receive.denyCurrentBranch configuration variable is set to
|
||||
# updateInstead.
|
||||
#
|
||||
# By default, such a push is refused if the working tree and the index
|
||||
# of the remote repository has any difference from the currently
|
||||
# checked out commit; when both the working tree and the index match
|
||||
# the current commit, they are updated to match the newly pushed tip
|
||||
# of the branch. This hook is to be used to override the default
|
||||
# behaviour; however the code below reimplements the default behaviour
|
||||
# as a starting point for convenient modification.
|
||||
#
|
||||
# The hook receives the commit with which the tip of the current
|
||||
# branch is going to be updated:
|
||||
commit=$1
|
||||
|
||||
# It can exit with a non-zero status to refuse the push (when it does
|
||||
# so, it must not modify the index or the working tree).
|
||||
die () {
|
||||
echo >&2 "$*"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Or it can make any necessary changes to the working tree and to the
|
||||
# index to bring them to the desired state when the tip of the current
|
||||
# branch is updated to the new commit, and exit with a zero status.
|
||||
#
|
||||
# For example, the hook can simply run git read-tree -u -m HEAD "$1"
|
||||
# in order to emulate git fetch that is run in the reverse direction
|
||||
# with git push, as the two-tree form of git read-tree -u -m is
|
||||
# essentially the same as git switch or git checkout that switches
|
||||
# branches while keeping the local changes in the working tree that do
|
||||
# not interfere with the difference between the branches.
|
||||
|
||||
# The below is a more-or-less exact translation to shell of the C code
|
||||
# for the default behaviour for git's push-to-checkout hook defined in
|
||||
# the push_to_deploy() function in builtin/receive-pack.c.
|
||||
#
|
||||
# Note that the hook will be executed from the repository directory,
|
||||
# not from the working tree, so if you want to perform operations on
|
||||
# the working tree, you will have to adapt your code accordingly, e.g.
|
||||
# by adding "cd .." or using relative paths.
|
||||
|
||||
if ! git update-index -q --ignore-submodules --refresh
|
||||
then
|
||||
die "Up-to-date check failed"
|
||||
fi
|
||||
|
||||
if ! git diff-files --quiet --ignore-submodules --
|
||||
then
|
||||
die "Working directory has unstaged changes"
|
||||
fi
|
||||
|
||||
# This is a rough translation of:
|
||||
#
|
||||
# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX
|
||||
if git cat-file -e HEAD 2>/dev/null
|
||||
then
|
||||
head=HEAD
|
||||
else
|
||||
head=$(git hash-object -t tree --stdin </dev/null)
|
||||
fi
|
||||
|
||||
if ! git diff-index --quiet --cached --ignore-submodules $head --
|
||||
then
|
||||
die "Working directory has staged changes"
|
||||
fi
|
||||
|
||||
if ! git read-tree -u -m "$commit"
|
||||
then
|
||||
die "Could not update working tree to new HEAD"
|
||||
fi
|
||||
77
gnu-efi/git folder/hooks/sendemail-validate.sample
Executable file
77
gnu-efi/git folder/hooks/sendemail-validate.sample
Executable file
@@ -0,0 +1,77 @@
|
||||
#!/bin/sh
|
||||
|
||||
# An example hook script to validate a patch (and/or patch series) before
|
||||
# sending it via email.
|
||||
#
|
||||
# The hook should exit with non-zero status after issuing an appropriate
|
||||
# message if it wants to prevent the email(s) from being sent.
|
||||
#
|
||||
# To enable this hook, rename this file to "sendemail-validate".
|
||||
#
|
||||
# By default, it will only check that the patch(es) can be applied on top of
|
||||
# the default upstream branch without conflicts in a secondary worktree. After
|
||||
# validation (successful or not) of the last patch of a series, the worktree
|
||||
# will be deleted.
|
||||
#
|
||||
# The following config variables can be set to change the default remote and
|
||||
# remote ref that are used to apply the patches against:
|
||||
#
|
||||
# sendemail.validateRemote (default: origin)
|
||||
# sendemail.validateRemoteRef (default: HEAD)
|
||||
#
|
||||
# Replace the TODO placeholders with appropriate checks according to your
|
||||
# needs.
|
||||
|
||||
validate_cover_letter () {
|
||||
file="$1"
|
||||
# TODO: Replace with appropriate checks (e.g. spell checking).
|
||||
true
|
||||
}
|
||||
|
||||
validate_patch () {
|
||||
file="$1"
|
||||
# Ensure that the patch applies without conflicts.
|
||||
git am -3 "$file" || return
|
||||
# TODO: Replace with appropriate checks for this patch
|
||||
# (e.g. checkpatch.pl).
|
||||
true
|
||||
}
|
||||
|
||||
validate_series () {
|
||||
# TODO: Replace with appropriate checks for the whole series
|
||||
# (e.g. quick build, coding style checks, etc.).
|
||||
true
|
||||
}
|
||||
|
||||
# main -------------------------------------------------------------------------
|
||||
|
||||
if test "$GIT_SENDEMAIL_FILE_COUNTER" = 1
|
||||
then
|
||||
remote=$(git config --default origin --get sendemail.validateRemote) &&
|
||||
ref=$(git config --default HEAD --get sendemail.validateRemoteRef) &&
|
||||
worktree=$(mktemp --tmpdir -d sendemail-validate.XXXXXXX) &&
|
||||
git worktree add -fd --checkout "$worktree" "refs/remotes/$remote/$ref" &&
|
||||
git config --replace-all sendemail.validateWorktree "$worktree"
|
||||
else
|
||||
worktree=$(git config --get sendemail.validateWorktree)
|
||||
fi || {
|
||||
echo "sendemail-validate: error: failed to prepare worktree" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
unset GIT_DIR GIT_WORK_TREE
|
||||
cd "$worktree" &&
|
||||
|
||||
if grep -q "^diff --git " "$1"
|
||||
then
|
||||
validate_patch "$1"
|
||||
else
|
||||
validate_cover_letter "$1"
|
||||
fi &&
|
||||
|
||||
if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL"
|
||||
then
|
||||
git config --unset-all sendemail.validateWorktree &&
|
||||
trap 'git worktree remove -ff "$worktree"' EXIT &&
|
||||
validate_series
|
||||
fi
|
||||
128
gnu-efi/git folder/hooks/update.sample
Executable file
128
gnu-efi/git folder/hooks/update.sample
Executable file
@@ -0,0 +1,128 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# An example hook script to block unannotated tags from entering.
|
||||
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
|
||||
#
|
||||
# To enable this hook, rename this file to "update".
|
||||
#
|
||||
# Config
|
||||
# ------
|
||||
# hooks.allowunannotated
|
||||
# This boolean sets whether unannotated tags will be allowed into the
|
||||
# repository. By default they won't be.
|
||||
# hooks.allowdeletetag
|
||||
# This boolean sets whether deleting tags will be allowed in the
|
||||
# repository. By default they won't be.
|
||||
# hooks.allowmodifytag
|
||||
# This boolean sets whether a tag may be modified after creation. By default
|
||||
# it won't be.
|
||||
# hooks.allowdeletebranch
|
||||
# This boolean sets whether deleting branches will be allowed in the
|
||||
# repository. By default they won't be.
|
||||
# hooks.denycreatebranch
|
||||
# This boolean sets whether remotely creating branches will be denied
|
||||
# in the repository. By default this is allowed.
|
||||
#
|
||||
|
||||
# --- Command line
|
||||
refname="$1"
|
||||
oldrev="$2"
|
||||
newrev="$3"
|
||||
|
||||
# --- Safety check
|
||||
if [ -z "$GIT_DIR" ]; then
|
||||
echo "Don't run this script from the command line." >&2
|
||||
echo " (if you want, you could supply GIT_DIR then run" >&2
|
||||
echo " $0 <ref> <oldrev> <newrev>)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
|
||||
echo "usage: $0 <ref> <oldrev> <newrev>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Config
|
||||
allowunannotated=$(git config --type=bool hooks.allowunannotated)
|
||||
allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch)
|
||||
denycreatebranch=$(git config --type=bool hooks.denycreatebranch)
|
||||
allowdeletetag=$(git config --type=bool hooks.allowdeletetag)
|
||||
allowmodifytag=$(git config --type=bool hooks.allowmodifytag)
|
||||
|
||||
# check for no description
|
||||
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
|
||||
case "$projectdesc" in
|
||||
"Unnamed repository"* | "")
|
||||
echo "*** Project description file hasn't been set" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# --- Check types
|
||||
# if $newrev is 0000...0000, it's a commit to delete a ref.
|
||||
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
|
||||
if [ "$newrev" = "$zero" ]; then
|
||||
newrev_type=delete
|
||||
else
|
||||
newrev_type=$(git cat-file -t $newrev)
|
||||
fi
|
||||
|
||||
case "$refname","$newrev_type" in
|
||||
refs/tags/*,commit)
|
||||
# un-annotated tag
|
||||
short_refname=${refname##refs/tags/}
|
||||
if [ "$allowunannotated" != "true" ]; then
|
||||
echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
|
||||
echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
refs/tags/*,delete)
|
||||
# delete tag
|
||||
if [ "$allowdeletetag" != "true" ]; then
|
||||
echo "*** Deleting a tag is not allowed in this repository" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
refs/tags/*,tag)
|
||||
# annotated tag
|
||||
if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
|
||||
then
|
||||
echo "*** Tag '$refname' already exists." >&2
|
||||
echo "*** Modifying a tag is not allowed in this repository." >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
refs/heads/*,commit)
|
||||
# branch
|
||||
if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
|
||||
echo "*** Creating a branch is not allowed in this repository" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
refs/heads/*,delete)
|
||||
# delete branch
|
||||
if [ "$allowdeletebranch" != "true" ]; then
|
||||
echo "*** Deleting a branch is not allowed in this repository" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
refs/remotes/*,commit)
|
||||
# tracking branch
|
||||
;;
|
||||
refs/remotes/*,delete)
|
||||
# delete tracking branch
|
||||
if [ "$allowdeletebranch" != "true" ]; then
|
||||
echo "*** Deleting a tracking branch is not allowed in this repository" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
# Anything else (is there anything else?)
|
||||
echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# --- Finished
|
||||
exit 0
|
||||
BIN
gnu-efi/git folder/index
Normal file
BIN
gnu-efi/git folder/index
Normal file
Binary file not shown.
6
gnu-efi/git folder/info/exclude
Normal file
6
gnu-efi/git folder/info/exclude
Normal file
@@ -0,0 +1,6 @@
|
||||
# git ls-files --others --exclude-from=.git/info/exclude
|
||||
# Lines that start with '#' are comments.
|
||||
# For a project mostly in C, the following would be a good set of
|
||||
# exclude patterns (uncomment them if you want to use them):
|
||||
# *.[oa]
|
||||
# *~
|
||||
8
gnu-efi/git folder/logs/HEAD
Normal file
8
gnu-efi/git folder/logs/HEAD
Normal file
@@ -0,0 +1,8 @@
|
||||
0000000000000000000000000000000000000000 cd81680b0137b18bdb82d547a34feb7bf2cb6837 SpookyDervish <nchand05@outlook.com> 1769496422 +1100 clone: from https://github.com/Absurdponcho/gnu-efi
|
||||
cd81680b0137b18bdb82d547a34feb7bf2cb6837 71be5b9347fb34e8ab0030a0344005d5c9bc55d7 SpookyDervish <nchand05@outlook.com> 1769498252 +1100 commit: build
|
||||
71be5b9347fb34e8ab0030a0344005d5c9bc55d7 07a56403494bfe4b3c7d3813d7c191b1135b71ca SpookyDervish <nchand05@outlook.com> 1769502848 +1100 commit: check kernel efi header
|
||||
07a56403494bfe4b3c7d3813d7c191b1135b71ca 0e72223057bd8970c8d642cbbfaa055aacdd5464 SpookyDervish <nchand05@outlook.com> 1769503655 +1100 commit: load kernel with bootloader
|
||||
0e72223057bd8970c8d642cbbfaa055aacdd5464 d19573fdb9dc263ffee7e9323845b78b7535dbe1 SpookyDervish <nchand05@outlook.com> 1769505269 +1100 commit: initialize GOP
|
||||
d19573fdb9dc263ffee7e9323845b78b7535dbe1 972d2c8bc3086b65f45bcff9684fbda6ab73cd47 SpookyDervish <nchand05@outlook.com> 1769506611 +1100 commit: get gop framebuffer data
|
||||
972d2c8bc3086b65f45bcff9684fbda6ab73cd47 0ecf403f47dc5b61e1c5a7b9f1e3cbd710082bff SpookyDervish <nchand05@outlook.com> 1769508256 +1100 commit: pass framebuffer to kernel
|
||||
0ecf403f47dc5b61e1c5a7b9f1e3cbd710082bff 76da8603cc06ab15c5e32773ea77ccdafc4674b7 SpookyDervish <nchand05@outlook.com> 1769509888 +1100 commit: load psf1 font
|
||||
8
gnu-efi/git folder/logs/refs/heads/main
Normal file
8
gnu-efi/git folder/logs/refs/heads/main
Normal file
@@ -0,0 +1,8 @@
|
||||
0000000000000000000000000000000000000000 cd81680b0137b18bdb82d547a34feb7bf2cb6837 SpookyDervish <nchand05@outlook.com> 1769496422 +1100 clone: from https://github.com/Absurdponcho/gnu-efi
|
||||
cd81680b0137b18bdb82d547a34feb7bf2cb6837 71be5b9347fb34e8ab0030a0344005d5c9bc55d7 SpookyDervish <nchand05@outlook.com> 1769498252 +1100 commit: build
|
||||
71be5b9347fb34e8ab0030a0344005d5c9bc55d7 07a56403494bfe4b3c7d3813d7c191b1135b71ca SpookyDervish <nchand05@outlook.com> 1769502848 +1100 commit: check kernel efi header
|
||||
07a56403494bfe4b3c7d3813d7c191b1135b71ca 0e72223057bd8970c8d642cbbfaa055aacdd5464 SpookyDervish <nchand05@outlook.com> 1769503655 +1100 commit: load kernel with bootloader
|
||||
0e72223057bd8970c8d642cbbfaa055aacdd5464 d19573fdb9dc263ffee7e9323845b78b7535dbe1 SpookyDervish <nchand05@outlook.com> 1769505269 +1100 commit: initialize GOP
|
||||
d19573fdb9dc263ffee7e9323845b78b7535dbe1 972d2c8bc3086b65f45bcff9684fbda6ab73cd47 SpookyDervish <nchand05@outlook.com> 1769506611 +1100 commit: get gop framebuffer data
|
||||
972d2c8bc3086b65f45bcff9684fbda6ab73cd47 0ecf403f47dc5b61e1c5a7b9f1e3cbd710082bff SpookyDervish <nchand05@outlook.com> 1769508256 +1100 commit: pass framebuffer to kernel
|
||||
0ecf403f47dc5b61e1c5a7b9f1e3cbd710082bff 76da8603cc06ab15c5e32773ea77ccdafc4674b7 SpookyDervish <nchand05@outlook.com> 1769509888 +1100 commit: load psf1 font
|
||||
1
gnu-efi/git folder/logs/refs/remotes/origin/HEAD
Normal file
1
gnu-efi/git folder/logs/refs/remotes/origin/HEAD
Normal file
@@ -0,0 +1 @@
|
||||
0000000000000000000000000000000000000000 07a56403494bfe4b3c7d3813d7c191b1135b71ca SpookyDervish <nchand05@outlook.com> 1769502937 +1100 fetch
|
||||
7
gnu-efi/git folder/logs/refs/remotes/origin/main
Normal file
7
gnu-efi/git folder/logs/refs/remotes/origin/main
Normal file
@@ -0,0 +1,7 @@
|
||||
0000000000000000000000000000000000000000 cd81680b0137b18bdb82d547a34feb7bf2cb6837 SpookyDervish <nchand05@outlook.com> 1769502860 +1100 fetch origin main: storing head
|
||||
cd81680b0137b18bdb82d547a34feb7bf2cb6837 07a56403494bfe4b3c7d3813d7c191b1135b71ca SpookyDervish <nchand05@outlook.com> 1769502862 +1100 update by push
|
||||
07a56403494bfe4b3c7d3813d7c191b1135b71ca 0e72223057bd8970c8d642cbbfaa055aacdd5464 SpookyDervish <nchand05@outlook.com> 1769503670 +1100 update by push
|
||||
0e72223057bd8970c8d642cbbfaa055aacdd5464 d19573fdb9dc263ffee7e9323845b78b7535dbe1 SpookyDervish <nchand05@outlook.com> 1769505277 +1100 update by push
|
||||
d19573fdb9dc263ffee7e9323845b78b7535dbe1 972d2c8bc3086b65f45bcff9684fbda6ab73cd47 SpookyDervish <nchand05@outlook.com> 1769506620 +1100 update by push
|
||||
972d2c8bc3086b65f45bcff9684fbda6ab73cd47 0ecf403f47dc5b61e1c5a7b9f1e3cbd710082bff SpookyDervish <nchand05@outlook.com> 1769508283 +1100 update by push
|
||||
0ecf403f47dc5b61e1c5a7b9f1e3cbd710082bff 76da8603cc06ab15c5e32773ea77ccdafc4674b7 SpookyDervish <nchand05@outlook.com> 1769509906 +1100 update by push
|
||||
2
gnu-efi/git folder/logs/refs/remotes/upstream/HEAD
Normal file
2
gnu-efi/git folder/logs/refs/remotes/upstream/HEAD
Normal file
@@ -0,0 +1,2 @@
|
||||
0000000000000000000000000000000000000000 cd81680b0137b18bdb82d547a34feb7bf2cb6837 SpookyDervish <nchand05@outlook.com> 1769496422 +1100 clone: from https://github.com/Absurdponcho/gnu-efi
|
||||
0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 Nathaniel <Nathaniel@splenkos.(none)> 1769502859 +1100 remote: renamed refs/remotes/origin/HEAD to refs/remotes/upstream/HEAD
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,2 @@
|
||||
x+)JMU050c040031QpÎHÌKOõÉOgØÌ½(ˆÏÝë1·S <53>y³F9K@F9T‘obvª^JjZbiNI1CØÔMk¤¶k´=êß]û>‘o=ßad…E¥9©Å=;¹˜'µ9þ<üð›ÚSî–eÓ¼r‘T¥eæ¤2ÜÖmæX¦ñP¦ÜZW_ËIæÊ™®AP5A®Ž.¾®z©i™9™I»[ëNØ
|
||||
>¬ú^ÅÿçÊïô†ß³òüÐædæä3L[!®8½pù·Éê{³Ú̸ÚF†U]zf ÃqÉM—ïÄ.<ºá–ç¥7ç¶DJ>ES•Wšš–ɨ6ãP·çû®Û®+‰î©ø“~k½‰<C2BD><E280B0><EFBFBD><EFBFBD>BbAA1Ãöñ®¯÷þ¹T‹_õ˜ÎSþánD:)?¿$'?1%µˆaWö¶²éÓö¼?ùÿý‘K¥¼‹‚B¥C,I?ºQôè¶_J¶ør›•´ÇYóDAf^2ƒ÷ªoÇè„»IÉL}ÿMǺÒé¸D.%!ìKíÞ_b‘™!˜xÓK·I/Ü"[aaofÂàP[gÂ/ÀÕ÷:î<>„FÔÉ–·<E28093>ç£Çu
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
x+)JMU050c040031QpÎHÌKOõÉOgØÌ½(ˆÏÝë1·S <53>y³F9K@F9T‘obvª^JjZbiNI1CØÔMk¤¶k´=êß]û>‘o=ßad…E¥9©Å=;¹˜'µ9þ<üð›ÚSî–eÓ¼r‘T¥eæ¤2ÜÖmæX¦ñP¦ÜZW_ËIæÊ™®AP5A®Ž.¾®z©i™9™I»[ëNØ
|
||||
>¬ú^ÅÿçÊïô†ß³òüÐædæä3L[!®8½pù·Éê{³Ú̸ÚF†U]zf ÃqÉM—ïÄ.<ºá–ç¥7ç¶DJ>ES•Wšš–ɨ6ãP·çû®Û®+‰î©ø“~k½‰<C2BD><E280B0><EFBFBD><EFBFBD>BbAA1Ãöñ®¯÷þ¹T‹_õ˜ÎSþánD:)?¿$'?1%µˆ!5?îì›S5\çs‰f:¾=”·ß¢(bIúÑ<C3BA>¢G·Ý0øR²Å—kݬ¤=Κ—
|
||||
2ó’¼W};fp@'ÜMJfêûo:Ö•NÇ% ² p) aÏXj÷þ‹ÌÁÄ›^ºMzá&Ù
|
||||
³x3†ËéÆl.ßrŸ½Ê2_@âÞÓ‰1‹úL¹Æ|
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user