From 1b0f3128348ee696be10fba421d70ab674773b93 Mon Sep 17 00:00:00 2001 From: PoliEcho Date: Tue, 12 Aug 2025 22:52:56 +0200 Subject: [PATCH] why doesnt it work :((( --- UEFI_fireworks.dec | 2 +- UEFI_fireworks.dsc | 3 +- build.sh | 6 ++- src/UEFI_fireworks/UEFI_fireworks.inf | 4 +- src/UEFI_fireworks/UefiMain.c | 66 ++++++++++++++++++++++----- src/UEFI_fireworks/drawing.c | 10 ++-- src/UEFI_fireworks/macros.h | 2 + src/UEFI_fireworks/types.h | 4 +- test.sh | 6 ++- 9 files changed, 78 insertions(+), 25 deletions(-) diff --git a/UEFI_fireworks.dec b/UEFI_fireworks.dec index 6713129..2a12346 100644 --- a/UEFI_fireworks.dec +++ b/UEFI_fireworks.dec @@ -16,7 +16,7 @@ DevicePathLib|edk2/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf UefiBootServicesTableLib|edk2/MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf UefiRuntimeServicesTableLib|edk2/MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf - DebugLib|edk2/MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf + DebugLib|edk2/MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf PrintLib|edk2/MdePkg/Library/BasePrintLib/BasePrintLib.inf PcdLib|edk2/MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf RegisterFilterLib|edk2/MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.inf diff --git a/UEFI_fireworks.dsc b/UEFI_fireworks.dsc index 0387352..c194651 100644 --- a/UEFI_fireworks.dsc +++ b/UEFI_fireworks.dsc @@ -24,7 +24,8 @@ RegisterFilterLib|edk2/MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNul StackCheckLib|edk2/MdePkg/Library/StackCheckLibNull/StackCheckLibNull.inf TimerLib|edk2/MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf IoLib|edk2/MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf - +RngLib|edk2/MdePkg/Library/BaseRngLib/BaseRngLib.inf +SerialPortLib|edk2/MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf [Components] diff --git a/build.sh b/build.sh index 9c3028f..188b152 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,9 @@ #!/bin/bash export PACKAGES_PATH=$PWD:$PWD/edk2 -build -a X64 -t GCC5 -p UEFI_fireworks.dsc +if [ "$1" == "debug" ]; then + build -a X64 -t GCC5 -p UEFI_fireworks.dsc -b DEBUG +else + build -a X64 -t GCC5 -p UEFI_fireworks.dsc +fi mkdir -p build cp edk2/Build/UEFI_fireworks/DEBUG_GCC5/X64/UEFI_fireworks.efi build/ diff --git a/src/UEFI_fireworks/UEFI_fireworks.inf b/src/UEFI_fireworks/UEFI_fireworks.inf index 547cfd2..1daca44 100644 --- a/src/UEFI_fireworks/UEFI_fireworks.inf +++ b/src/UEFI_fireworks/UEFI_fireworks.inf @@ -25,9 +25,11 @@ DebugLib PrintLib TimerLib + RngLib + SerialPortLib [Protocols] - + gEfiRngProtocolGuid [Guids] [Pcd] diff --git a/src/UEFI_fireworks/UefiMain.c b/src/UEFI_fireworks/UefiMain.c index 1f523f4..5de99a3 100644 --- a/src/UEFI_fireworks/UefiMain.c +++ b/src/UEFI_fireworks/UefiMain.c @@ -1,3 +1,4 @@ +#include "Library/UefiApplicationEntryPoint.h" #include "ProcessorBind.h" #include "drawing.h" #include "global.h" @@ -5,7 +6,10 @@ #include "types.h" #include #include +#include #include +#include +#include #include #include #include @@ -38,20 +42,58 @@ EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE imgHandle, clear_screen(GraphicsOutput); - struct firework_instance firework = {500, - 500, - 100, - {0, 0, 0}, - {COLOR_FROM_HEX(0xff0000), - COLOR_FROM_HEX(0x00ff00), - COLOR_FROM_HEX(0x0000ff)}, - 0}; - while (step_firework(&firework)) { - MicroSecondDelay(50000); - } - LIST_ENTRY firework_list; InitializeListHead(&firework_list); + if (SerialPortInitialize() == RETURN_SUCCESS) { + SERIAL_PRINT("Serial initialized"); + } else { + Print(L"Failed to initialize Serial"); + Exit(RETURN_DEVICE_ERROR); + } + while (TRUE) { + UINT32 random; + GetRandomNumber32(&random); + if (random % 6 == 0) { + // spawn new firework + firework_node *new_firework_node = + AllocateZeroPool(sizeof(firework_node)); + if (new_firework_node == NULL) { + return EFI_OUT_OF_RESOURCES; + } + new_firework_node->Signature = FIREWORK_NODE_SIGNATURE; + GetRandomNumber32(&random); + new_firework_node->Firework.max_r = + random % 501; // so max number can be 500 + for (UINT8 i = 0; i < ARRAY_SIZE(new_firework_node->Firework.color); + i++) { + GetRandomNumber32( + (UINT32 *)&new_firework_node->Firework.color[i]); // belive + new_firework_node->Firework.r[i] = 0; + } + new_firework_node->Firework.cleanup_r = 0; + GetRandomNumber32(&random); + new_firework_node->Firework.x = + random % GraphicsOutput->Mode->Info->HorizontalResolution + 1; + GetRandomNumber32(&random); + new_firework_node->Firework.y = + random % GraphicsOutput->Mode->Info->VerticalResolution + 1; + + InsertTailList(&firework_list, &new_firework_node->Link); + } + + firework_node *current_node = NULL; + for (LIST_ENTRY *node = GetFirstNode(&firework_list); + !IsNodeAtEnd(&firework_list, node); + node = GetNextNode(&firework_list, node)) { + // Print(L"Processing firework\r\n"); + + current_node = CR(node, firework_node, Link, FIREWORK_NODE_SIGNATURE); + if (!step_firework(¤t_node->Firework)) { + RemoveEntryList(node); // remove if firework ended + } + } + MicroSecondDelay(500000); + } return EFI_SUCCESS; } diff --git a/src/UEFI_fireworks/drawing.c b/src/UEFI_fireworks/drawing.c index bd92ef7..35a7d69 100644 --- a/src/UEFI_fireworks/drawing.c +++ b/src/UEFI_fireworks/drawing.c @@ -11,12 +11,10 @@ void draw_pixel(const UINT32 x, const UINT32 y, const EFI_GRAPHICS_OUTPUT_BLT_PIXEL pixel) { UINTN framebuffer_offset = (y * GraphicsOutput->Mode->Info->PixelsPerScanLine) + x; - if (framebuffer_offset >= GraphicsOutput->Mode->FrameBufferSize) { - Print(L"Atepted out of bounds write to framebuffer\r\n"); - Exit(RETURN_WARN_BUFFER_TOO_SMALL); + if (framebuffer_offset < + GraphicsOutput->Mode->FrameBufferSize) { // ignre when out of bounds + framebuffer[framebuffer_offset] = pixel; } - - framebuffer[framebuffer_offset] = pixel; } // uses Mid-Point Circle Drawing Algorithm @@ -87,7 +85,7 @@ void clear_screen() { BOOLEAN step_firework(struct firework_instance *firework) { for (UINT8 i = 0; i < ARRAY_SIZE(firework->r); i++) { if (firework->r[i] < firework->max_r) { - if (i == 0 || (firework->max_r / 3) * i <= firework->r[i - 1]) { + if (i == 0 || (firework->max_r / 3.5) * i <= firework->r[i - 1]) { draw_circle(firework->x, firework->y, firework->r[i], firework->color[i]); firework->r[i]++; diff --git a/src/UEFI_fireworks/macros.h b/src/UEFI_fireworks/macros.h index b93b142..0b4bb70 100644 --- a/src/UEFI_fireworks/macros.h +++ b/src/UEFI_fireworks/macros.h @@ -4,3 +4,5 @@ .Green = ((hex) >> 8) & 0xFF, \ .Red = ((hex) >> 16) & 0xFF, \ .Reserved = 0} + +#define SERIAL_PRINT(str) SerialPortWrite((UINT8 *)str, AsciiStrLen(str)) \ No newline at end of file diff --git a/src/UEFI_fireworks/types.h b/src/UEFI_fireworks/types.h index 3238ade..7404067 100644 --- a/src/UEFI_fireworks/types.h +++ b/src/UEFI_fireworks/types.h @@ -11,9 +11,9 @@ struct firework_instance { UINT16 cleanup_r; }; -struct firework_node { +typedef struct { UINTN Signature; struct firework_instance Firework; LIST_ENTRY Link; -}; +} firework_node; #define FIREWORK_NODE_SIGNATURE SIGNATURE_32('f', 'w', 'r', 'k') \ No newline at end of file diff --git a/test.sh b/test.sh index ae6df10..8e7c18e 100755 --- a/test.sh +++ b/test.sh @@ -6,5 +6,9 @@ qemu-system-x86_64 \ -machine type=q35,accel=kvm \ -drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd \ -drive if=pflash,format=raw,file=./my_ovmf_vars.fd \ - -hda fat:rw:$(dirname build/UEFI_fireworks.efi) + -hda fat:rw:$(dirname build/UEFI_fireworks.efi) \ + -smp 4 \ + -s \ + -serial mon:stdio + rm ./my_ovmf_vars.fd