diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/arm/efi/init.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/arm/efi/init.c
new file mode 100644
index 00000000..06df60e2
--- /dev/null
+++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/arm/efi/init.c
@@ -0,0 +1,74 @@
+/* init.c - initialize an arm-based EFI system */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2013 Free Software Foundation, Inc.
+ *
+ * GRUB 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB 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 GRUB. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+static grub_uint64_t tmr;
+static grub_efi_event_t tmr_evt;
+
+static grub_uint64_t
+grub_efi_get_time_ms (void)
+{
+ return tmr;
+}
+
+static void
+increment_timer (grub_efi_event_t event __attribute__ ((unused)),
+ void *context __attribute__ ((unused)))
+{
+ tmr += 10;
+}
+
+void
+grub_machine_init (void)
+{
+ grub_efi_boot_services_t *b;
+
+ grub_efi_init ();
+
+ b = grub_efi_system_table->boot_services;
+
+ efi_call_5 (b->create_event, GRUB_EFI_EVT_TIMER | GRUB_EFI_EVT_NOTIFY_SIGNAL,
+ GRUB_EFI_TPL_CALLBACK, increment_timer, NULL, &tmr_evt);
+ efi_call_3 (b->set_timer, tmr_evt, GRUB_EFI_TIMER_PERIODIC, 100000);
+
+ grub_install_get_time_ms (grub_efi_get_time_ms);
+}
+
+void
+grub_machine_fini (int flags)
+{
+ grub_efi_boot_services_t *b;
+
+ if (!(flags & GRUB_LOADER_FLAG_NORETURN))
+ return;
+
+ b = grub_efi_system_table->boot_services;
+
+ efi_call_3 (b->set_timer, tmr_evt, GRUB_EFI_TIMER_CANCEL, 0);
+ efi_call_1 (b->close_event, tmr_evt);
+
+ grub_efi_fini ();
+}
diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/arm64/efi/init.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/arm64/efi/init.c
new file mode 100644
index 00000000..6224999e
--- /dev/null
+++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/arm64/efi/init.c
@@ -0,0 +1,60 @@
+/* init.c - initialize an arm-based EFI system */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2013 Free Software Foundation, Inc.
+ *
+ * GRUB 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB 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 GRUB. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+static grub_uint64_t timer_frequency_in_khz;
+
+static grub_uint64_t
+grub_efi_get_time_ms (void)
+{
+ grub_uint64_t tmr;
+ asm volatile("mrs %0, cntvct_el0" : "=r" (tmr));
+
+ return tmr / timer_frequency_in_khz;
+}
+
+
+void
+grub_machine_init (void)
+{
+ grub_uint64_t timer_frequency;
+
+ grub_efi_init ();
+
+ asm volatile("mrs %0, cntfrq_el0" : "=r" (timer_frequency));
+ timer_frequency_in_khz = timer_frequency / 1000;
+
+ grub_install_get_time_ms (grub_efi_get_time_ms);
+}
+
+void
+grub_machine_fini (int flags)
+{
+ if (!(flags & GRUB_LOADER_FLAG_NORETURN))
+ return;
+
+ grub_efi_fini ();
+}
diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/efi/init.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/efi/init.c
new file mode 100644
index 00000000..3dfdf2d2
--- /dev/null
+++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/efi/init.c
@@ -0,0 +1,84 @@
+/* init.c - generic EFI initialization and finalization */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2006,2007 Free Software Foundation, Inc.
+ *
+ * GRUB 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB 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 GRUB. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+grub_addr_t grub_modbase;
+
+void
+grub_efi_init (void)
+{
+ grub_modbase = grub_efi_modules_addr ();
+ /* First of all, initialize the console so that GRUB can display
+ messages. */
+ grub_console_init ();
+
+ /* Initialize the memory management system. */
+ grub_efi_mm_init ();
+
+ efi_call_4 (grub_efi_system_table->boot_services->set_watchdog_timer,
+ 0, 0, 0, NULL);
+
+ grub_efidisk_init ();
+}
+
+void (*grub_efi_net_config) (grub_efi_handle_t hnd,
+ char **device,
+ char **path);
+
+void
+grub_machine_get_bootlocation (char **device, char **path)
+{
+ grub_efi_loaded_image_t *image = NULL;
+ char *p;
+
+ image = grub_efi_get_loaded_image (grub_efi_image_handle);
+ if (!image)
+ return;
+ *device = grub_efidisk_get_device_name (image->device_handle);
+ if (!*device && grub_efi_net_config)
+ {
+ grub_efi_net_config (image->device_handle, device, path);
+ return;
+ }
+
+ *path = grub_efi_get_filename (image->file_path);
+ if (*path)
+ {
+ /* Get the directory. */
+ p = grub_strrchr (*path, '/');
+ if (p)
+ *p = '\0';
+ }
+}
+
+void
+grub_efi_fini (void)
+{
+ grub_efidisk_fini ();
+ grub_console_fini ();
+ grub_efi_memory_fini ();
+}
diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/i386/efi/init.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/i386/efi/init.c
new file mode 100644
index 00000000..da499aba
--- /dev/null
+++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/i386/efi/init.c
@@ -0,0 +1,44 @@
+/* init.c - initialize an x86-based EFI system */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2006,2007 Free Software Foundation, Inc.
+ *
+ * GRUB 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB 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 GRUB. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+void
+grub_machine_init (void)
+{
+ grub_efi_init ();
+ grub_tsc_init ();
+}
+
+void
+grub_machine_fini (int flags)
+{
+ if (flags & GRUB_LOADER_FLAG_NORETURN)
+ grub_efi_fini ();
+}
diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/ia64/efi/init.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/ia64/efi/init.c
new file mode 100644
index 00000000..b5ecbd09
--- /dev/null
+++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/ia64/efi/init.c
@@ -0,0 +1,75 @@
+/* init.c - initialize an ia64-based EFI system */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008 Free Software Foundation, Inc.
+ *
+ * GRUB 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB 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 GRUB. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+static grub_uint64_t divisor = 1;
+
+static grub_uint64_t
+get_itc (void)
+{
+ grub_uint64_t ret;
+ asm volatile ("mov %0=ar.itc" : "=r" (ret));
+ return ret;
+}
+
+grub_uint64_t
+grub_rtc_get_time_ms (void)
+{
+ return get_itc () / divisor;
+}
+
+void
+grub_machine_init (void)
+{
+ grub_efi_event_t event;
+ grub_uint64_t before, after;
+ grub_efi_uintn_t idx;
+ grub_efi_init ();
+
+ efi_call_5 (grub_efi_system_table->boot_services->create_event,
+ GRUB_EFI_EVT_TIMER, GRUB_EFI_TPL_CALLBACK, 0, 0, &event);
+
+ before = get_itc ();
+ efi_call_3 (grub_efi_system_table->boot_services->set_timer, event,
+ GRUB_EFI_TIMER_RELATIVE, 200000);
+ efi_call_3 (grub_efi_system_table->boot_services->wait_for_event, 1,
+ &event, &idx);
+ after = get_itc ();
+ efi_call_1 (grub_efi_system_table->boot_services->close_event, event);
+ divisor = (after - before + 5) / 20;
+ if (divisor == 0)
+ divisor = 800000;
+ grub_install_get_time_ms (grub_rtc_get_time_ms);
+}
+
+void
+grub_machine_fini (int flags)
+{
+ if (flags & GRUB_LOADER_FLAG_NORETURN)
+ grub_efi_fini ();
+}
diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/riscv/efi/init.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/riscv/efi/init.c
new file mode 100644
index 00000000..7eb1969d
--- /dev/null
+++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/kern/riscv/efi/init.c
@@ -0,0 +1,76 @@
+/* init.c - initialize a riscv-based EFI system */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2018 Free Software Foundation, Inc.
+ *
+ * GRUB 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB 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 GRUB. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+static grub_uint64_t timer_frequency_in_khz;
+
+static grub_uint64_t
+grub_efi_get_time_ms (void)
+{
+ grub_uint64_t tmr;
+
+#if __riscv_xlen == 64
+ asm volatile ("rdcycle %0" : "=r" (tmr));
+#else
+ grub_uint32_t lo, hi, tmp;
+ asm volatile (
+ "1:\n"
+ "rdcycleh %0\n"
+ "rdcycle %1\n"
+ "rdcycleh %2\n"
+ "bne %0, %2, 1b"
+ : "=&r" (hi), "=&r" (lo), "=&r" (tmp));
+ tmr = ((grub_uint64_t)hi << 32) | lo;
+#endif
+
+ return tmr / timer_frequency_in_khz;
+}
+
+void
+grub_machine_init (void)
+{
+ grub_uint64_t time_before, time_after;
+
+ grub_efi_init ();
+
+ /* Calculate timer frequency */
+ timer_frequency_in_khz = 1;
+ time_before = grub_efi_get_time_ms();
+ grub_efi_stall(1000);
+ time_after = grub_efi_get_time_ms();
+ timer_frequency_in_khz = time_after - time_before;
+
+ grub_install_get_time_ms (grub_efi_get_time_ms);
+}
+
+void
+grub_machine_fini (int flags)
+{
+ if (!(flags & GRUB_LOADER_FLAG_NORETURN))
+ return;
+
+ grub_efi_fini ();
+}
diff --git a/GRUB2/MOD_SRC/grub-2.04/include/grub/loader.h b/GRUB2/MOD_SRC/grub-2.04/include/grub/loader.h
new file mode 100644
index 00000000..7f82a499
--- /dev/null
+++ b/GRUB2/MOD_SRC/grub-2.04/include/grub/loader.h
@@ -0,0 +1,78 @@
+/* loader.h - OS loaders */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2003,2004,2006,2007,2009 Free Software Foundation, Inc.
+ *
+ * GRUB 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB 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 GRUB. If not, see .
+ */
+
+#ifndef GRUB_LOADER_HEADER
+#define GRUB_LOADER_HEADER 1
+
+#include
+#include
+#include
+#include
+
+/* Check if a loader is loaded. */
+int EXPORT_FUNC (grub_loader_is_loaded) (void);
+
+/* Set loader functions. */
+enum
+{
+ GRUB_LOADER_FLAG_NORETURN = 1,
+ GRUB_LOADER_FLAG_PXE_NOT_UNLOAD = 2,
+};
+
+void EXPORT_FUNC (grub_loader_set) (grub_err_t (*boot) (void),
+ grub_err_t (*unload) (void),
+ int flags);
+
+/* Unset current loader, if any. */
+void EXPORT_FUNC (grub_loader_unset) (void);
+
+/* Call the boot hook in current loader. This may or may not return,
+ depending on the setting by grub_loader_set. */
+grub_err_t grub_loader_boot (void);
+
+/* The space between numbers is intentional for the simplicity of adding new
+ values even if external modules use them. */
+typedef enum {
+ /* A preboot hook which can use everything and turns nothing off. */
+ GRUB_LOADER_PREBOOT_HOOK_PRIO_NORMAL = 400,
+ /* A preboot hook which can't use disks and may stop disks. */
+ GRUB_LOADER_PREBOOT_HOOK_PRIO_DISK = 300,
+ /* A preboot hook which can't use disks or console and may stop console. */
+ GRUB_LOADER_PREBOOT_HOOK_PRIO_CONSOLE = 200,
+ /* A preboot hook which can't use disks or console, can't modify memory map
+ and may stop memory services or finalize memory map. */
+ GRUB_LOADER_PREBOOT_HOOK_PRIO_MEMORY = 100,
+} grub_loader_preboot_hook_prio_t;
+
+/* Register a preboot hook. */
+struct grub_preboot;
+
+struct grub_preboot *EXPORT_FUNC(grub_loader_register_preboot_hook) (grub_err_t (*preboot_func) (int noret),
+ grub_err_t (*preboot_rest_func) (void),
+ grub_loader_preboot_hook_prio_t prio);
+
+/* Unregister given preboot hook. */
+void EXPORT_FUNC (grub_loader_unregister_preboot_hook) (struct grub_preboot *hnd);
+
+#ifndef GRUB_MACHINE_EMU
+void grub_boot_init (void);
+void grub_boot_fini (void);
+#endif
+
+#endif /* ! GRUB_LOADER_HEADER */