From db4ef063dc8b2158f858c1aa513d78824329c93c Mon Sep 17 00:00:00 2001 From: rtos-devbox Date: Sun, 17 Dec 2023 15:54:38 +0000 Subject: [PATCH] what --- Makefile | 102 ++++++++++++++---------------- build_toolchain.sh | 5 +- image/NvVars | Bin 0 -> 9724 bytes image/efi/boot/BOOTx64.EFI | Bin 0 -> 54984 bytes novos_x64.img | Bin 0 -> 1474560 bytes serial.log | 122 +++++++++++++++++++++++++++++++++++- src/arch/x86_64/c/efimain.c | 33 ++++++++++ 7 files changed, 202 insertions(+), 60 deletions(-) create mode 100644 image/NvVars create mode 100644 image/efi/boot/BOOTx64.EFI create mode 100644 novos_x64.img create mode 100644 src/arch/x86_64/c/efimain.c diff --git a/Makefile b/Makefile index c1270d4..789f65f 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -ARCH = x86 -SUBSYSTEM = 10 +ARCH = x64 +SUBSYSTEM = 10 ifeq ($(shell uname -m),x86_64) MINGW_HOST = w64 @@ -12,22 +12,22 @@ ifeq ($(ARCH),x64) GCC_ARCH = x86_64 QEMU_ARCH = x86_64 FW_BASE = OVMF - CROSS_COMPILE = $(GCC_ARCH)-$(MINGW_HOST)-mingw32- + #CROSS_COMPILE = $(GCC_ARCH)-$(MINGW_HOST)-mingw32- + CROSS_COMPILE = EP_PREFIX = C_FLAGS = -m64 -mno-red-zone - LD_FLAGS = -Wl,-dll -Wl,--subsystem,$(SUBSYSTEM) + LD_FLAGS = -Wl,-dll #-Wl,--subsystem,$(SUBSYSTEM) endif CC := $(CROSS_COMPILE)gcc -OBJCOPY := $(CROSS_COMPILE)objcopy AS := $(CROSS_COMPILE)as -LK := $(CROSS_COMPILE)gcc +LD := $(CROSS_COMPILE)gcc OC := $(CROSS_COMPILE)objcopy -CC_DIR = src/arch/$(ARCH)/c -INC_DIR = src/arch/$(ARCH)/h -AS_DIR = src/arch/$(ARCH)/s -OBJ_DIR = bin/arch/$(ARCH)/o +CC_DIR = src/arch/$(GCC_ARCH)/c +INC_DIR = src/arch/$(GCC_ARCH)/h +AS_DIR = src/arch/$(GCC_ARCH)/s +OBJ_DIR = bin/arch/$(GCC_ARCH)/o GNUEFI_DIR = ../gnu-efi @@ -37,33 +37,32 @@ C_DEFS = -DCONFIG_$(GNUEFI_ARCH) -D__MAKEWITH_GNUEFI -DGNU_EFI_USE_MS_ABI LD_FLAGS += -s -Wl,-Bsymbolic -nostdlib -shared LD_LIB += -L$(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib -e $(EP_PREFIX)efi_main -LIBS = -lefi $(CRT0_LIBS) +LIBS = -lefi -lgnuefi +QEMU = qemu-system-$(QEMU_ARCH) +#LK_DOC = $(GNU_EFI_DIR)/gnuefi/elf_x86_64_efi.lds +#LK_DOC = linker.ld +#LK_FLAGS = -nostdlib -shared,-T,$(LK_DOC) -Wl,-Bsymbolic -Wl,-znocombreloc +#LIB_SEARCH = -L$(GNU_EFI_DIR)/x86_64/lib -L$(GNU_EFI_DIR)/x86_64/gnuefi -LK_DOC = $(GNU_EFI_DIR)/gnuefi/elf_x86_64_efi.lds -LK_DOC = linker.ld -LK_FLAGS = -nostdlib -shared,-T,$(LK_DOC) -Wl,-Bsymbolic -Wl,-znocombreloc -LIB_SEARCH = -L$(GNU_EFI_DIR)/x86_64/lib -L$(GNU_EFI_DIR)/x86_64/gnuefi +CC_FILES_IN := $(wildcard $(CC_DIR)/*.c) +AS_FILES_IN := $(wildcard $(AS_DIR)/*.s) -CC_FILES_IN := $(wildcard $(CC_DIR)/*.c) -AS_FILES_IN := $(wildcard $(AS_DIR)/*.s) +CC_FILES_OUT = $(patsubst $(CC_DIR)/%.c, $(OBJ_DIR)/%.o, $(CC_FILES_IN)) +AS_FILES_OUT = $(patsubst $(AS_DIR)/%.s, $(OBJ_DIR)/%.o, $(AS_FILES_IN)) -CC_FILES_OUT=$(patsubst $(CC_DIR)/%.c, $(OBJ_DIR)/%.o, $(CC_FILES_IN)) -AS_FILES_OUT=$(patsubst $(AS_DIR)/%.s, $(OBJ_DIR)/%.o, $(AS_FILES_IN)) +BIN = novos_$(ARCH) +BIN_OUT = bin/$(BIN) +EFI_OUT = bin/arch/$(GCC_ARCH)/BOOT$(ARCH).EFI -BIN = novos -BIN_OUT = bin/$(BIN) -EFI_OUT = bin/arch/$(ARCH)/BOOTX64.EFI +ISO = $(BIN_OUT).iso +FAT_IMG = $(BIN_OUT).img -ISO = $(BIN_OUT).iso -FAT_IMG = $(BIN_OUT).img +OVMF_DIR = OVMF +OVMF_FIRMWARE = $(OVMF_DIR)/OVMF-pure-efi.fd -OVMF_DIR = OVMF - -QEMU_DRIVER = $(OVMF_DIR)/OVMF-pure-efi.fd -OVMF_CODE = $(OVMF_DIR)/OVMF_CODE-pure-efi.fd -OVMF_VARS = $(OVMF_DIR)/OVMF_VARS-pure-efi.fd +all: $(EFI_OUT) obj_dir: @[ -d $(OBJ_DIR) ] || mkdir $(OBJ_DIR) -p @@ -72,21 +71,26 @@ $(OBJ_DIR)/%.o: $(CC_DIR)/%.c obj_dir @echo Compiling $<... @$(CC) $(C_FLAGS) $(C_INC) $(C_DEFS) -o $@ -c $< -build: $(CC_FILES_OUT) $(AS_FILES_OUT) obj_dir +$(EFI_OUT): $(CC_FILES_OUT) $(AS_FILES_OUT) obj_dir @echo Linking... - @$(LK) $(LK_FLAGS) $(LIB_SEARCH) -o $(BIN_OUT).elf $(AS_FILES_OUT) $(CC_FILES_OUT) -lgnuefi -lefi -lgcc - @$(OC) -I elf64-x86-64 -O efi-app-x86_64 $(BIN_OUT).elf $(EFI_OUT) + @$(LD) $(LD_FLAGS) $(LD_LIB) -o $(BIN_OUT).elf $(AS_FILES_OUT) $(CC_FILES_OUT) $(LIBS) + #@$(OC) -I elf64-x86-64 -O efi-app-x86_64 $(BIN_OUT).elf $(EFI_OUT) + @mkdir -p bin/arch/$(GCC_ARCH) + @$(OC) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel* -j .rela* -j .reloc -j .eh_frame -O binary $(BIN_OUT).elf $(EFI_OUT) @echo Link success. - -fat: build +$(FAT_IMG): $(EFI_OUT) @echo Building FAT image... - @dd if=/dev/zero of=$(FAT_IMG) bs=1k count=1440 - @mformat -i $(FAT_IMG) -f 1440 :: - @mmd -i $(FAT_IMG) ::/EFI - @mmd -i $(FAT_IMG) ::/EFI/BOOT - @mcopy -i $(FAT_IMG) $(EFI_OUT) ::/EFI/BOOT - @cp $(FAT_IMG) $(BIN).img + @dd if=/dev/zero of=$@ bs=1k count=1440 + @mformat -i $@ -f 1440 :: + @mmd -i $@ ::/EFI + @mmd -i $@ ::/EFI/BOOT + @mcopy -i $@ $(EFI_OUT) ::/EFI/BOOT + @cp $@ $(BIN).img + + @mkdir -p image/efi/boot + @cp -f $(EFI_OUT) image/efi/boot/BOOT$(ARCH).EFI + @echo Done. harddrive: fat @@ -101,19 +105,5 @@ clean: @rm -f $(BIN).bin @echo Cleaned. -emulate: fat - #qemu-system-i386 -bios $(OVMF_FLASH) -hda $(BIN).bin -serial file:serial.log - - #qemu-system-i386 -machine q35 -m 256 -smp 2 -net none \ - #-global driver=$(QEMU_DRIVER),property=secure,value=on \ - #-drive if=pflash,format=raw,unit=0,file=$(OVMF_CODE),readonly=on \ - #-drive if=pflash,format=raw,unit=1,file=$(OVMF_VARS) \ - #-drive if=ide,format=raw,file=$(BIN).img - - #qemu-system-x86_64 -machine q35 -m 256 -smp 2 -net none \ - #-global driver=$(QEMU_DRIVER),property=secure,value=on \ - #-drive if=pflash,format=raw,unit=0,file=$(OVMF_CODE),readonly=on \ - #-drive if=pflash,format=raw,unit=1,file=$(OVMF_VARS) \ - #-drive if=ide,format=raw,file=$(BIN).img - - qemu-system-x86_64 -pflash $(QEMU_DRIVER) -drive if=ide,format=raw,file=$(BIN).img -net none -serial file:serial.log \ No newline at end of file +emulate: $(FAT_IMG) + $(QEMU) $(QEMU_FLAGS) -bios $(OVMF_FIRMWARE) -net none -hda fat:rw:image -serial file:serial.log \ No newline at end of file diff --git a/build_toolchain.sh b/build_toolchain.sh index a93eddb..11005de 100755 --- a/build_toolchain.sh +++ b/build_toolchain.sh @@ -8,12 +8,13 @@ make cd .. -export TARGET=x86_64-elf +export TARGET=x86_64-w64-mingw32 export TARGETS=$TARGET,x86_64-pe export PREFIX=/opt/cross/$TARGET export PATH="$PREFIX/bin:$PATH" +rm -fr build-binutils mkdir build-binutils cd build-binutils ../binutils-*/configure --target=$TARGET --enable-targets=$TARGETS --prefix="$PREFIX" --with-sysroot --disable-nls @@ -22,6 +23,7 @@ sudo make install cd .. +rm -fr build-gcc mkdir build-gcc cd build-gcc ../gcc-*/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers @@ -30,5 +32,4 @@ make all-target-libgcc sudo make install-gcc sudo make install-target-libgcc - echo "prefix is $PREFIX" \ No newline at end of file diff --git a/image/NvVars b/image/NvVars new file mode 100644 index 0000000000000000000000000000000000000000..51582b7c29d83798e2c0da38204c921a8650938d GIT binary patch literal 9724 zcmeH}X;4#F6vrPBEEv>00YyXwltmT^`>Gfa&=dkLAYiLh!2(u6C}n_ZUO)=NCZM%| z3Q-m%q9UbggBu{t;HabtsNh1hAa$fpP*9K&n$A5>n2a<1)DN9`%#d?`_ndd`J^y>= z-G^b+AEf}L0Hpw>0Hpw>0Hpw>0Hpw>!2ewVhEf3|6O(cOOvzP|Lmm8U)zDxDupaPC zVA9e_KiJQ}hC;jsuy{5aXaehjT?`hM$Hpene#&9~zcw$h1dnZ46({RSWp7=MS*w$+ zP0~Ehqrj6E{ln37hi_?!Rd*caG6S>fBHAZLdN>YA<&U=~m-y!CjAYKQF%f8m1)F)q zz4t1wsuXVW=rKuNp}Vd}Khp2g$<&F7?yb3&(y;vC-(Ikf>b?%6m0Eab(Yx@n zK&;TrvpGOS-xw8EIfqrx2tO+twA>ywBLRE)btzl;PTJ~b@O}I8-flM)pM1Xyqg?L5 z?4UQ1I`WLGrTsoXXPn=m{@}%PiGMfiqGPyEdT3|Awu9jD06xF%dLw)F^~*D91w)g4 zT}Br#92=@;Wzf5ItzrZ+JL}^wv#q6g**vuV8r=`C5C3GvE?v>z)M5C?VOu3XQ;BVq zxb3}d2d71XXTHJs?W@||S+4?A2kfQz@fb`)#Cua=o@mj$WK@C+KS%z1eBHByxgBhN zqIl83e(P+y=vCc(?J5c8r((=E+A z@hkf?Q;;+jQ zf1|%s@TAtO@X=Bi_L1?_Ct_lKY*1U}*e_fu-o#hzFDAj=wNNM@ir(ra;C2hf7N(!z zGarPc?w|5AcC4J;7pGtzTEAiI9_K!$6c_d*F1nK~_vK6Q0xy&=Z&&!e{=M>mT1~m6 z)H1wQdf)FMZ$eR@BdX`np3Rz`yA|=SD85*Uf8SlFEl%vj>vv%S?CS1;^0}`rIQ8&Y zMWeK;V&|QwG8>xRb#v0$g6jeMw8!nDTtv)WMU|a+nLEmFw@$CE`r$+0YT<2q&oLdx z$uCl4yZ?+26!s*YVVd04u}V&5Jnd4%`=a58(NyCi!1gv?T@$7XDj?J z$d5IQ_+O5$_Aei7Smha{TESZ;d_QdO)F<2g+B( z91QXQQNf;wjkj=)ghfv2d9J`f*NSW9SH7vld_iDr_TKdlcj-cfKM=(yEK56;{;Yy? z(x>Idv$QMCMoQ1OB!BB7ikZsSti&g57jD@;ZGFzQ6tx-m_j%Vl|8?2sQbLtcS-bii zk%XPI&9T?sdt|ZUssp)pybWs$ZwKph*j$4mrStx(w=ehBAqg&+g~>|PEc3W3G>kim z{%N0h8Ol08F*$82!U#c-DNGtG*=ey#L*gG+Q9-k-S0bwdFKR=Q;XRL$44V|Mf_S)4 zWFClBAz!>ZVl`kU$&jBxGUOM#K|JKICmHe=k_;DCJjrlD)w{y;TF5fIfoCCGxEdHP zrb03vF03Gu;T~hUK>S=}86?BSNY+my>-9u&G^kJR3{2JsdeKPzNI%q953COP7{FX$ zxf9B#{A<=A^0T<9=-(%6<5p0LJ z2n^*CVqhqj7zT!N2}T}z9?B({z;K+z24MKUAa(-7_XR-!!*LOOU^ot<1(=SOA!NW> zz@xy>4#doSyc;llPZ1%&IQaJfLwgVhfVIJY1Xu^S9#|Jx3_K5520S15 zEikkzp;dq!3&76=)(4INUI=^`*Z}x6@Dkt_U_)RTuo1AvK{PN1W&$q-4h4pOz~X_S zA22>J^aCaahJL`XLX-&l0doO{e!wDt$?wf;M1& literal 0 HcmV?d00001 diff --git a/image/efi/boot/BOOTx64.EFI b/image/efi/boot/BOOTx64.EFI new file mode 100644 index 0000000000000000000000000000000000000000..a8c8df11522783876421cac1d340f2ad2b3095af GIT binary patch literal 54984 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 literal 0 HcmV?d00001 diff --git a/novos_x64.img b/novos_x64.img new file mode 100644 index 0000000000000000000000000000000000000000..39562054092a538f0e3087bfe8e44dfec778c9c7 GIT binary patch literal 1474560 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 zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFz_1)?KLk3 literal 0 HcmV?d00001 diff --git a/serial.log b/serial.log index 1e4c62c..cb8e91d 100644 --- a/serial.log +++ b/serial.log @@ -7,9 +7,127 @@ EDK II UEFI v2.70 (EDK II, 0x00010000) Mapping table  FS0: Alias(s):HD0a1:;BLK1: - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0x00000000,0x0,0xB40) + PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)  BLK0: Alias(s): PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)  BLK2: Alias(s): PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) -Press ESC in 5 seconds to skip startup.nsh or any other key to continue.Press ESC in 4 seconds to skip startup.nsh or any other key to continue. \ No newline at end of file +Press ESC in 5 seconds to skip startup.nsh or any other key to continue.Press ESC in 4 seconds to skip startup.nsh or any other key to continue.Press ESC in 3 seconds to skip startup.nsh or any other key to continue.Press ESC in 2 seconds to skip startup.nsh or any other key to continue.Press ESC in 1 seconds to skip startup.nsh or any other key to continue. +Shell> [=3h[=3h[=3h[=3hBdsDxe: failed to load Boot0001 "UEFI QEMU DVD-ROM QM00003 " from PciRoot(0x0)/Pci(0x1,0x1)/Ata(Secondary,Master,0x0): Not Found +BdsDxe: failed to load Boot0002 "UEFI QEMU HARDDISK QM00001 " from PciRoot(0x0)/Pci(0x1,0x1)/Ata(Primary,Master,0x0): Not Found +BdsDxe: loading Boot0003 "EFI Internal Shell" from Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1) +BdsDxe: starting Boot0003 "EFI Internal Shell" from Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1) +UEFI Interactive Shell v2.2 +EDK II +UEFI v2.70 (EDK II, 0x00010000) +Mapping table + FS0: Alias(s):HD0a1:;BLK1: + PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1) + BLK0: Alias(s): + PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) + BLK2: Alias(s): + PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) +Press ESC in 5 seconds to skip startup.nsh or any other key to continue. +Shell> gui +'gui' is not recognized as an internal or external command, operable program, or script file. +Shell> help +alias - Displays, creates, or deletes UEFI Shell aliases. +attrib - Displays or modifies the attributes of files or directories. +bcfg - Manages the boot and driver options that are stored in NVRAM. +cd - Displays or changes the current directory. +cls - Clears the console output and optionally changes the background and foreground color. +comp - Compares the contents of two files on a byte-for-byte basis. +connect - Binds a driver to a specific device and starts the driver. +cp - Copies one or more files or directories to another location. +date - Displays and sets the current date for the system. +dblk - Displays one or more blocks from a block device. +devices - Displays the list of devices managed by UEFI drivers. +devtree - Displays the UEFI Driver Model compliant device tree. +dh - Displays the device handles in the UEFI environment. +disconnect - Disconnects one or more drivers from the specified devices. +dmem - Displays the contents of system or device memory. +dmpstore - Manages all UEFI variables. +drivers - Displays the UEFI driver list. +drvcfg - Invokes the driver configuration. +drvdiag - Invokes the Driver Diagnostics Protocol. +echo - Controls script file command echoing or displays a message. +edit - Provides a full screen text editor for ASCII or UCS-2 files. +eficompress - Compresses a file using UEFI Compression Algorithm. +efidecompress - Decompresses a file using UEFI Decompression Algorithm. +else - Identifies the code executed when 'if' is FALSE. +endfor - Ends a 'for' loop. +endif - Ends the block of a script controlled by an 'if' statement. +exit - Exits the UEFI Shell or the current script. +for - Starts a loop based on 'for' syntax. +getmtc - Gets the MTC from BootServices and displays it. +goto - Moves around the point of execution in a script. +help - Displays the UEFI Shell command list or verbose command help. +hexedit - Provides a full screen hex editor for files, block devices, or memory. +http - Download a file from HTTP server. +if - Executes commands in specified conditions. +ifconfig - Modifies the default IP address of the UEFI IPv4 Network Stack. +ifconfig6 - Displays or modifies IPv6 configuration for network interface. +initrd - Registers or unregisters a file as Linux initrd. +load - Loads a UEFI driver into memory. +loadpcirom - Loads a PCI Option ROM. +ls - Lists the contents of a directory or file information. +map - Displays or defines file system mappings. +memmap - Displays the memory map maintained by the UEFI environment. +mkdir - Creates one or more new directories. +mm - Displays or modifies MEM/MMIO/IO/PCI/PCIE address space. +mode - Displays or changes the console output device mode. +mv - Moves one or more files to a destination within or between file systems. +openinfo - Displays the protocols and agents associated with a handle. +parse - Retrieves a value from a standard format output file. +pause - Pauses a script and waits for an operator to press a key. +pci - Displays PCI device list or PCI function configuration space and PCIe extended +configuration space. +ping - Ping the target host with an IPv4 stack. +ping6 - Ping a target machine with UEFI IPv6 network stack. +reconnect - Reconnects drivers to the specific device. +reset - Resets the system. +rm - Deletes one or more files or directories. +sermode - Sets serial port attributes. +set - Displays or modifies UEFI Shell environment variables. +setsize - Adjusts the size of a file. +setvar - Displays or modifies a UEFI variable. +shift - Shifts in-script parameter positions. +smbiosview - Displays SMBIOS information. +stall - Stalls the operation for a specified number of microseconds. +tftp - Download a file from TFTP server. +time - Displays or sets the current time for the system. +timezone - Displays or sets time zone information. +touch - Updates the filename timestamp with the current system date and time. +type - Sends the contents of a file to the standard output device. +unload - Unloads a driver image that was already loaded. +ver - Displays UEFI Firmware version information. +vol - Displays or modifies information about a disk volume. + +Help usage:help [cmd|pattern|special] [-usage] [-verbose] [-section name][-b] +Shell> devices + T D + Y C I + P F A +CTRL E G G #P #D #C Device Name +==== = = = == == === ========================================================= + 33 R - - 0 1 5 PciRoot(0x0) + 66 D - - 2 0 0 Primary Console Input Device + 67 D - - 2 0 0 Primary Console Output Device + 68 D - - 1 0 0 Primary Standard Error Device + 9F D - - 1 0 0 PciRoot(0x0)/Pci(0x0,0x0) + A0 B - - 1 1 3 PciRoot(0x0)/Pci(0x1,0x0) + A1 B - - 1 4 2 Sata Controller + A2 D - - 1 0 0 PciRoot(0x0)/Pci(0x1,0x3) + A3 B - - 1 1 1 QEMU Video PCI Adapter + A5 B - - 1 3 1 PciRoot(0x0)/Pci(0x2,0x0)/AcpiAdr(0x80010100) + A8 B - - 1 1 1 PciRoot(0x0)/Pci(0x1,0x0)/Serial(0x0) + A9 D - - 1 0 0 PciRoot(0x0)/Pci(0x1,0x0)/Serial(0x1) + AA B - - 1 3 1 PS/2 Keyboard Device + AB B - - 1 1 1 SIO Serial Port #0 + AC B - - 1 5 3 PC-ANSI Serial Console + AD B - - 1 2 1 QEMU HARDDISK + AE D - - 1 2 0 SCSI Disk Device + AF D - - 1 2 0 FAT File System +Shell> n bcgf  fg +bcfg: Too few arguments. +Shell>  \ No newline at end of file diff --git a/src/arch/x86_64/c/efimain.c b/src/arch/x86_64/c/efimain.c new file mode 100644 index 0000000..b2755c1 --- /dev/null +++ b/src/arch/x86_64/c/efimain.c @@ -0,0 +1,33 @@ +#include +#include + +EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) +{ + EFI_STATUS Status; + EFI_INPUT_KEY Key; + + /* Store the system table for future use in other functions */ + ST = SystemTable; + const char * test = "BEANS"; + + /* Say hi */ + Status = ST->ConOut->OutputString(ST->ConOut, L"Hello World\n\r"); + if (EFI_ERROR(Status)) + return Status; + + /* Now wait for a keystroke before continuing, otherwise your + message will flash off the screen before you see it. + + First, we need to empty the console input buffer to flush + out any keystrokes entered before this point */ + Status = ST->ConIn->Reset(ST->ConIn, FALSE); + if (EFI_ERROR(Status)) + return Status; + + /* Now wait until a key becomes available. This is a simple + polling implementation. You could try and use the WaitForKey + event instead if you like */ + while ((Status = ST->ConIn->ReadKeyStroke(ST->ConIn, &Key)) == EFI_NOT_READY) ; + + return Status; +} \ No newline at end of file