From 777a4cada6518d12f701c905284e2978a2653f67 Mon Sep 17 00:00:00 2001 From: srs5694 Date: Sat, 6 Dec 2014 18:33:58 -0500 Subject: [PATCH] Support for iPXE, including build stub directory and icons. --- icons/os_network.png | Bin 0 -> 19647 bytes icons/tool_netboot.png | Bin 0 -> 1930 bytes icons/vol_net.png | Bin 0 -> 2280 bytes net/Makefile | 24 + net/discovery/Makefile.housekeeping | 1461 ++++++++++++++++++++++++++ net/discovery/console.h | 1 + net/discovery/efi_discovery_prefix.c | 177 ++++ 7 files changed, 1663 insertions(+) create mode 100644 icons/os_network.png create mode 100644 icons/tool_netboot.png create mode 100644 icons/vol_net.png create mode 100644 net/Makefile create mode 100644 net/discovery/Makefile.housekeeping create mode 100644 net/discovery/console.h create mode 100644 net/discovery/efi_discovery_prefix.c diff --git a/icons/os_network.png b/icons/os_network.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4119265e303132ec4c23c11fd5ea17cead151a GIT binary patch literal 19647 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 literal 0 HcmV?d00001 diff --git a/icons/tool_netboot.png b/icons/tool_netboot.png new file mode 100644 index 0000000000000000000000000000000000000000..a5070efdbaaad522e83a474c136a7655e3d00228 GIT binary patch literal 1930 zcmV;52X**~P)93&moJJww6wIq)2B~i z_wLC&Z;nVAVv(|`jkARqvOf`UNVi5&pPyV9_Z=^Q1IWQkOH1MY{rg}v8lk7B2e`d_ z`I3pebm@`;yh=Mj094Sl(5REl`_9gPqck=)GUw*ao4klw;i5^4+VML;M&0Q8_3O;% z;7V3fQUcs|?b@Zz4)BO^qqgbfIoo79(8^W@Wny72)@u3Iv3Ot zK;4B4AZYTr0BMn1tyWqLG%6};@$A6(_&7oHR3e{0OH+u!&(6-$Un=&6c0%16pylG? z!r)z9UAYJXh6HIw>N<^xBx#J`Xacw0sa+mIm671z~HB+S^B`x zh%*=r26^PwsR8mQCnx8l{YmI3i9rE#xZKd6gRu!$n4Xyf%hWWuyP9Bh+*ew(>eT=r zA$Z}E-)r<{>ErJ14oj9SVaqaSg$dIHn9Ty%tOD;^QgFL=A%U1dVmx}hK(}w-4%yk+ z3r?d_(efaeOeQYCK1F=>>eWbJU*G)x{{C-rb8}}2ps=t|vvuoMY2+}sr!miGb`!=Eo-zWlTJ`1oQ3<^W0)sZ@;84%ly)yL|a_ z)Y`RcpWyw}@9o>S5E&V{9xolWC}3q`VxrgGyLVw^WCYsV+aW6}OA7Pe)R9AXc6QS6 zNB`&J2q1Wbe6o7=YJY;~(S{^Q2nh^f?v^cE;P&m?kdl(3lqUb`X18h6rjN4&1ixa% z3O%}7DSVxC9T;o|*dS~G?1tcqA=i247rJ=yVicx| ze%Z2RTKZ?y3WI}#p~_MP2GIbAq7T8qP$2x?1aN3G6Tu>V{`~nrj~qF&QAC4}WSS3w zkBEqvhaVjsW%+%l@(y&(bU~JT7Bn=A@N2yYU&JH)j2ZCsf~u;jiARqf6>xY}1YEdq zfg-O94Go=#9~&D3olXa>^{tRGngM--f$&?S3#5e^Ad&=R>W-}Z=ejL)%)4@+;gp9~Zh;SQ%iH8rtq}4*7hX);C3HkZ?f2>=# z&c)#Z2tGD8mLk6({D~7M0EGcr>iT5RS~|hAqXVX}VEetifQ)9I0|ySIV8{B-p#sjH zJsY)Z)hbT@Fa+}N*7#xeSP!rw{G1UI(6#QhUd?pcR5M`_4aVwdUp;_w<#KjNd&ziqk}~b zPZK2`ZlKj_Ni4ffUAuN|7=y79i@4okMJ%9MESAUz4;~cbOD8MAQ`GS{c1P{)?S<2) zPt!B`a(H?xP0!SQ%xBJ=No#IyZX*DP2`DHih(LfJ5hO1;Iaxz9JLNoG@#s1j6B7e( z-n;=!3nh4(Tg-TPCAYS=wh(|L1yJOA1_uXA@iO65Sy?F%oR5zW-yPOfaDW3GpTWz^ zYr)79Jf=`9*wHjf>9c0dnrej1!~&is;EIY00;js5TNMc)SQ^rl(k6-E)%wIlgO__q zNJucwIU;r=w#r0MY7sbx$1Y>Si%hc7Xq4op==FNj$&)9O)YjIcdJ235Zk6Fd%E-|yJ5VZU6rLU*+WFWXs_V2179pU|%Dr4Mipp0Qq#shDBfkt$q9UZN@JkIhgCQ2p@y+ zp%`83t5>gzvEwj!Sfu8(ckkXH{QmSQ!fSZs5#FhzqvI#+EQ=SO3pjV~oEhN-3A_#S zy$ny&A`ZW(1<(gKT*L3+Mf{wv!>@!t^Wt3WCU8!C;VK|_AWn|P{|h|XUk~^*ep~ek QD*ylh07*qoM6N<$f(^p7fB*mh literal 0 HcmV?d00001 diff --git a/icons/vol_net.png b/icons/vol_net.png new file mode 100644 index 0000000000000000000000000000000000000000..614d53cf368003ae7e58cd2c2937930d86acf436 GIT binary patch literal 2280 zcmVP)`f3rKY53hIqj-5EI6X)SzCnS9)Bn>4kDs75yU zLuo0Zty&?9pa}H~5QT^MP#Q{AnzktkrAhOwYbS9MKk8QlKUqN@?e2@-M7!UibL5V#9v`pmk58r`I@>NW>dU6A6CNZZI-fh7K%-G1t%e(%WPeE_e&xpz^Gf0==O z`~UXUbZP0X&hb*Z3kDS>23b)-bzO`{wv-@MIB&f{$hUr*<-2!URF;D0IXI4sZQJDY z`IC3w^_fkJ=|rxc_}%W`^U|I_Z4CmoOKZ(7jhav2TF>@P%Xw%MI6^H9Vi>%3BF87! zXQ;1^f!3gzbpXTI__G&xKf2&S76CYL^so`A;2ks=5!icVly?VwMm>v{Pv=;@G&w79 zg}IK$k!+gJH7TSD2*Z$2YczUx)SBU3^!XpZu=}%D>zP+iY`$^h&o$Z#bx2qDBqvl0 zkCu;9pYmwlzKW(Ai~f-;wUs4=p~i?99O(AAy)lImF$iQp5M1^!2+(0jrXU2z!qlwnP;E+`jwiOGVs_BzfUrr`dSbKggW5R2a`m~8o7Bz z0VxHMNQ6SMz&XF1rDBA#joWzotxk5VNU*)Jj;Lwl3x%44kQZG^l#+N-gAv8^{fB{H z&FNmsz;i!(7U6sMOQFck*t8W_vZK0}qAl=!f$#gco}g0X>9pa7%m@!}t>UH)4Jgm$ z)dOd7ig}ch_`=8ceSBXag+vI!jIGI(L~%Xu@HY;~+*>>BU=DZ>l!YlJ!kFLThK2_I8!LA^goV^!njS2!nC0SK^J;%-|swwJpWZ;@p zS%>SlD16VuFhFZPyVXjCG)?NlL5{k0tVoowGCDxPwg`iOe6dJej&e)d=Z>9eCW}kx zn^=Oae5hct?!0I3jj7P_rl?I zUyL-!0RnXn$1w;)O%N!QR9KdUGzCHkzP#1Jl~JaKOPL-Sy#y(hLMeH%c6>a~rF-0@ z>AEpqI-yuunH_$nq#-Z}X6oaVgK@W%C-s+o!hrdq19Buf&sG`CQ* zd_Cj-GENREI(jc)1$pXfW3=qt#`r&uVm35WT`lN-x08tpkDMQ4Np(3b%Pktp3mj|j zX3eq$184S8ux%XMdHUFUN1j|10AR(oue?!b4c}dvNsuZ@5l_UhER!{>*3i(kpkSUiSh#js2Z(=v%fB9xa^^5%!D*iqj~NR)KdTK;l6 z!;P8uNhfCyA*B?ZV(FU!g*?kX>@A)T&Z|Je?9-tq|y z!ywd}KnX4s3$&lVKt@dsdbzR3vs1ZOne7Y(5OBFmywuYz1`q*aKpLn6Rs-uUj@Knq zB_B(cB+5msB%X{$A|)|18Y-n6$GMQrd&6cZ#*`49z!1;{3<48Ck;@<<7a{)LkBM>7 z&5Irb;(&GWI?61pW;S5RY;bXvE9Upe^E=xAd;2Gr>cJ(KlP2;20000&1 | grep -is 'gcc version 2\.96') +ifneq ($(GCC_2_96_BANNER),) +$(warning gcc 2.96 is unsuitable for compiling iPXE) +$(warning Use gcc 2.95 or a newer version instead) +$(error Unsuitable build environment found) +endif +endif + +PERL_UNICODE_CHECK := $(shell $(PERL) -e 'use bytes; print chr(255)' | wc -c) +ifeq ($(PERL_UNICODE_CHECK),2) +$(warning Your Perl version has a Unicode handling bug) +$(warning Execute this command before building iPXE:) +$(warning export LANG=$${LANG%.UTF-8}) +$(error Unsuitable build environment found) +endif + +LD_GOLD_BANNER := $(shell $(LD) -v 2>&1 | grep 'GNU gold') +ifneq ($(LD_GOLD_BANNER),) +$(warning GNU gold is unsuitable for building iPXE) +$(warning Use GNU ld instead) +$(error Unsuitable build environment found) +endif + +############################################################################### +# +# Check if $(eval ...) is available to use +# + +HAVE_EVAL := +ifndef NO_EVAL +$(eval HAVE_EVAL := yes) +endif +eval : + @$(ECHO) $(HAVE_EVAL) + +############################################################################### +# +# Check for various tool workarounds +# + +WORKAROUND_CFLAGS := +WORKAROUND_ASFLAGS := +WORKAROUND_LDFLAGS := + +# Make syntax does not allow use of comma or space in certain places. +# This ugly workaround is suggested in the manual. +# +COMMA := , +EMPTY := +SPACE := $(EMPTY) $(EMPTY) +HASH := \# +define NEWLINE + + +endef + +# Some widespread patched versions of gcc include -fstack-protector by +# default, even when -ffreestanding is specified. We therefore need +# to disable -fstack-protector if the compiler supports it. +# +ifeq ($(CCTYPE),gcc) +SP_TEST = $(CC) -fno-stack-protector -x c -c /dev/null \ + -o /dev/null >/dev/null 2>&1 +SP_FLAGS := $(shell $(SP_TEST) && $(ECHO) '-fno-stack-protector') +WORKAROUND_CFLAGS += $(SP_FLAGS) +endif + +# Some widespread patched versions of gcc include -fPIE -Wl,-pie by +# default. Note that gcc will exit *successfully* if it fails to +# recognise an option that starts with "no", so we have to test for +# output on stderr instead of checking the exit status. +# +ifeq ($(CCTYPE),gcc) +PIE_TEST = [ -z "`$(CC) -fno-PIE -nopie -x c -c /dev/null -o /dev/null 2>&1`" ] +PIE_FLAGS := $(shell $(PIE_TEST) && $(ECHO) '-fno-PIE -nopie') +WORKAROUND_CFLAGS += $(PIE_FLAGS) +endif + +# gcc 4.4 generates .eh_frame sections by default, which distort the +# output of "size". Inhibit this. +# +ifeq ($(CCTYPE),gcc) +CFI_TEST = $(CC) -fno-dwarf2-cfi-asm -fno-exceptions -fno-unwind-tables \ + -fno-asynchronous-unwind-tables -x c -c /dev/null \ + -o /dev/null >/dev/null 2>&1 +CFI_FLAGS := $(shell $(CFI_TEST) && \ + $(ECHO) '-fno-dwarf2-cfi-asm -fno-exceptions ' \ + '-fno-unwind-tables -fno-asynchronous-unwind-tables') +WORKAROUND_CFLAGS += $(CFI_FLAGS) +endif + +# gcc 4.6 generates spurious warnings if -Waddress is in force. +# Inhibit this. +# +ifeq ($(CCTYPE),gcc) +WNA_TEST = $(CC) -Wno-address -x c -c /dev/null -o /dev/null >/dev/null 2>&1 +WNA_FLAGS := $(shell $(WNA_TEST) && $(ECHO) '-Wno-address') +WORKAROUND_CFLAGS += $(WNA_FLAGS) +endif + +# Some versions of gas choke on division operators, treating them as +# comment markers. Specifying --divide will work around this problem, +# but isn't available on older gas versions. +# +DIVIDE_TEST = $(AS) --divide /dev/null -o /dev/null 2>/dev/null +DIVIDE_FLAGS := $(shell $(DIVIDE_TEST) && $(ECHO) '--divide') +WORKAROUND_ASFLAGS += $(DIVIDE_FLAGS) + +############################################################################### +# +# Build verbosity +# +ifeq ($(V),1) +Q := +QM := @\# +else +Q := @ +QM := @ +endif + +############################################################################### +# +# Checker +# +ifeq ($(C),1) +export REAL_CC := $(CC) +CC := cgcc +CFLAGS += -Wno-decl +endif + +############################################################################### +# +# Set BIN according to whatever was specified on the command line as +# the build target. +# + +# Determine how many different BIN directories are mentioned in the +# make goals. +# +BIN_GOALS := $(filter bin bin/% bin-%,$(MAKECMDGOALS)) +BIN_GOALS_BINS := $(sort $(foreach BG,$(BIN_GOALS),\ + $(firstword $(subst /, ,$(BG))))) +NUM_BINS := $(words $(BIN_GOALS_BINS)) + +ifeq ($(NUM_BINS),0) + +# No BIN directory was specified. Set BIN to "bin" as a sensible +# default. + +BIN := bin + +else # NUM_BINS == 0 + +ifeq ($(NUM_BINS),1) + +# If exactly one BIN directory was specified, set BIN to match this +# directory. +# +BIN := $(firstword $(BIN_GOALS_BINS)) + +else # NUM_BINS == 1 + +# More than one BIN directory was specified. We cannot handle the +# latter case within a single make invocation, so set up recursive +# targets for each BIN directory. Use exactly one target for each BIN +# directory since running multiple make invocations within the same +# BIN directory is likely to cause problems. +# +# Leave $(BIN) undefined. This has implications for any target that +# depends on $(BIN); such targets should be made conditional upon the +# existence of $(BIN). +# +BIN_GOALS_FIRST := $(foreach BGB,$(BIN_GOALS_BINS),\ + $(firstword $(filter $(BGB)/%,$(BIN_GOALS)))) +BIN_GOALS_OTHER := $(filter-out $(BIN_GOALS_FIRST),$(BIN_GOALS)) + +$(BIN_GOALS_FIRST) : % : BIN_RECURSE + $(Q)$(MAKE) --no-print-directory BIN=$(firstword $(subst /, ,$@)) \ + $(filter $(firstword $(subst /, ,$@))/%, $(BIN_GOALS)) +$(BIN_GOALS_OTHER) : % : BIN_RECURSE + $(Q)$(TRUE) +.PHONY : BIN_RECURSE + +endif # NUM_BINS == 1 +endif # NUM_BINS == 0 + +ifdef BIN + +# Create $(BIN) directory if it doesn't exist yet +# +ifeq ($(wildcard $(BIN)),) +$(shell $(MKDIR) -p $(BIN)) +endif + +# Target to allow e.g. "make bin-efi arch" +# +$(BIN) : + @# Do nothing, silently +.PHONY : $(BIN) + +# Remove everything in $(BIN) for a "make clean" +# +CLEANUP += $(BIN)/*.* # Avoid picking up directories + +endif # defined(BIN) + +# Determine whether or not we need to include the dependency files +# +NO_DEP_TARGETS := $(BIN) clean veryclean +ifeq ($(MAKECMDGOALS),) +NEED_DEPS := 1 +endif +ifneq ($(strip $(filter-out $(NO_DEP_TARGETS),$(MAKECMDGOALS))),) +NEED_DEPS := 1 +endif + +############################################################################### +# +# Select build architecture and platform based on $(BIN) +# +# BIN has the form bin[-[arch-]platform] + +ARCHS := $(patsubst arch/%,%,$(wildcard arch/*)) +PLATFORMS := $(patsubst config/defaults/%.h,%,\ + $(wildcard config/defaults/*.h)) +archs : + @$(ECHO) $(ARCHS) + +platforms : + @$(ECHO) $(PLATFORMS) + +ifdef BIN + +# Determine architecture portion of $(BIN), if present +BIN_ARCH := $(strip $(foreach A,$(ARCHS),\ + $(patsubst bin-$(A)-%,$(A),\ + $(filter bin-$(A)-%,$(BIN))))) + +# Determine platform portion of $(BIN), if present +ifeq ($(BIN_ARCH),) +BIN_PLATFORM := $(patsubst bin-%,%,$(filter bin-%,$(BIN))) +else +BIN_PLATFORM := $(patsubst bin-$(BIN_ARCH)-%,%,$(BIN)) +endif + +# Determine build architecture +DEFAULT_ARCH := i386 +ARCH := $(firstword $(BIN_ARCH) $(DEFAULT_ARCH)) +CFLAGS += -DARCH=$(ARCH) +arch : + @$(ECHO) $(ARCH) +.PHONY : arch + +# Determine build platform +DEFAULT_PLATFORM := pcbios +PLATFORM := $(firstword $(BIN_PLATFORM) $(DEFAULT_PLATFORM)) +CFLAGS += -DPLATFORM=$(PLATFORM) +platform : + @$(ECHO) $(PLATFORM) + +endif # defined(BIN) + +# Include architecture-specific Makefile +ifdef ARCH +MAKEDEPS += arch/$(ARCH)/Makefile +include arch/$(ARCH)/Makefile +endif + +# Include architecture-specific include path +ifdef ARCH +INCDIRS += arch/$(ARCH)/include +INCDIRS += arch/$(ARCH)/include/$(PLATFORM) +endif + +############################################################################### +# +# Source file handling + +# SRCDIRS lists all directories containing source files. +srcdirs : + @$(ECHO) $(SRCDIRS) + +# SRCS lists all .c or .S files found in any SRCDIR +# +SRCS += $(wildcard $(patsubst %,%/*.c,$(SRCDIRS))) +SRCS += $(wildcard $(patsubst %,%/*.S,$(SRCDIRS))) +srcs : + @$(ECHO) $(SRCS) + +# AUTO_SRCS lists all files in SRCS that are not mentioned in +# NON_AUTO_SRCS. Files should be added to NON_AUTO_SRCS if they +# cannot be built using the standard build template. +# +AUTO_SRCS = $(filter-out $(NON_AUTO_SRCS),$(SRCS)) +autosrcs : + @$(ECHO) $(AUTO_SRCS) + +# Just about everything else in this section depends upon having +# $(BIN) set + +ifdef BIN + +# INCDIRS lists the include path +incdirs : + @$(ECHO) $(INCDIRS) + +# Common flags +# +CFLAGS += $(foreach INC,$(INCDIRS),-I$(INC)) +CFLAGS += -Os +CFLAGS += -g +ifeq ($(CCTYPE),gcc) +CFLAGS += -ffreestanding +CFLAGS += -Wall -W -Wformat-nonliteral +HOST_CFLAGS += -Wall -W -Wformat-nonliteral +endif +ifeq ($(CCTYPE),icc) +CFLAGS += -fno-builtin +CFLAGS += -no-ip +CFLAGS += -no-gcc +CFLAGS += -diag-disable 111 # Unreachable code +CFLAGS += -diag-disable 128 # Unreachable loop +CFLAGS += -diag-disable 170 # Array boundary checks +CFLAGS += -diag-disable 177 # Unused functions +CFLAGS += -diag-disable 181 # printf() format checks +CFLAGS += -diag-disable 188 # enum strictness +CFLAGS += -diag-disable 193 # Undefined preprocessor identifiers +CFLAGS += -diag-disable 280 # switch ( constant ) +CFLAGS += -diag-disable 310 # K&R parameter lists +CFLAGS += -diag-disable 424 # Extra semicolon +CFLAGS += -diag-disable 589 # Declarations mid-code +CFLAGS += -diag-disable 593 # Unused variables +CFLAGS += -diag-disable 810 # Casting ints to smaller ints +CFLAGS += -diag-disable 981 # Sequence point violations +CFLAGS += -diag-disable 1292 # Ignored attributes +CFLAGS += -diag-disable 1338 # void pointer arithmetic +CFLAGS += -diag-disable 1361 # Variable-length arrays +CFLAGS += -diag-disable 1418 # Missing prototypes +CFLAGS += -diag-disable 1419 # Missing prototypes +CFLAGS += -diag-disable 1599 # Hidden variables +CFLAGS += -Wall -Wmissing-declarations +endif +CFLAGS += $(WORKAROUND_CFLAGS) $(EXTRA_CFLAGS) +ASFLAGS += $(WORKAROUND_ASFLAGS) $(EXTRA_ASFLAGS) +LDFLAGS += $(WORKAROUND_LDFLAGS) $(EXTRA_LDFLAGS) +HOST_CFLAGS += -O2 -g + +# Inhibit -Werror if NO_WERROR is specified on make command line +# +ifneq ($(NO_WERROR),1) +CFLAGS += -Werror +ASFLAGS += --fatal-warnings +HOST_CFLAGS += -Werror +endif + +# Function trace recorder state in the last build. This is needed +# in order to correctly rebuild whenever the function recorder is +# enabled/disabled. +# +FNREC_STATE := $(BIN)/.fnrec.state +ifeq ($(wildcard $(FNREC_STATE)),) +FNREC_OLD := +else +FNREC_OLD := $(shell cat $(FNREC_STATE)) +endif +ifeq ($(FNREC_OLD),$(FNREC)) +$(FNREC_STATE) : +else +$(FNREC_STATE) : clean +$(shell $(ECHO) "$(FNREC)" > $(FNREC_STATE)) +endif + +VERYCLEANUP += $(FNREC_STATE) +MAKEDEPS += $(FNREC_STATE) + +ifeq ($(FNREC),1) +# Enabling -finstrument-functions affects gcc's analysis and leads to spurious +# warnings about use of uninitialised variables. +# +CFLAGS += -Wno-uninitialized +CFLAGS += -finstrument-functions +CFLAGS += -finstrument-functions-exclude-file-list=core/fnrec.c +endif + +# Enable per-item sections and section garbage collection. Note that +# some older versions of gcc support -fdata-sections but treat it as +# implying -fno-common, which would break our build. Some other older +# versions issue a spurious and uninhibitable warning if +# -ffunction-sections is used with -g, which would also break our +# build since we use -Werror. +# +ifeq ($(CCTYPE),gcc) +DS_TEST = $(ECHO) 'char x;' | \ + $(CC) -fdata-sections -S -x c - -o - 2>/dev/null | \ + grep -E '\.comm' > /dev/null +DS_FLAGS := $(shell $(DS_TEST) && $(ECHO) '-fdata-sections') +FS_TEST = $(CC) -ffunction-sections -g -c -x c /dev/null \ + -o /dev/null 2>/dev/null +FS_FLAGS := $(shell $(FS_TEST) && $(ECHO) '-ffunction-sections') +CFLAGS += $(FS_FLAGS) $(DS_FLAGS) +endif +LDFLAGS += --gc-sections + +# Force creation of static binaries (required for OpenBSD, does no +# harm on other platforms). +# +LDFLAGS += -static + +# compiler.h is needed for our linking and debugging system +# +CFLAGS += -include include/compiler.h + +# CFLAGS for specific object types +# +CFLAGS_c += +CFLAGS_S += -DASSEMBLY + +# Base object name of the current target +# +OBJECT = $(firstword $(subst ., ,$(@F))) + +# CFLAGS for specific object files. You can define +# e.g. CFLAGS_rtl8139, and have those flags automatically used when +# compiling bin/rtl8139.o. +# +OBJ_CFLAGS = $(CFLAGS_$(OBJECT)) -DOBJECT=$(subst -,_,$(OBJECT)) +$(BIN)/%.flags : + @$(ECHO) $(OBJ_CFLAGS) + +# ICC requires postprocessing objects to fix up table alignments +# +ifeq ($(CCTYPE),icc) +POST_O = && $(ICCFIX) $@ +POST_O_DEPS := $(ICCFIX) +else +POST_O := +POST_O_DEPS := +endif + +# Rules for specific object types. +# +COMPILE_c = $(CC) $(CFLAGS) $(CFLAGS_c) $(OBJ_CFLAGS) +RULE_c = $(Q)$(COMPILE_c) -c $< -o $@ $(POST_O) +RULE_c_to_dbg%.o = $(Q)$(COMPILE_c) -DDBGLVL_MAX=$* -c $< -o $@ $(POST_O) +RULE_c_to_c = $(Q)$(COMPILE_c) -E -c $< > $@ +RULE_c_to_s = $(Q)$(COMPILE_c) -S -g0 -c $< -o $@ + +PREPROCESS_S = $(CPP) $(CFLAGS) $(CFLAGS_S) $(OBJ_CFLAGS) +ASSEMBLE_S = $(AS) $(ASFLAGS) +RULE_S = $(Q)$(PREPROCESS_S) $< | $(ASSEMBLE_S) -o $@ +RULE_S_to_dbg%.o = $(Q)$(PREPROCESS_S) -DDBGLVL_MAX=$* $< | $(ASSEMBLE_S) -o $@ +RULE_S_to_s = $(Q)$(PREPROCESS_S) $< > $@ + +DEBUG_TARGETS += dbg%.o c s + +# List of embedded images included in the last build of embedded.o. +# This is needed in order to correctly rebuild embedded.o whenever the +# list of objects changes. +# +EMBED := $(EMBEDDED_IMAGE) # Maintain backwards compatibility +EMBEDDED_LIST := $(BIN)/.embedded.list +ifeq ($(wildcard $(EMBEDDED_LIST)),) +EMBED_OLD := +else +EMBED_OLD := $(shell cat $(EMBEDDED_LIST)) +endif +ifneq ($(EMBED_OLD),$(EMBED)) +$(shell $(ECHO) "$(EMBED)" > $(EMBEDDED_LIST)) +endif + +$(EMBEDDED_LIST) : $(MAKEDEPS) + +VERYCLEANUP += $(EMBEDDED_LIST) + +EMBEDDED_FILES := $(subst $(COMMA), ,$(EMBED)) +EMBED_ALL := $(foreach i,$(call seq,1,$(words $(EMBEDDED_FILES))),\ + EMBED ( $(i), \"$(word $(i), $(EMBEDDED_FILES))\",\ + \"$(notdir $(word $(i),$(EMBEDDED_FILES)))\" )) + +embedded_DEPS += $(EMBEDDED_FILES) $(EMBEDDED_LIST) + +CFLAGS_embedded = -DEMBED_ALL="$(EMBED_ALL)" + +# List of trusted root certificates +# +TRUSTED_LIST := $(BIN)/.trusted.list +ifeq ($(wildcard $(TRUSTED_LIST)),) +TRUST_OLD := +else +TRUST_OLD := $(shell cat $(TRUSTED_LIST)) +endif +ifneq ($(TRUST_OLD),$(TRUST)) +$(shell $(ECHO) "$(TRUST)" > $(TRUSTED_LIST)) +endif + +$(TRUSTED_LIST) : $(MAKEDEPS) + +VERYCLEANUP += $(TRUSTED_LIST) + +# Trusted root certificate fingerprints +# +TRUSTED_CERTS := $(subst $(COMMA), ,$(TRUST)) +TRUSTED_FPS := $(foreach CERT,$(TRUSTED_CERTS),\ + 0x$(subst :,$(COMMA) 0x,$(lastword $(subst =, ,\ + $(shell $(OPENSSL) x509 -in $(CERT) -noout -sha256 \ + -fingerprint))))$(COMMA)) + +rootcert_DEPS += $(TRUSTED_FILES) $(TRUSTED_LIST) + +CFLAGS_rootcert = $(if $(TRUSTED_FPS),-DTRUSTED="$(TRUSTED_FPS)") + +# List of embedded certificates +# +CERT_LIST := $(BIN)/.certificate.list +ifeq ($(wildcard $(CERT_LIST)),) +CERT_OLD := +else +CERT_OLD := $(shell cat $(CERT_LIST)) +endif +ifneq ($(CERT_OLD),$(CERT)) +$(shell $(ECHO) "$(CERT)" > $(CERT_LIST)) +endif + +$(CERT_LIST) : $(MAKEDEPS) + +VERYCLEANUP += $(CERT_LIST) + +# Embedded certificates concatenated and then split into one file per +# certificate (even if original files contained certificate chains) +# +CERT_FILES := $(subst $(COMMA), ,$(CERT)) +CERT_CONCAT := $(BIN)/.certificates.pem + +ifneq ($(CERT),) + +CERT_COUNT := $(shell grep "BEGIN CERTIFICATE" $(CERT_FILES) | wc -l) + +$(CERT_CONCAT) : $(CERT_FILES) $(CERT_LIST) + $(Q)cat $(CERT_FILES) > $@ + +# We must use an (otherwise unnecessary) pattern rule here to encode +# the fact that one "csplit" command generates multiple targets +CERT_PEMS := $(foreach i,$(call seq,1,$(CERT_COUNT)),\ + $(BIN)/.certificate.pem.$(i)) +$(subst .pem.,.%.,$(CERT_PEMS)) : $(BIN)/.certificates.% + $(Q)$(CSPLIT) -q -n 1 -f $(BIN)/.certificate.pem. $< \ + '/BEGIN CERTIFICATE/' '{*}' + +CERT_DERS := $(subst .certificate.pem.,.certificate.der.,$(CERT_PEMS)) +$(BIN)/.certificate.der.% : $(BIN)/.certificate.pem.% + $(Q)$(OPENSSL) x509 -in $< -outform DER -out $@ + +CERT_ALL := $(foreach i,$(call seq,1,$(CERT_COUNT)),\ + CERT ( $(i), \"$(word $(i),$(CERT_DERS))\" )) + +endif + +certstore_DEPS += $(CERT_LIST) $(CERT_FILES) $(CERT_PEMS) $(CERT_DERS) + +CFLAGS_certstore += -DCERT_ALL="$(CERT_ALL)" + +CLEANUP += $(BIN)/.certificate.* $(BIN)/.certificates.* + +# (Single-element) list of private keys +# +ifdef KEY +PRIVKEY := $(KEY) # Maintain backwards compatibility +endif +PRIVKEY_LIST := $(BIN)/.private_key.list +ifeq ($(wildcard $(PRIVKEY_LIST)),) +PRIVKEY_OLD := +else +PRIVKEY_OLD := $(shell cat $(PRIVKEY_LIST)) +endif +ifneq ($(PRIVKEY_OLD),$(PRIVKEY)) +$(shell $(ECHO) "$(PRIVKEY)" > $(PRIVKEY_LIST)) +endif + +$(PRIVKEY_LIST) : $(MAKEDEPS) + +VERYCLEANUP += $(PRIVKEY_LIST) + +# Embedded private key +# +PRIVKEY_INC := $(BIN)/.private_key.der + +ifdef PRIVKEY +$(PRIVKEY_INC) : $(PRIVKEY) $(PRIVKEY_LIST) + $(Q)$(OPENSSL) rsa -in $< -outform DER -out $@ + +privkey_DEPS += $(PRIVKEY_INC) +endif + +CLEANUP += $(BIN)/.private_key.* + +privkey_DEPS += $(PRIVKEY_LIST) + +CFLAGS_privkey += $(if $(PRIVKEY),-DPRIVATE_KEY="\"$(PRIVKEY_INC)\"") + +# (Single-element) list of named configurations +# +CONFIG_LIST := $(BIN)/.config.list +ifeq ($(wildcard $(CONFIG_LIST)),) +CONFIG_OLD := +else +CONFIG_OLD := $(shell cat $(CONFIG_LIST)) +endif +ifneq ($(CONFIG_OLD),$(CONFIG)) +$(shell $(ECHO) "$(CONFIG)" > $(CONFIG_LIST)) +endif + +$(CONFIG_LIST) : $(MAKEDEPS) + +VERYCLEANUP += $(CONFIG_LIST) + +# Named configurations +# +ifneq ($(CONFIG),) +ifneq ($(wildcard config/$(CONFIG)),) +CFLAGS += -DCONFIG=$(CONFIG) +endif +CFLAGS += -DLOCAL_CONFIG=$(CONFIG) +endif + +config/named.h : $(CONFIG_LIST) + $(Q)$(TOUCH) $@ + +.PRECIOUS : config/named.h + +# These files use .incbin inline assembly to include a binary file. +# Unfortunately ccache does not detect this dependency and caches +# builds even when the binary file has changed. +# +$(BIN)/embedded.% : override CC := env CCACHE_DISABLE=1 $(CC) +$(BIN)/certstore.% : override CC := env CCACHE_DISABLE=1 $(CC) +$(BIN)/privkey.% : override CC := env CCACHE_DISABLE=1 $(CC) + +# Debug message autocolourisation range +# +DBGCOL_LIST := $(BIN)/.dbgcol.list +ifeq ($(wildcard $(DBGCOL_LIST)),) +DBGCOL_OLD := +else +DBGCOL_OLD := $(shell cat $(DBGCOL_LIST)) +endif +ifneq ($(DBGCOL_OLD),$(DBGCOL)) +$(shell $(ECHO) "$(DBGCOL)" > $(DBGCOL_LIST)) +endif + +$(DBGCOL_LIST) : $(MAKEDEPS) + +VERYCLEANUP += $(DBGCOL_LIST) + +DBGCOL_COLOURS := $(subst -, ,$(DBGCOL)) +DBGCOL_MIN := $(word 1,$(DBGCOL_COLOURS)) +DBGCOL_MAX := $(word 2,$(DBGCOL_COLOURS)) + +debug_DEPS += $(DBGCOL_LIST) + +CFLAGS_debug += $(if $(DBGCOL_MIN),-DDBGCOL_MIN=$(DBGCOL_MIN)) +CFLAGS_debug += $(if $(DBGCOL_MAX),-DDBGCOL_MAX=$(DBGCOL_MAX)) + +# We automatically generate rules for any file mentioned in AUTO_SRCS +# using the following set of templates. We use $(eval ...) if +# available, otherwise we generate separate Makefile fragments and +# include them. + +# deps_template : generate dependency list for a given source file +# +# $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c") +# +define deps_template_file +$(call deps_template_parts,$(1),$(subst .,,$(suffix $(1))),$(basename $(notdir $(1)))) +endef +# +# $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c") +# $(2) is the source type (e.g. "c") +# $(3) is the source base name (e.g. "rtl8139") +# +define deps_template_parts + @$(ECHO) " [DEPS] $(1)" + @$(MKDIR) -p $(BIN)/deps/$(dir $(1)) + $(Q)$(CPP) $(CFLAGS) $(CFLAGS_$(2)) $(CFLAGS_$(3)) -DOBJECT=$(3) \ + -Wno-error -M $(1) -MG -MP | \ + sed 's/\.o\s*:/_DEPS +=/' > $(BIN)/deps/$(1).d + $(Q)$(if $(findstring drivers/,$(1)),\ + $(PERL) $(PARSEROM) $(1) >> $(BIN)/deps/$(1).d) +endef + +# rules_template : generate rules for a given source file +# +# $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c") +# +define rules_template +$(call rules_template_parts,$(1),$(subst .,,$(suffix $(1))),$(basename $(notdir $(1)))) +endef +# +# $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c") +# $(2) is the source type (e.g. "c") +# $(3) is the source base name (e.g. "rtl8139") +# +define rules_template_parts +$$(BIN)/$(3).o : $(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(3)_DEPS) + $$(QM)$(ECHO) " [BUILD] $$@" + $$(RULE_$(2)) +BOBJS += $$(BIN)/$(3).o +$(foreach TGT,$(DEBUG_TARGETS),$(if $(RULE_$(2)_to_$(TGT)),$(NEWLINE)$(call rules_template_target,$(1),$(2),$(3),$(TGT)))) +$$(BIN)/deps/$(1).d : $$($(3)_DEPS) +TAGS : $$($(3)_DEPS) +endef +# +# $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c") +# $(2) is the source type (e.g. "c") +# $(3) is the source base name (e.g. "rtl8139") +# $(4) is the destination type (e.g. "dbg%.o") +# +define rules_template_target +$$(BIN)/$(3).$(4) : $(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(3)_DEPS) + $$(QM)$(ECHO) " [BUILD] $$@" + $$(RULE_$(2)_to_$(4)) +$(TGT)_OBJS += $$(BIN)/$(3).$(4) +endef +# +# $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c") +# +define rules_template_file + @$(ECHO) " [RULES] $(1)" + @$(MKDIR) -p $(BIN)/rules/$(dir $(1)) + @$(ECHO_E) '$(subst $(NEWLINE),\n,$(call rules_template,$(1)))' \ + > $(BIN)/rules/$(1).r +endef + +# Generate the dependency files +# +$(BIN)/deps/%.d : % $(MAKEDEPS) $(PARSEROM) + $(call deps_template_file,$<) + +# Calculate list of dependency files +# +AUTO_DEPS = $(patsubst %,$(BIN)/deps/%.d,$(AUTO_SRCS)) +autodeps : + @$(ECHO) $(AUTO_DEPS) +VERYCLEANUP += $(BIN)/deps + +# Include dependency files +# +ifdef NEED_DEPS +ifneq ($(AUTO_DEPS),) +-include $(AUTO_DEPS) +endif +endif + +# Generate the rules files +# +$(BIN)/rules/%.r : % $(MAKEDEPS) + $(call rules_template_file,$<) + +# Calculate list of rules files +# +AUTO_RULES = $(patsubst %,$(BIN)/rules/%.r,$(AUTO_SRCS)) +autorules : + @$(ECHO) $(AUTO_RULES) +VERYCLEANUP += $(BIN)/rules + +# Evaluate rules (or include rules files) +# +ifdef NEED_DEPS +ifneq ($(AUTO_RULES),) +ifneq ($(HAVE_EVAL),) +$(foreach SRC,$(AUTO_SRCS),$(eval $(call rules_template,$(SRC)))) +else +-include $(AUTO_RULES) +endif +endif +endif + +# The following variables are created by the rules files +# +bobjs : + @$(ECHO) $(BOBJS) +drivers : + @$(ECHO) $(DRIVERS) +.PHONY : drivers +roms : + @$(ECHO) $(ROMS) + +# Generate error usage information +# +$(BIN)/%.einfo : $(BIN)/%.o + $(QM)$(ECHO) " [EINFO] $@" + $(Q)$(OBJCOPY) -O binary -j .einfo --set-section-flags .einfo=alloc \ + $< $@ + +EINFOS := $(patsubst $(BIN)/%.o,$(BIN)/%.einfo,$(BOBJS)) +$(BIN)/errors : $(EINFOS) $(EINFO) + $(QM)$(ECHO) " [EINFO] $@" + $(Q)$(EINFO) $(EINFOS) | sort > $@ +CLEANUP += $(BIN)/errors # Doesn't match the $(BIN)/*.* pattern + +# Generate the NIC file from the parsed source files. The NIC file is +# only for rom-o-matic. +# +$(BIN)/NIC : $(AUTO_DEPS) + @$(ECHO) '# This is an automatically generated file, do not edit' > $@ + @$(ECHO) '# It does not affect anything in the build, ' \ + 'it is only for rom-o-matic' >> $@ + @$(ECHO) >> $@ + @perl -ne 'chomp; print "$$1\n" if /\# NIC\t(.*)$$/' $^ >> $@ +CLEANUP += $(BIN)/NIC # Doesn't match the $(BIN)/*.* pattern + +# Analyse a target name (e.g. "bin/dfe538--prism2_pci.rom.tmp") and +# derive the variables: +# +# TGT_ELEMENTS : the elements of the target (e.g. "dfe538 prism2_pci") +# TGT_PREFIX : the prefix type (e.g. "pcirom") +# TGT_DRIVERS : the driver for each element (e.g. "rtl8139 prism2_pci") +# TGT_ROM_NAME : the ROM name (e.g. "dfe538") +# +DRIVERS_ipxe = $(DRIVERS) +CARD_DRIVER = $(firstword $(DRIVER_$(1)) $(1)) +TGT_ELEMENTS = $(subst --, ,$(firstword $(subst ., ,$(notdir $@)))) +TGT_ROM_NAME = $(firstword $(TGT_ELEMENTS)) +TGT_DRIVERS = $(strip $(if $(DRIVERS_$(TGT_ROM_NAME)), \ + $(DRIVERS_$(TGT_ROM_NAME)), \ + $(foreach TGT_ELEMENT,$(TGT_ELEMENTS), \ + $(call CARD_DRIVER,$(TGT_ELEMENT))) )) +TGT_PREFIX_NAME = $(word 2,$(subst ., ,$(notdir $@))) +TGT_PREFIX = $(strip $(if $(filter rom,$(TGT_PREFIX_NAME)), \ + $(ROM_TYPE_$(TGT_ROM_NAME))rom, \ + $(TGT_PREFIX_NAME))) + +# Look up ROM IDs for the current target +# (e.g. "bin/dfe538--prism2_pci.rom.tmp") and derive the variables: +# +# TGT_PCI_VENDOR : the PCI vendor ID (e.g. "0x1186") +# TGT_PCI_DEVICE : the PCI device ID (e.g. "0x1300") +# +TGT_PCI_VENDOR = $(PCI_VENDOR_$(TGT_ROM_NAME)) +TGT_PCI_DEVICE = $(PCI_DEVICE_$(TGT_ROM_NAME)) + +# Calculate link-time options for the current target +# (e.g. "bin/dfe538--prism2_pci.rom.tmp") and derive the variables: +# +# TGT_LD_DRIVERS : symbols to require in order to drag in the relevant drivers +# (e.g. "obj_rtl8139 obj_prism2_pci") +# TGT_LD_IDS : symbols to define in order to fill in ID structures in the +# ROM header (e.g."pci_vendor_id=0x1186 pci_device_id=0x1300") +# +TGT_LD_DRIVERS = $(subst -,_,$(patsubst %,obj_%,$(TGT_DRIVERS))) +TGT_LD_IDS = pci_vendor_id=$(firstword $(TGT_PCI_VENDOR) 0) \ + pci_device_id=$(firstword $(TGT_PCI_DEVICE) 0) + +ifndef TGT_LD_ENTRY +TGT_LD_ENTRY = _$(TGT_PREFIX)_start +endif + +# Calculate linker flags based on link-time options for the current +# target type (e.g. "bin/dfe538--prism2_pci.rom.tmp") and derive the +# variables: +# +# TGT_LD_FLAGS : target-specific flags to pass to linker (e.g. +# "-u obj_zpciprefix -u obj_rtl8139 -u obj_prism2_pci +# --defsym pci_vendor=0x1186 --defsym pci_device=0x1300") +# +TGT_LD_FLAGS = $(foreach SYM,$(TGT_LD_ENTRY) $(TGT_LD_DRIVERS) obj_config,\ + -u $(SYM) --defsym check_$(SYM)=$(SYM) ) \ + $(patsubst %,--defsym %,$(TGT_LD_IDS)) \ + -e $(TGT_LD_ENTRY) + +# Calculate list of debugging versions of objects to be included in +# the target. +# +DEBUG_LIST = $(subst $(COMMA), ,$(DEBUG)) +DEBUG_OBJ_LEVEL = $(firstword $(word 2,$(subst :, ,$(1))) 1) +DEBUG_OBJ_BASE = $(word 1,$(subst :, ,$(1))).dbg$(call DEBUG_OBJ_LEVEL,$(1)) +DEBUG_OBJ = $(BIN)/$(call DEBUG_OBJ_BASE,$(1)).o +DEBUG_ORIG_OBJ = $(BIN)/$(word 1,$(subst :, ,$(1))).o +DEBUG_OBJS = $(foreach D,$(DEBUG_LIST),$(call DEBUG_OBJ,$(D))) +DEBUG_ORIG_OBJS = $(foreach D,$(DEBUG_LIST),$(call DEBUG_ORIG_OBJ,$(D))) +BLIB_OBJS = $(DEBUG_OBJS) $(filter-out $(DEBUG_ORIG_OBJS),$(BOBJS)) + +# Print out all derived information for a given target. +# +$(BIN)/%.info : + @$(ECHO) 'Elements : $(TGT_ELEMENTS)' + @$(ECHO) 'Prefix : $(TGT_PREFIX)' + @$(ECHO) 'Drivers : $(TGT_DRIVERS)' + @$(ECHO) 'ROM name : $(TGT_ROM_NAME)' + @$(ECHO) + @$(ECHO) 'PCI vendor : $(TGT_PCI_VENDOR)' + @$(ECHO) 'PCI device : $(TGT_PCI_DEVICE)' + @$(ECHO) + @$(ECHO) 'LD driver symbols : $(TGT_LD_DRIVERS)' + @$(ECHO) 'LD ID symbols : $(TGT_LD_IDS)' + @$(ECHO) 'LD entry point : $(TGT_LD_ENTRY)' + @$(ECHO) + @$(ECHO) 'LD target flags : $(TGT_LD_FLAGS)' + @$(ECHO) + @$(ECHO) 'Debugging objects : $(DEBUG_OBJS)' + @$(ECHO) 'Replaced objects : $(DEBUG_ORIG_OBJS)' + +# List of objects included in the last build of blib. This is needed +# in order to correctly rebuild blib whenever the list of objects +# changes. +# +BLIB_LIST := $(BIN)/.blib.list +ifeq ($(wildcard $(BLIB_LIST)),) +BLIB_OBJS_OLD := +else +BLIB_OBJS_OLD := $(shell cat $(BLIB_LIST)) +endif +ifneq ($(BLIB_OBJS_OLD),$(BLIB_OBJS)) +$(shell $(ECHO) "$(BLIB_OBJS)" > $(BLIB_LIST)) +endif + +$(BLIB_LIST) : $(MAKEDEPS) + +VERYCLEANUP += $(BLIB_LIST) + +# Library of all objects +# +BLIB = $(BIN)/blib.a +$(BLIB) : $(BLIB_OBJS) $(BLIB_LIST) $(MAKEDEPS) + $(Q)$(RM) $(BLIB) + $(QM)$(ECHO) " [AR] $@" + $(Q)$(AR) r $@ $(BLIB_OBJS) + $(Q)$(RANLIB) $@ +blib : $(BLIB) + +# Command to generate build ID. Must be unique for each $(BIN)/%.tmp, +# even within the same build run. +# +BUILD_ID_CMD := perl -e 'printf "0x%08x", int ( rand ( 0xffffffff ) );' + +# Build timestamp +# +BUILD_TIMESTAMP := $(shell date +%s) + +# Build version +# +GIT_INDEX := $(if $(GITVERSION),$(if $(wildcard ../.git/index),../.git/index)) +$(BIN)/version.%.o : core/version.c $(MAKEDEPS) $(GIT_INDEX) + $(QM)$(ECHO) " [VERSION] $@" + $(Q)$(COMPILE_c) -DBUILD_NAME="\"$*\"" \ + -DVERSION_MAJOR=$(VERSION_MAJOR) \ + -DVERSION_MINOR=$(VERSION_MINOR) \ + -DVERSION_PATCH=$(VERSION_PATCH) \ + -DVERSION="\"$(VERSION)\"" \ + -c $< -o $@ + +# Build an intermediate object file from the objects required for the +# specified target. +# +$(BIN)/%.tmp : $(BIN)/version.%.o $(BLIB) $(MAKEDEPS) $(LDSCRIPT) + $(QM)$(ECHO) " [LD] $@" + $(Q)$(LD) $(LDFLAGS) -T $(LDSCRIPT) $(TGT_LD_FLAGS) $< $(BLIB) -o $@ \ + --defsym _build_id=`$(BUILD_ID_CMD)` \ + --defsym _build_timestamp=$(BUILD_TIMESTAMP) \ + -Map $(BIN)/$*.tmp.map + $(Q)$(OBJDUMP) -ht $@ | $(PERL) $(SORTOBJDUMP) >> $(BIN)/$*.tmp.map + +# Keep intermediate object file (useful for debugging) +.PRECIOUS : $(BIN)/%.tmp + +# Show a linker map for the specified target +# +$(BIN)/%.map : $(BIN)/%.tmp + @less $(BIN)/$*.tmp.map + +# Get objects list for the specified target +# +define objs_list + $(sort $(foreach OBJ_SYMBOL,\ + $(filter obj_%,$(shell $(NM) $(1) | cut -d" " -f3)),\ + $(patsubst obj_%,%,$(OBJ_SYMBOL)))) +endef +$(BIN)/%.objs : $(BIN)/%.tmp + $(Q)$(ECHO) $(call objs_list,$<) +$(BIN)/%.sizes : $(BIN)/%.tmp + $(Q)$(SIZE) -t $(foreach OBJ,$(call objs_list,$<),$(wildcard $(BIN)/$(subst _,?,$(OBJ)).o)) | \ + sort -g + +# Get dependency list for the specified target +# +define deps_list + $(sort $(foreach OBJ,$(call objs_list,$(1)),$($(OBJ)_DEPS))) +endef +$(BIN)/%.deps : $(BIN)/%.tmp + $(Q)$(ECHO) $(call deps_list,$<) + +# Get unneeded source files for the specified target +# +define nodeps_list + $(sort $(filter-out $(call deps_list,$(1)),\ + $(foreach BOBJ,$(BOBJS),\ + $($(basename $(notdir $(BOBJ)))_DEPS)))) +endef +$(BIN)/%.nodeps : $(BIN)/%.tmp + $(Q)$(ECHO) $(call nodeps_list,$<) + +# Get licensing verdict for the specified target +# +define licensable_deps_list + $(filter-out config/local/%.h,\ + $(filter-out $(BIN)/.%.list,\ + $(call deps_list,$(1)))) +endef +define unlicensed_deps_list + $(shell grep -L FILE_LICENCE $(call licensable_deps_list,$(1))) +endef +define licence_list + $(sort $(foreach LICENCE,\ + $(filter __licence__%,$(shell $(NM) $(1) | cut -d" " -f3)),\ + $(word 2,$(subst __, ,$(LICENCE))))) +endef +$(BIN)/%.licence_list : $(BIN)/%.tmp + $(Q)$(ECHO) $(call licence_list,$<) +$(BIN)/%.licence : $(BIN)/%.tmp + $(QM)$(ECHO) " [LICENCE] $@" + $(Q)$(if $(strip $(call unlicensed_deps_list,$<)),\ + echo -n "Unable to determine licence because the following " ;\ + echo "files are missing a licence declaration:" ;\ + echo $(call unlicensed_deps_list,$<);\ + exit 1,\ + $(PERL) $(LICENCE) $(call licence_list,$<)) + +# Extract compression information from intermediate object file +# +$(BIN)/%.zinfo : $(BIN)/%.tmp + $(QM)$(ECHO) " [ZINFO] $@" + $(Q)$(OBJCOPY) -O binary -j .zinfo $< $@ + +# Build raw binary file from intermediate object file +# +$(BIN)/%.bin : $(BIN)/%.tmp + $(QM)$(ECHO) " [BIN] $@" + $(Q)$(OBJCOPY) -O binary -R .zinfo $< $@ + +# Compress raw binary file +# +$(BIN)/%.zbin : $(BIN)/%.bin $(BIN)/%.zinfo $(ZBIN) + $(QM)$(ECHO) " [ZBIN] $@" + $(Q)$(ZBIN) $(BIN)/$*.bin $(BIN)/$*.zinfo > $@ + +# Rules for each media format. These are generated and placed in an +# external Makefile fragment. We could do this via $(eval ...), but +# that would require make >= 3.80. +# +# Note that there's an alternative way to generate most .rom images: +# they can be copied from their 'master' ROM image using cp and +# reprocessed with makerom to add the PCI IDs and ident string. The +# relevant rule would look something like: +# +# $(BIN)/dfe538%rom : $(BIN)/rtl8139%rom +# cat $< $@ +# $(FINALISE_rom) +# +# You can derive the ROM/driver relationships using the variables +# DRIVER_ and/or ROMS_. +# +# We don't currently do this, because (a) it would require generating +# yet more Makefile fragments (since you need a rule for each ROM in +# ROMS), and (b) the linker is so fast that it probably wouldn't make +# much difference to the overall build time. + +# Add NON_AUTO_MEDIA to the media list, so that they show up in the +# output of "make" +# +MEDIA += $(NON_AUTO_MEDIA) + +media : + @$(ECHO) $(MEDIA) + +AUTO_MEDIA = $(filter-out $(NON_AUTO_MEDIA),$(MEDIA)) +automedia : + @$(ECHO) $(AUTO_MEDIA) + +# media_template : create media rules +# +# $(1) is the media name (e.g. "rom") +# +define media_template +$(if $(filter $(1),$(AUTO_MEDIA)),$(call auto_media_template,$(1))) +LIST_$(1) := $$(if $$(LIST_NAME_$(1)),$$($$(LIST_NAME_$(1))),$$(DRIVERS)) +ALL_$(1) = $$(foreach ITEM,$$(LIST_$(1)),$$(BIN)/$$(ITEM).$(1)) +$$(BIN)/all$(1)s : $$(ALL_$(1)) +$$(BIN)/allall : $$(BIN)/all$(1)s +all$(1)s : $$(BIN)/all$(1)s +allall : $$(BIN)/allall +endef +# +# $(1) is the media name (e.g. "rom") +# +define auto_media_template +$$(BIN)/%.$(1) : $$(BIN)/%.$(1).zbin + $$(QM)echo " [FINISH] $$@" + $$(Q)$$(CP) $$< $$@ + $$(Q)$$(if $$(PAD_$(1)),$$(PAD_$(1)) $$@) + $$(Q)$$(if $$(FINALISE_$(1)),$$(FINALISE_$(1)) $$@) +endef +# +# $(1) is the media name (e.g. "rom") +# +define media_template_file + @$(ECHO) " [MEDIARULES] $(1)" + @$(MKDIR) -p $(BIN)/rules/$(dir $(1)) + @$(ECHO_E) '$(subst $(NEWLINE),\n,$(call media_template,$(1)))' \ + > $(BIN)/rules/$(1).media.r +endef + +# Generate media rules files +# +$(BIN)/rules/%.media.r : $(MAKEDEPS) + $(call media_template_file,$*) + +# Calculate list of media rules files +# +MEDIA_RULES = $(patsubst %,$(BIN)/rules/%.media.r,$(MEDIA)) +mediarules : + @$(ECHO) $(MEDIA_RULES) + +# Evaluate media rules (or include media rules files) +# +ifdef NEED_DEPS +ifneq ($(MEDIA_RULES),) +ifneq ($(HAVE_EVAL),) +$(foreach MEDIUM,$(MEDIA),$(eval $(call media_template,$(MEDIUM)))) +else +-include $(MEDIA_RULES) +endif +endif +endif + +# Alias for ipxe.% +# +$(BIN)/etherboot.% : $(BIN)/ipxe.% + ln -sf $(notdir $<) $@ + +endif # defined(BIN) + +############################################################################### +# +# The compression utilities +# +$(NRV2B) : util/nrv2b.c $(MAKEDEPS) + $(QM)$(ECHO) " [HOSTCC] $@" + $(Q)$(HOST_CC) $(HOST_CFLAGS) -DENCODE -DDECODE -DMAIN -DVERBOSE \ + -DNDEBUG -DBITSIZE=32 -DENDIAN=0 -o $@ $< +CLEANUP += $(NRV2B) + +$(ZBIN) : util/zbin.c util/nrv2b.c $(MAKEDEPS) + $(QM)$(ECHO) " [HOSTCC] $@" + $(Q)$(HOST_CC) $(HOST_CFLAGS) -o $@ $< +CLEANUP += $(ZBIN) + +############################################################################### +# +# The EFI image converter +# +ELF2EFI_CFLAGS := -I$(BINUTILS_DIR)/include -I$(BFD_DIR)/include \ + -I$(ZLIB_DIR)/include -idirafter include +ELF2EFI_LDFLAGS := -L$(BINUTILS_DIR)/lib -L$(BFD_DIR)/lib -L$(ZLIB_DIR)/lib \ + -lbfd -ldl -liberty -lz -Wl,--no-warn-search-mismatch + +$(ELF2EFI32) : util/elf2efi.c $(MAKEDEPS) + $(QM)$(ECHO) " [HOSTCC] $@" + $(Q)$(HOST_CC) $(HOST_CFLAGS) $(ELF2EFI_CFLAGS) -DEFI_TARGET_IA32 $< \ + $(ELF2EFI_LDFLAGS) -o $@ +CLEANUP += $(ELF2EFI32) + +$(ELF2EFI64) : util/elf2efi.c $(MAKEDEPS) + $(QM)$(ECHO) " [HOSTCC] $@" + $(Q)$(HOST_CC) $(HOST_CFLAGS) $(ELF2EFI_CFLAGS) -DEFI_TARGET_X64 $< \ + $(ELF2EFI_LDFLAGS) -o $@ +CLEANUP += $(ELF2EFI64) + +$(EFIROM) : util/efirom.c $(MAKEDEPS) + $(QM)$(ECHO) " [HOSTCC] $@" + $(Q)$(HOST_CC) $(HOST_CFLAGS) -idirafter include -o $@ $< +CLEANUP += $(EFIROM) + +$(EFIFATBIN) : util/efifatbin.c $(MAKEDEPS) + $(QM)$(ECHO) " [HOSTCC] $@" + $(Q)$(HOST_CC) $(HOST_CFLAGS) -idirafter include -o $@ $< +CLEANUP += $(EFIFATBIN) + +############################################################################### +# +# The ICC fixup utility +# +$(ICCFIX) : util/iccfix.c $(MAKEDEPS) + $(QM)$(ECHO) " [HOSTCC] $@" + $(Q)$(HOST_CC) $(HOST_CFLAGS) -idirafter include -o $@ $< +CLEANUP += $(ICCFIX) + +############################################################################### +# +# The error usage information utility +# +$(EINFO) : util/einfo.c $(MAKEDEPS) + $(QM)$(ECHO) " [HOSTCC] $@" + $(Q)$(HOST_CC) $(HOST_CFLAGS) -idirafter include -o $@ $< +CLEANUP += $(EINFO) + +############################################################################### +# +# Local configs +# +CONFIG_HEADERS := $(patsubst config/%,%,$(wildcard config/*.h)) +CONFIG_LOCAL_HEADERS := $(foreach HEADER,$(CONFIG_HEADERS),\ + config/local/$(HEADER)) + +$(CONFIG_LOCAL_HEADERS) : + $(Q)$(TOUCH) $@ + +.PRECIOUS : $(CONFIG_LOCAL_HEADERS) + +ifneq ($(CONFIG),) + +CONFIG_LOCAL_NAMED_HEADERS := $(foreach HEADER,$(CONFIG_HEADERS),\ + config/local/$(CONFIG)/$(HEADER)) + +$(CONFIG_LOCAL_NAMED_HEADERS) : + $(Q)$(MKDIR) -p $(dir $@) + $(Q)$(TOUCH) $@ + +.PRECIOUS : $(CONFIG_LOCAL_NAMED_HEADERS) + +endif + +############################################################################### +# +# Auto-incrementing build serial number. Append "bs" to your list of +# build targets to get a serial number printed at the end of the +# build. Enable -DBUILD_SERIAL in order to see it when the code runs. +# +BUILDSERIAL_H = config/.buildserial.h +BUILDSERIAL_NOW = config/.buildserial.now +BUILDSERIAL_NEXT = config/.buildserial.next + +$(BUILDSERIAL_NOW) $(BUILDSERIAL_NEXT) : + $(ECHO) 1 > $@ + +$(BUILDSERIAL_H) : $(BUILDSERIAL_NOW) $(BUILDSERIAL_NEXT) + $(ECHO) '#define BUILD_SERIAL_NUM $(shell cat $<)' > $@ + +ifeq ($(filter bs,$(MAKECMDGOALS)),bs) +$(shell diff -q $(BUILDSERIAL_NOW) $(BUILDSERIAL_NEXT) > /dev/null || \ + cp -f $(BUILDSERIAL_NEXT) $(BUILDSERIAL_NOW)) +endif + +bs : $(BUILDSERIAL_NOW) + @$(ECHO) $$(( $(shell cat $<) + 1 )) > $(BUILDSERIAL_NEXT) + @$(ECHO) "Build serial number is $(shell cat $<)" + +############################################################################### +# +# Build the TAGS file(s) for emacs +# +TAGS : + ctags -e -R -f $@ --exclude=bin + +CLEANUP += TAGS + +############################################################################### +# +# Force rebuild for any given target +# +%.rebuild : + rm -f $* + $(Q)$(MAKE) $* + +############################################################################### +# +# Symbol table checks +# + +ifdef BIN + +SYMTAB = $(BIN)/symtab +$(SYMTAB) : $(BLIB) + $(OBJDUMP) -w -t $< > $@ + +CLEANUP += $(BIN)/symtab + +symcheck : $(SYMTAB) + $(PERL) $(SYMCHECK) $< + +endif # defined(BIN) + +############################################################################### +# +# Build bochs symbol table +# + +ifdef BIN + +$(BIN)/%.bxs : $(BIN)/%.tmp + $(NM) $< | cut -d" " -f1,3 > $@ + +endif # defined(BIN) + +############################################################################### +# +# Documentation +# + +ifdef BIN + +$(BIN)/doxygen.cfg : doxygen.cfg $(MAKEDEPS) + $(Q)$(PERL) -pe 's{\@SRCDIRS\@}{$(SRCDIRS)}; ' \ + -e 's{\@INCDIRS\@}{$(filter-out .,$(INCDIRS))}; ' \ + -e 's{\@BIN\@}{$(BIN)}; ' \ + -e 's{\@ARCH\@}{$(ARCH)}; ' \ + $< > $@ + +$(BIN)/doc : $(BIN)/doxygen.cfg + $(Q)$(DOXYGEN) $< + +.PHONY : $(BIN)/doc + +doc : $(BIN)/doc + +doc-clean : + $(Q)$(RM) -r $(BIN)/doc + +VERYCLEANUP += $(BIN)/doc + +docview : + @[ -f $(BIN)/doc/html/index.html ] || $(MAKE) $(BIN)/doc + @if [ -n "$$BROWSER" ] ; then \ + ( $$BROWSER $(BIN)/doc/html/index.html & ) ; \ + else \ + $(ECHO) "Documentation index in $(BIN)/doc/html/index.html" ; \ + fi + +endif # defined(BIN) + +############################################################################### +# +# Keyboard maps +# + +hci/keymap/keymap_%.c : + $(Q)$(PERL) $(GENKEYMAP) $* > $@ + +############################################################################### +# +# Force deletion of incomplete targets +# + +.DELETE_ON_ERROR : + +############################################################################### +# +# Clean-up +# + +ifeq ($(NUM_BINS),0) +ALLBINS := bin{,-*} +CLEANUP := $(patsubst $(BIN)/%,$(ALLBINS)/%,$(CLEANUP)) +VERYCLEANUP := $(patsubst $(BIN)/%,$(ALLBINS)/%,$(VERYCLEANUP)) +endif + +clean : + $(RM) $(CLEANUP) + +veryclean : clean + $(RM) -r $(VERYCLEANUP) diff --git a/net/discovery/console.h b/net/discovery/console.h new file mode 100644 index 0000000..426ac93 --- /dev/null +++ b/net/discovery/console.h @@ -0,0 +1 @@ +#undef CONSOLE_EFI diff --git a/net/discovery/efi_discovery_prefix.c b/net/discovery/efi_discovery_prefix.c new file mode 100644 index 0000000..c799072 --- /dev/null +++ b/net/discovery/efi_discovery_prefix.c @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2009 Michael Brown . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_EXIT_BUFFER_SIZE 256 + +/** + * Close all open net devices + * + * Called before a fresh boot attempt in order to free up memory. We + * don't just close the device immediately after the boot fails, + * because there may still be TCP connections in the process of + * closing. + */ +static void close_all_netdevs ( void ) { + struct net_device *netdev; + + for_each_netdev ( netdev ) { + ifclose ( netdev ); + } +} + +static struct uri* try_getting_next_server ( struct net_device *netdev ) { + struct uri *filename; + + /* Close all other network devices */ + close_all_netdevs(); + + /* Open device and display device status */ + if ( ifopen ( netdev ) != 0 ) + goto err_ifopen; + ifstat ( netdev ); + + /* Configure device */ + if (ifconf ( netdev, NULL )!= 0 ) + goto err_dhcp; + route(); + + /* Fetch next server and filename */ + filename = fetch_next_server_and_filename ( NULL ); + if ( ! filename ) + goto err_filename; + if ( ! uri_has_path ( filename ) ) { + /* Ignore empty filename */ + uri_put ( filename ); + filename = NULL; + } + + return filename; + err_filename: + err_dhcp: + err_ifopen: + return NULL; +} + + +static struct uri* efi_discover ( void ) { + struct net_device *netdev; + + struct uri* filename = NULL; + + for_each_netdev ( netdev ) { + filename = try_getting_next_server ( netdev ); + } + + return filename; +} + +/** + * EFI entry point + * + * @v image_handle Image handle + * @v systab System table + * @ret efirc EFI return status code + */ +EFI_STATUS EFIAPI _efi_discovery_start ( EFI_HANDLE image_handle, + EFI_SYSTEM_TABLE *systab ) { + EFI_STATUS efirc; + struct uri* filename; + userptr_t user_buf; + wchar_t* exit_buf; + + /* Initialise EFI environment */ + if ( ( efirc = efi_init ( image_handle, systab ) ) != 0 ) + goto err_init; + + if ( ( user_buf = umalloc(MAX_EXIT_BUFFER_SIZE*2) ) == 0) + { + efirc = EFI_OUT_OF_RESOURCES; + goto err_init; + } + + exit_buf = (wchar_t *)user_to_phys(user_buf,0); + + initialise(); + startup(); + + if ( ( filename = efi_discover() ) == NULL) + { + efirc = EFI_NOT_FOUND; + goto err_filename; + } + + efi_snp_release(); + efi_loaded_image->Unload ( image_handle ); + efi_driver_reconnect_all(); + + efi_snprintf(exit_buf,MAX_EXIT_BUFFER_SIZE,"%s - %s", filename->host, filename->path); + uri_put(filename); + + systab->BootServices->Exit(image_handle, efirc, MAX_EXIT_BUFFER_SIZE, (CHAR16 *) exit_buf); + + err_filename: + err_init: + systab->BootServices->Exit(image_handle, efirc, 0, NULL); + return efirc; +} + +/** + * Probe EFI root bus + * + * @v rootdev EFI root device + */ +static int efi_probe ( struct root_device *rootdev __unused ) { + + return efi_driver_connect_all(); +} + +/** + * Remove EFI root bus + * + * @v rootdev EFI root device + */ +static void efi_remove ( struct root_device *rootdev __unused ) { + + efi_driver_disconnect_all(); +} + +/** EFI root device driver */ +static struct root_driver efi_root_driver = { + .probe = efi_probe, + .remove = efi_remove, +}; + +/** EFI root device */ +struct root_device efi_root_device __root_device = { + .dev = { .name = "EFI" }, + .driver = &efi_root_driver, +}; -- 2.39.2