From ef8fe6eb1295189f0e7e728921b406c7b973f0b3 Mon Sep 17 00:00:00 2001 From: Wenlong Zhang Date: Tue, 4 Jan 2022 07:04:59 +0000 Subject: [PATCH] Add loongarch64 base support Signed-off-by: Wenlong Zhang --- ...x-virtaddr-and-process-new-interface.patch | 356 ---------------- ...2-anolis-loongarch64-Fix-acpi-memmap.patch | 28 -- ...mknetdir-Add-loongarch64-efi-support.patch | 27 -- ...atch => 0481-loongarch64-add-support.patch | 389 +++++++++++++++--- grub.patches | 7 +- grub2.spec | 5 +- 6 files changed, 330 insertions(+), 482 deletions(-) delete mode 100644 0002-grub2-anolis-loongarch64-fix-virtaddr-and-process-new-interface.patch delete mode 100644 0003-grub2-anolis-loongarch64-Fix-acpi-memmap.patch delete mode 100644 0004-grub2-anolis-mknetdir-Add-loongarch64-efi-support.patch rename 0001-grub2-anolis-loongarch64-Add-base-support.patch => 0481-loongarch64-add-support.patch (89%) diff --git a/0002-grub2-anolis-loongarch64-fix-virtaddr-and-process-new-interface.patch b/0002-grub2-anolis-loongarch64-fix-virtaddr-and-process-new-interface.patch deleted file mode 100644 index 50f800b..0000000 --- a/0002-grub2-anolis-loongarch64-fix-virtaddr-and-process-new-interface.patch +++ /dev/null @@ -1,356 +0,0 @@ -From 4aca05a7a405e93d028006ee8d0f5cd6a15870df Mon Sep 17 00:00:00 2001 -From: yangqiming -Date: Wed, 11 Aug 2021 09:26:24 +0000 -Subject: [PATCH 2/4] loongarch64: fix virtaddr and process new interface - -Signed-off-by: Fedora Ninjas ---- - grub-core/kern/efi/mm.c | 27 ++++- - grub-core/kern/elfXX.c | 6 + - grub-core/lib/loongarch64/efi/loongson.c | 6 +- - grub-core/loader/loongarch64/linux.c | 146 ++++++++++++++++++++++- - include/grub/loongarch64/efi/loongson.h | 15 +-- - include/grub/loongarch64/efi/memory.h | 8 +- - include/grub/loongarch64/memory.h | 5 +- - 7 files changed, 190 insertions(+), 23 deletions(-) - -diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c -index 2d9c903..02dee53 100644 ---- a/grub-core/kern/efi/mm.c -+++ b/grub-core/kern/efi/mm.c -@@ -157,7 +157,11 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address, - grub_efi_physical_address_t ret = address; - - /* Limit the memory access to less than 4GB for 32-bit platforms. */ -+#ifdef GRUB_CPU_LOONGARCH64 -+ if (address > grub_efi_max_usable_address()) -+#else - if (address > GRUB_EFI_MAX_USABLE_ADDRESS) -+#endif - { - grub_error (GRUB_ERR_BAD_ARGUMENT, - N_("invalid memory address (0x%llx > 0x%llx)"), -@@ -177,7 +181,11 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address, - { - /* Uggh, the address 0 was allocated... This is too annoying, - so reallocate another one. */ -+#ifdef GRUB_CPU_LOONGARCH64 -+ ret = grub_efi_max_usable_address(); -+#else - ret = address; -+#endif - status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &ret); - grub_efi_free_pages (0, pages); - if (status != GRUB_EFI_SUCCESS) -@@ -195,9 +203,15 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address, - void * - grub_efi_allocate_any_pages (grub_efi_uintn_t pages) - { -+#ifdef GRUB_CPU_LOONGARCH64 -+ return grub_efi_allocate_pages_real (grub_efi_max_usable_address(), -+ pages, GRUB_EFI_ALLOCATE_MAX_ADDRESS, -+ GRUB_EFI_LOADER_DATA); -+#else - return grub_efi_allocate_pages_real (GRUB_EFI_MAX_USABLE_ADDRESS, - pages, GRUB_EFI_ALLOCATE_MAX_ADDRESS, - GRUB_EFI_LOADER_DATA); -+#endif - } - - void * -@@ -471,7 +485,9 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map, - desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size)) - { - if (desc->type == GRUB_EFI_CONVENTIONAL_MEMORY --#if 1 -+#ifdef GRUB_CPU_LOONGARCH64 -+ && desc->physical_start <= grub_efi_max_usable_address() -+#else - && desc->physical_start <= GRUB_EFI_MAX_USABLE_ADDRESS - #endif - && desc->physical_start + PAGES_TO_BYTES (desc->num_pages) > 0x100000 -@@ -487,7 +503,14 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map, - desc->physical_start = 0x100000; - } - --#if 1 -+#ifdef GRUB_CPU_LOONGARCH64 -+ if (BYTES_TO_PAGES (filtered_desc->physical_start) -+ + filtered_desc->num_pages -+ > BYTES_TO_PAGES_DOWN (grub_efi_max_usable_address())) -+ filtered_desc->num_pages -+ = (BYTES_TO_PAGES_DOWN (grub_efi_max_usable_address()) -+ - BYTES_TO_PAGES (filtered_desc->physical_start)); -+#else - if (BYTES_TO_PAGES (filtered_desc->physical_start) - + filtered_desc->num_pages - > BYTES_TO_PAGES_DOWN (GRUB_EFI_MAX_USABLE_ADDRESS)) -diff --git a/grub-core/kern/elfXX.c b/grub-core/kern/elfXX.c -index 1859d18..8b1dce9 100644 ---- a/grub-core/kern/elfXX.c -+++ b/grub-core/kern/elfXX.c -@@ -134,6 +134,12 @@ grub_elfXX_load (grub_elf_t elf, const char *filename, - load_addr &= 0x3FFFFFFFFFFFFFFFULL; - break; - } -+#ifdef GRUB_CPU_LOONGARCH64 -+ grub_uint64_t addr; -+ asm volatile ("csrrd %0, 0x181" : "=r" (addr)); -+ if ((load_addr >> 48) != (addr >> 48)) -+ return grub_error (GRUB_ERR_BAD_OS, "bad address space"); -+#endif - load_addr += (grub_addr_t) load_offset; - - if (load_addr < load_base) -diff --git a/grub-core/lib/loongarch64/efi/loongson.c b/grub-core/lib/loongarch64/efi/loongson.c -index 31e1664..8b60d82 100644 ---- a/grub-core/lib/loongarch64/efi/loongson.c -+++ b/grub-core/lib/loongarch64/efi/loongson.c -@@ -277,9 +277,7 @@ grub_efi_loongson_init_memory_map (grub_efi_loongson_smbios_table *smbios_table, - continue; - - dst->map[dst->nr_map].node_id = (desc->physical_start >> 44) & 0xf; -- dst->map[dst->nr_map].mem_type = (physical_end <= 0x10000000) ? -- GRUB_EFI_LOONGSON_SYSTEM_RAM_LOW : -- GRUB_EFI_LOONGSON_SYSTEM_RAM_HIGH; -+ dst->map[dst->nr_map].mem_type = GRUB_EFI_LOONGSON_SYSTEM_RAM; - dst->map[dst->nr_map].mem_start = physical_start; - dst->map[dst->nr_map].mem_size = (physical_end - physical_start) >> 20; - -@@ -342,7 +340,7 @@ grub_efi_loongson_alloc_boot_params (void) - { - if (desc->type != GRUB_EFI_CONVENTIONAL_MEMORY) - continue; -- if (desc->physical_start >= GRUB_EFI_MAX_USABLE_ADDRESS) -+ if (desc->physical_start >= grub_efi_max_usable_address()) - continue; - if (desc->num_pages < pages) - continue; -diff --git a/grub-core/loader/loongarch64/linux.c b/grub-core/loader/loongarch64/linux.c -index 8db6516..8ce6c1c 100644 ---- a/grub-core/loader/loongarch64/linux.c -+++ b/grub-core/loader/loongarch64/linux.c -@@ -137,12 +137,154 @@ grub_linux_boot (void) - grub_err_t err; - struct bootparamsinterface * boot_params; - void * tmp_boot_params = NULL; -+ grub_efi_uint8_t new_interface_flag = 0; -+ mem_map * new_interface_mem = NULL; -+ char *p = NULL; -+ -+ struct memmap reserve_mem[GRUB_EFI_LOONGSON_MMAP_MAX]; -+ struct memmap free_mem[GRUB_EFI_LOONGSON_MMAP_MAX]; -+ struct memmap acpi_table_mem[GRUB_EFI_LOONGSON_MMAP_MAX]; -+ struct memmap acpi_nvs_mem[GRUB_EFI_LOONGSON_MMAP_MAX]; -+ -+ grub_memset(reserve_mem, 0, sizeof(struct memmap) * GRUB_EFI_LOONGSON_MMAP_MAX); -+ grub_memset(free_mem, 0, sizeof(struct memmap) * GRUB_EFI_LOONGSON_MMAP_MAX); -+ grub_memset(acpi_table_mem, 0, sizeof(struct memmap) * GRUB_EFI_LOONGSON_MMAP_MAX); -+ grub_memset(acpi_nvs_mem, 0, sizeof(struct memmap) * GRUB_EFI_LOONGSON_MMAP_MAX); -+ - tmp_boot_params = grub_efi_loongson_get_boot_params(); -- -+ if(tmp_boot_params == NULL) -+ { -+ grub_printf("not find param\n"); -+ return -1; -+ } -+ -+ boot_params = (struct bootparamsinterface *)tmp_boot_params; -+ p = (char *)&(boot_params->signature); -+ if(grub_strncmp(p, "BPI", 3) == 0) -+ { -+ /* Check extlist headers */ -+ ext_list * listpointer = NULL; -+ listpointer = boot_params->extlist; -+ for( ;listpointer != NULL; listpointer = listpointer->next) -+ { -+ char *pl= (char *)&(listpointer->signature); -+ if(grub_strncmp(pl, "MEM", 3) == 0) -+ { -+ new_interface_mem = (mem_map *)listpointer; -+ } -+ } -+ -+ new_interface_flag = 1; -+ grub_dprintf("loongson", "get new parameter interface\n"); -+ }else{ -+ new_interface_flag = 0; -+ grub_dprintf("loongson", "get old parameter interface\n"); -+ } - state.gpr[6] = (grub_uint64_t)tmp_boot_params; - grub_dprintf("loongson", "boot_params is %p\n", state.gpr[6]); -- grub_dprintf("loongson", "boot_params sis %s\n", state.gpr[6]); - -+ mmap_size = find_mmap_size (); -+ if (! mmap_size) -+ return grub_errno; -+ mmap_buf = grub_efi_allocate_any_pages (page_align (mmap_size) >> 12); -+ if (! mmap_buf) -+ return grub_error (GRUB_ERR_IO, "cannot allocate memory map"); -+ err = grub_efi_finish_boot_services (&mmap_size, mmap_buf, NULL, -+ &desc_size, NULL); -+ if (err) -+ return err; -+ -+ if(new_interface_flag) -+ { -+ if (!mmap_buf || !mmap_size || !desc_size) -+ return -1; -+ tmp_index = new_interface_mem -> mapcount; -+ -+ /* -+ According to UEFI SPEC,mmap_buf is the accurate Memory Map array \ -+ now we can fill platform specific memory structure. -+ */ -+ for(lsdesc = mmap_buf; lsdesc < (grub_efi_memory_descriptor_t *)((char *)mmap_buf + mmap_size); -+ lsdesc = (grub_efi_memory_descriptor_t *)((char *)lsdesc + desc_size)) -+ { -+ /* Recovery */ -+ if((lsdesc->type != GRUB_EFI_ACPI_RECLAIM_MEMORY) && \ -+ (lsdesc->type != GRUB_EFI_ACPI_MEMORY_NVS) && \ -+ (lsdesc->type != GRUB_EFI_RUNTIME_SERVICES_DATA) && \ -+ (lsdesc->type != GRUB_EFI_RUNTIME_SERVICES_CODE) && \ -+ (lsdesc->type != GRUB_EFI_RESERVED_MEMORY_TYPE) && \ -+ (lsdesc->type != GRUB_EFI_PAL_CODE)) -+ { -+ free_mem[free_index].memtype = GRUB_EFI_LOONGSON_SYSTEM_RAM; -+ free_mem[free_index].memstart = (lsdesc->physical_start) & 0xffffffffffff; -+ free_mem[free_index].memsize = lsdesc->num_pages * 4096; -+ free_index++; -+ -+ /*ACPI*/ -+ }else if((lsdesc->type == GRUB_EFI_ACPI_RECLAIM_MEMORY)){ -+ acpi_table_mem[acpi_table_index].memtype = GRUB_EFI_LOONGSON_ACPI_TABLE; -+ acpi_table_mem[acpi_table_index].memstart = (lsdesc->physical_start) & 0xffffffffffff; -+ acpi_table_mem[acpi_table_index].memsize = lsdesc->num_pages * 4096; -+ acpi_table_index++; -+ }else if((lsdesc->type == GRUB_EFI_ACPI_MEMORY_NVS)){ -+ acpi_nvs_mem[acpi_nvs_index].memtype = GRUB_EFI_LOONGSON_ACPI_NVS; -+ acpi_nvs_mem[acpi_nvs_index].memstart = (lsdesc->physical_start) & 0xffffffffffff; -+ acpi_nvs_mem[acpi_nvs_index].memsize = lsdesc->num_pages * 4096; -+ acpi_nvs_index++; -+ -+ /* Reserve */ -+ }else{ -+ reserve_mem[reserve_index].memtype = GRUB_EFI_LOONGSON_MEMORY_RESERVED; -+ reserve_mem[reserve_index].memstart = (lsdesc->physical_start) & 0xffffffffffff; -+ reserve_mem[reserve_index].memsize = lsdesc->num_pages * 4096; -+ reserve_index++; -+ } -+ } -+ -+ /* Recovery sort */ -+ for(j = 0; j < free_index;) -+ { -+ tempMemsize = free_mem[j].memsize; -+ for(t = j + 1; t < free_index; t++) -+ { -+ if((free_mem[j].memstart + tempMemsize == free_mem[t].memstart) && (free_mem[j].memtype == free_mem[t].memtype)) -+ { -+ tempMemsize += free_mem[t].memsize; -+ }else{ -+ break; -+ } -+ } -+ -+ new_interface_mem->map[tmp_index].memtype = GRUB_EFI_LOONGSON_SYSTEM_RAM; -+ new_interface_mem->map[tmp_index].memstart = free_mem[j].memstart; -+ new_interface_mem->map[tmp_index].memsize = tempMemsize; -+ grub_dprintf("loongson", "map[%d]:type %x, start 0x%llx, end 0x%llx\n", -+ tmp_index, -+ new_interface_mem->map[tmp_index].memtype, -+ new_interface_mem->map[tmp_index].memstart, -+ new_interface_mem->map[tmp_index].memstart+ new_interface_mem->map[tmp_index].memsize -+ ); -+ j = t; -+ tmp_index++; -+ } -+ /*ACPI Sort*/ -+ //tmp_index = grub_efi_loongson_memmap_sort(acpi_table_mem, acpi_table_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_ACPI_TABLE); -+ //tmp_index = grub_efi_loongson_memmap_sort(acpi_nvs_mem, acpi_nvs_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_ACPI_NVS); -+ /*Reserve Sort*/ -+ grub_uint64_t loongarch_addr; -+ asm volatile ("csrrd %0, 0x181" : "=r" (loongarch_addr)); -+ if((loongarch_addr & 0xff00000000000000) == 0x9000000000000000){ -+ tmp_index = grub_efi_loongson_memmap_sort(reserve_mem, reserve_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_MEMORY_RESERVED); -+ }else{ -+ tmp_index = grub_efi_loongson_memmap_sort(reserve_mem, reserve_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_MEMORY_RESERVED + 1); -+ } -+ -+ new_interface_mem->mapcount = tmp_index; -+ new_interface_mem->header.checksum = 0; -+ -+ checksum = grub_efi_loongson_grub_calculatechecksum8(new_interface_mem, new_interface_mem->header.length); -+ new_interface_mem->header.checksum = checksum; -+ } - } - - state.jumpreg = 1; -diff --git a/include/grub/loongarch64/efi/loongson.h b/include/grub/loongarch64/efi/loongson.h -index a092803..fa32ef5 100644 ---- a/include/grub/loongarch64/efi/loongson.h -+++ b/include/grub/loongarch64/efi/loongson.h -@@ -30,21 +30,10 @@ - - #define GRUB_EFI_LOONGSON_MMAP_MAX 128 - typedef enum -- { -- GRUB_EFI_LOONGSON_SYSTEM_RAM_LOW = 1, -- GRUB_EFI_LOONGSON_SYSTEM_RAM_HIGH, -+ { -+ GRUB_EFI_LOONGSON_SYSTEM_RAM = 1, - GRUB_EFI_LOONGSON_MEMORY_RESERVED, -- GRUB_EFI_LOONGSON_PCI_IO, -- GRUB_EFI_LOONGSON_PCI_MEM, -- GRUB_EFI_LOONGSON_CFG_REG, -- GRUB_EFI_LOONGSON_VIDEO_ROM, -- GRUB_EFI_LOONGSON_ADAPTER_ROM, - GRUB_EFI_LOONGSON_ACPI_TABLE, -- GRUB_EFI_LOONGSON_SMBIOS_TABLE, -- GRUB_EFI_LOONGSON_UMA_VIDEO_RAM, -- GRUB_EFI_LOONGSON_VUMA_VIDEO_RAM, -- GRUB_EFI_LOONGSON_SYSTEM_RAM_LOW_DMA, -- GRUB_EFI_LOONGSON_SYSTEM_RAM_HIGH_DMA, - GRUB_EFI_LOONGSON_ACPI_NVS, - GRUB_EFI_LOONGSON_MAX_MEMORY_TYPE - } -diff --git a/include/grub/loongarch64/efi/memory.h b/include/grub/loongarch64/efi/memory.h -index a89daf6..b8556c7 100644 ---- a/include/grub/loongarch64/efi/memory.h -+++ b/include/grub/loongarch64/efi/memory.h -@@ -1,8 +1,14 @@ - #ifndef GRUB_MEMORY_CPU_HEADER - #include - --//#define GRUB_EFI_MAX_USABLE_ADDRESS 0x980000000fffffffUL - #define GRUB_EFI_MAX_USABLE_ADDRESS 0x9800000fffffffffUL - #define GRUB_EFI_MAX_ALLOCATION_ADDRESS GRUB_EFI_MAX_USABLE_ADDRESS - -+static inline grub_uint64_t grub_efi_max_usable_address(void) -+{ -+ grub_uint64_t addr; -+ asm volatile ("csrrd %0, 0x181" : "=r" (addr)); -+ return addr |= 0xffffffffffUL; -+} -+ - #endif /* ! GRUB_MEMORY_CPU_HEADER */ -diff --git a/include/grub/loongarch64/memory.h b/include/grub/loongarch64/memory.h -index b0b61a5..03398b3 100644 ---- a/include/grub/loongarch64/memory.h -+++ b/include/grub/loongarch64/memory.h -@@ -40,7 +40,10 @@ grub_vtop (void *a) - static inline void * - grub_map_memory (grub_phys_addr_t a, grub_size_t size) - { -- return (void *) (a | 0x9800000000000000UL); -+ grub_uint64_t addr; -+ -+ asm volatile ("csrrd %0, 0x181" : "=r" (addr)); -+ return (void *) (a | (addr & 0xffffffffffffff00UL)); - } - - static inline void --- -2.27.0 - diff --git a/0003-grub2-anolis-loongarch64-Fix-acpi-memmap.patch b/0003-grub2-anolis-loongarch64-Fix-acpi-memmap.patch deleted file mode 100644 index 17402ed..0000000 --- a/0003-grub2-anolis-loongarch64-Fix-acpi-memmap.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 6e6eb0aa02debea3d9354bc1f3dd40b715a6163b Mon Sep 17 00:00:00 2001 -From: yangqiming -Date: Wed, 11 Aug 2021 09:53:59 +0000 -Subject: [PATCH 3/4] loongarch64: Fix acpi memmap - -Signed-off-by: Guoqi.Chen ---- - grub-core/loader/loongarch64/linux.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/grub-core/loader/loongarch64/linux.c b/grub-core/loader/loongarch64/linux.c -index 8ce6c1c..e226eb9 100644 ---- a/grub-core/loader/loongarch64/linux.c -+++ b/grub-core/loader/loongarch64/linux.c -@@ -268,8 +268,8 @@ grub_linux_boot (void) - tmp_index++; - } - /*ACPI Sort*/ -- //tmp_index = grub_efi_loongson_memmap_sort(acpi_table_mem, acpi_table_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_ACPI_TABLE); -- //tmp_index = grub_efi_loongson_memmap_sort(acpi_nvs_mem, acpi_nvs_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_ACPI_NVS); -+ tmp_index = grub_efi_loongson_memmap_sort(acpi_table_mem, acpi_table_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_ACPI_TABLE); -+ tmp_index = grub_efi_loongson_memmap_sort(acpi_nvs_mem, acpi_nvs_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_ACPI_NVS); - /*Reserve Sort*/ - grub_uint64_t loongarch_addr; - asm volatile ("csrrd %0, 0x181" : "=r" (loongarch_addr)); --- -2.27.0 - diff --git a/0004-grub2-anolis-mknetdir-Add-loongarch64-efi-support.patch b/0004-grub2-anolis-mknetdir-Add-loongarch64-efi-support.patch deleted file mode 100644 index c602b88..0000000 --- a/0004-grub2-anolis-mknetdir-Add-loongarch64-efi-support.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 4f981ab81b9e85ce994730ace5dd147c22cf8881 Mon Sep 17 00:00:00 2001 -From: "Guoqi.Chen" -Date: Wed, 11 Aug 2021 09:59:27 +0000 -Subject: [PATCH] mknetdir: Add loongarch64-efi support. - -Signed-off-by: Guoqi.Chen ---- - util/grub-mknetdir.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/util/grub-mknetdir.c b/util/grub-mknetdir.c -index ae31271..c998850 100644 ---- a/util/grub-mknetdir.c -+++ b/util/grub-mknetdir.c -@@ -112,7 +112,8 @@ static struct - [GRUB_INSTALL_PLATFORM_X86_64_EFI] = { "x86_64-efi", "efinet", ".efi" }, - [GRUB_INSTALL_PLATFORM_IA64_EFI] = { "ia64-efi", "efinet", ".efi" }, - [GRUB_INSTALL_PLATFORM_ARM_EFI] = { "arm-efi", "efinet", ".efi" }, -- [GRUB_INSTALL_PLATFORM_ARM64_EFI] = { "arm64-efi", "efinet", ".efi" } -+ [GRUB_INSTALL_PLATFORM_ARM64_EFI] = { "arm64-efi", "efinet", ".efi" }, -+ [GRUB_INSTALL_PLATFORM_LOONGARCH64_EFI] = { "loongarch64-efi", "efinet", ".efi" } - }; - - static void --- -2.27.0 - diff --git a/0001-grub2-anolis-loongarch64-Add-base-support.patch b/0481-loongarch64-add-support.patch similarity index 89% rename from 0001-grub2-anolis-loongarch64-Add-base-support.patch rename to 0481-loongarch64-add-support.patch index 7a0e08c..8b585ee 100644 --- a/0001-grub2-anolis-loongarch64-Add-base-support.patch +++ b/0481-loongarch64-add-support.patch @@ -1,29 +1,31 @@ -From fc22b741c901238457bcc74eec3e9d0a660ca5bd Mon Sep 17 00:00:00 2001 +From 7c6ccf2bce79c0f55a851a83b293f3386a792156 Mon Sep 17 00:00:00 2001 From: yangqiming -Date: Wed, 11 Aug 2021 08:58:14 +0800 -Subject: [PATCH] loongarch64: Add base support. +Date: Wed, 1 Sep 2021 04:19:43 -0400 +Subject: [PATCH] loongarch64 add support -Signed-off-by: Guoqi Chen +Signed-off-by: yangqiming --- conf/Makefile.common | 4 + configure.ac | 9 + gentpl.py | 5 +- grub-core/Makefile.am | 7 + grub-core/Makefile.core.def | 20 + + grub-core/kern/efi/mm.c | 27 +- + grub-core/kern/elfXX.c | 6 + grub-core/kern/loongarch64/cache.S | 26 + - grub-core/kern/loongarch64/dl.c | 258 ++++++++++ + grub-core/kern/loongarch64/dl.c | 258 +++++++++ grub-core/kern/loongarch64/efi/init.c | 76 +++ grub-core/kern/loongarch64/efi/startup.S | 45 ++ grub-core/kern/loongarch64/init.c | 47 ++ - grub-core/lib/loongarch64/efi/loongson.c | 507 +++++++++++++++++++ - grub-core/lib/loongarch64/efi/loongson_asm.S | 58 +++ + grub-core/lib/loongarch64/efi/loongson.c | 505 ++++++++++++++++ + grub-core/lib/loongarch64/efi/loongson_asm.S | 58 ++ grub-core/lib/loongarch64/relocator.c | 163 ++++++ grub-core/lib/loongarch64/relocator_asm.S | 51 ++ grub-core/lib/loongarch64/setjmp.S | 74 +++ grub-core/lib/loongson/reboot.c | 33 ++ grub-core/lib/setjmp.S | 2 + grub-core/loader/efi/chainloader.c | 2 + - grub-core/loader/loongarch64/linux.c | 422 +++++++++++++++ + grub-core/loader/loongarch64/linux.c | 580 +++++++++++++++++++ include/grub/dl.h | 2 +- include/grub/efi/api.h | 3 +- include/grub/efi/pe32.h | 2 + @@ -31,14 +33,14 @@ Signed-off-by: Guoqi Chen include/grub/loongarch64/asm.h | 10 + include/grub/loongarch64/efi/boot.h | 0 include/grub/loongarch64/efi/loader.h | 25 + - include/grub/loongarch64/efi/loongson.h | 301 +++++++++++ - include/grub/loongarch64/efi/memory.h | 8 + + include/grub/loongarch64/efi/loongson.h | 290 ++++++++++ + include/grub/loongarch64/efi/memory.h | 14 + include/grub/loongarch64/efi/time.h | 0 - include/grub/loongarch64/io.h | 62 +++ + include/grub/loongarch64/io.h | 62 ++ include/grub/loongarch64/kernel.h | 24 + include/grub/loongarch64/linux.h | 22 + - include/grub/loongarch64/loongarch64.h | 30 ++ - include/grub/loongarch64/memory.h | 54 ++ + include/grub/loongarch64/loongarch64.h | 30 + + include/grub/loongarch64/memory.h | 57 ++ include/grub/loongarch64/relocator.h | 38 ++ include/grub/loongarch64/setjmp.h | 27 + include/grub/loongarch64/time.h | 39 ++ @@ -46,10 +48,11 @@ Signed-off-by: Guoqi Chen include/grub/util/install.h | 1 + util/grub-install-common.c | 43 +- util/grub-install.c | 16 + - util/grub-mkimagexx.c | 349 ++++++++++++- + util/grub-mkimagexx.c | 349 ++++++++++- + util/grub-mknetdir.c | 3 +- util/grub-module-verifier.c | 46 ++ util/mkimage.c | 16 + - 44 files changed, 2989 insertions(+), 27 deletions(-) + 47 files changed, 3176 insertions(+), 30 deletions(-) create mode 100644 grub-core/kern/loongarch64/cache.S create mode 100644 grub-core/kern/loongarch64/dl.c create mode 100644 grub-core/kern/loongarch64/efi/init.c @@ -79,7 +82,7 @@ Signed-off-by: Guoqi Chen create mode 100644 include/grub/loongarch64/types.h diff --git a/conf/Makefile.common b/conf/Makefile.common -index 521cdda..8be5e7d 100644 +index 521cdda..cc1d190 100644 --- a/conf/Makefile.common +++ b/conf/Makefile.common @@ -20,6 +20,10 @@ endif @@ -87,8 +90,8 @@ index 521cdda..8be5e7d 100644 CFLAGS_PLATFORM += -mcpu=powerpc endif +if COND_loongarch64 -+ CFLAGS_PLATFORM += -fno-strict-aliasing -march=loongarch -mabi=lp64 -fno-plt -Wa,-mla-global-with-pcrel -+ CPPFLAGS_PLATFORM = -fno-strict-aliasing -march=loongarch -mabi=lp64 -fno-plt -Wa,-mla-global-with-pcrel ++ CFLAGS_PLATFORM += -fno-strict-aliasing -march=loongarch64 -mabi=lp64 -fno-plt -Wa,-mla-global-with-pcrel ++ CPPFLAGS_PLATFORM = -fno-strict-aliasing -march=loongarch64 -mabi=lp64 -fno-plt -Wa,-mla-global-with-pcrel +endif # Other options @@ -282,6 +285,94 @@ index 612df2e..8624513 100644 }; module = { +diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c +index 2d9c903..02dee53 100644 +--- a/grub-core/kern/efi/mm.c ++++ b/grub-core/kern/efi/mm.c +@@ -157,7 +157,11 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address, + grub_efi_physical_address_t ret = address; + + /* Limit the memory access to less than 4GB for 32-bit platforms. */ ++#ifdef GRUB_CPU_LOONGARCH64 ++ if (address > grub_efi_max_usable_address()) ++#else + if (address > GRUB_EFI_MAX_USABLE_ADDRESS) ++#endif + { + grub_error (GRUB_ERR_BAD_ARGUMENT, + N_("invalid memory address (0x%llx > 0x%llx)"), +@@ -177,7 +181,11 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address, + { + /* Uggh, the address 0 was allocated... This is too annoying, + so reallocate another one. */ ++#ifdef GRUB_CPU_LOONGARCH64 ++ ret = grub_efi_max_usable_address(); ++#else + ret = address; ++#endif + status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &ret); + grub_efi_free_pages (0, pages); + if (status != GRUB_EFI_SUCCESS) +@@ -195,9 +203,15 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address, + void * + grub_efi_allocate_any_pages (grub_efi_uintn_t pages) + { ++#ifdef GRUB_CPU_LOONGARCH64 ++ return grub_efi_allocate_pages_real (grub_efi_max_usable_address(), ++ pages, GRUB_EFI_ALLOCATE_MAX_ADDRESS, ++ GRUB_EFI_LOADER_DATA); ++#else + return grub_efi_allocate_pages_real (GRUB_EFI_MAX_USABLE_ADDRESS, + pages, GRUB_EFI_ALLOCATE_MAX_ADDRESS, + GRUB_EFI_LOADER_DATA); ++#endif + } + + void * +@@ -471,7 +485,9 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map, + desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size)) + { + if (desc->type == GRUB_EFI_CONVENTIONAL_MEMORY +-#if 1 ++#ifdef GRUB_CPU_LOONGARCH64 ++ && desc->physical_start <= grub_efi_max_usable_address() ++#else + && desc->physical_start <= GRUB_EFI_MAX_USABLE_ADDRESS + #endif + && desc->physical_start + PAGES_TO_BYTES (desc->num_pages) > 0x100000 +@@ -487,7 +503,14 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map, + desc->physical_start = 0x100000; + } + +-#if 1 ++#ifdef GRUB_CPU_LOONGARCH64 ++ if (BYTES_TO_PAGES (filtered_desc->physical_start) ++ + filtered_desc->num_pages ++ > BYTES_TO_PAGES_DOWN (grub_efi_max_usable_address())) ++ filtered_desc->num_pages ++ = (BYTES_TO_PAGES_DOWN (grub_efi_max_usable_address()) ++ - BYTES_TO_PAGES (filtered_desc->physical_start)); ++#else + if (BYTES_TO_PAGES (filtered_desc->physical_start) + + filtered_desc->num_pages + > BYTES_TO_PAGES_DOWN (GRUB_EFI_MAX_USABLE_ADDRESS)) +diff --git a/grub-core/kern/elfXX.c b/grub-core/kern/elfXX.c +index 1859d18..8b1dce9 100644 +--- a/grub-core/kern/elfXX.c ++++ b/grub-core/kern/elfXX.c +@@ -134,6 +134,12 @@ grub_elfXX_load (grub_elf_t elf, const char *filename, + load_addr &= 0x3FFFFFFFFFFFFFFFULL; + break; + } ++#ifdef GRUB_CPU_LOONGARCH64 ++ grub_uint64_t addr; ++ asm volatile ("csrrd %0, 0x181" : "=r" (addr)); ++ if ((load_addr >> 48) != (addr >> 48)) ++ return grub_error (GRUB_ERR_BAD_OS, "bad address space"); ++#endif + load_addr += (grub_addr_t) load_offset; + + if (load_addr < load_base) diff --git a/grub-core/kern/loongarch64/cache.S b/grub-core/kern/loongarch64/cache.S new file mode 100644 index 0000000..d291c67 @@ -766,10 +857,10 @@ index 0000000..b2de930 +} diff --git a/grub-core/lib/loongarch64/efi/loongson.c b/grub-core/lib/loongarch64/efi/loongson.c new file mode 100644 -index 0000000..31e1664 +index 0000000..8b60d82 --- /dev/null +++ b/grub-core/lib/loongarch64/efi/loongson.c -@@ -0,0 +1,507 @@ +@@ -0,0 +1,505 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2017 Free Software Foundation, Inc. @@ -1049,9 +1140,7 @@ index 0000000..31e1664 + continue; + + dst->map[dst->nr_map].node_id = (desc->physical_start >> 44) & 0xf; -+ dst->map[dst->nr_map].mem_type = (physical_end <= 0x10000000) ? -+ GRUB_EFI_LOONGSON_SYSTEM_RAM_LOW : -+ GRUB_EFI_LOONGSON_SYSTEM_RAM_HIGH; ++ dst->map[dst->nr_map].mem_type = GRUB_EFI_LOONGSON_SYSTEM_RAM; + dst->map[dst->nr_map].mem_start = physical_start; + dst->map[dst->nr_map].mem_size = (physical_end - physical_start) >> 20; + @@ -1114,7 +1203,7 @@ index 0000000..31e1664 + { + if (desc->type != GRUB_EFI_CONVENTIONAL_MEMORY) + continue; -+ if (desc->physical_start >= GRUB_EFI_MAX_USABLE_ADDRESS) ++ if (desc->physical_start >= grub_efi_max_usable_address()) + continue; + if (desc->num_pages < pages) + continue; @@ -1279,7 +1368,7 @@ index 0000000..31e1664 + diff --git a/grub-core/lib/loongarch64/efi/loongson_asm.S b/grub-core/lib/loongarch64/efi/loongson_asm.S new file mode 100644 -index 0000000..dda5991 +index 0000000..4a04d34 --- /dev/null +++ b/grub-core/lib/loongarch64/efi/loongson_asm.S @@ -0,0 +1,58 @@ @@ -1324,26 +1413,26 @@ index 0000000..dda5991 + +FUNCTION(grub_efi_loongson_reset_cold) + b reset_system -+ li $a0, 0 ++ li.w $a0, 0 + +FUNCTION(grub_efi_loongson_reset_warm) + b reset_system -+ li $a0, 1 ++ li.w $a0, 1 + +FUNCTION(grub_efi_loongson_reset_shutdown) + b reset_system -+ li $a0, 2 ++ li.w $a0, 2 + +FUNCTION(grub_efi_loongson_reset_suspend) + b reset_system -+ li $a0, 3 ++ li.w $a0, 3 + +VARIABLE (grub_efi_loongson_reset_end) + + diff --git a/grub-core/lib/loongarch64/relocator.c b/grub-core/lib/loongarch64/relocator.c new file mode 100644 -index 0000000..e8b41ef +index 0000000..f6c1b01 --- /dev/null +++ b/grub-core/lib/loongarch64/relocator.c @@ -0,0 +1,163 @@ @@ -1498,7 +1587,7 @@ index 0000000..e8b41ef + + grub_uint64_t val; + __asm__ __volatile__( -+ "li %0, 0x4\n\t" ++ "li.w %0, 0x4\n\t" + "csrxchg $r0, %0, 0x0\n\t" + : "=r"(val) + : @@ -1714,10 +1803,10 @@ index 29663f7..c0ca17d 100644 #endif diff --git a/grub-core/loader/loongarch64/linux.c b/grub-core/loader/loongarch64/linux.c new file mode 100644 -index 0000000..8db6516 +index 0000000..c769bb2 --- /dev/null +++ b/grub-core/loader/loongarch64/linux.c -@@ -0,0 +1,422 @@ +@@ -0,0 +1,580 @@ +/* linux.c - boot Linux */ +/* + * GRUB -- GRand Unified Bootloader @@ -1772,6 +1861,7 @@ index 0000000..8db6516 +static int linux_argc; +static grub_uint8_t *linux_args_addr; +static grub_off_t rd_addr_arg_off, rd_size_arg_off; ++static grub_off_t initrd_addr_arg_off; +static int initrd_loaded = 0; + + @@ -1781,7 +1871,7 @@ index 0000000..8db6516 +grub_uint32_t free_index = 0; +grub_uint32_t reserve_index = 0; +grub_uint32_t acpi_table_index = 0; -+grub_uint32_t acpi_nvs_index = 0; ++grub_uint32_t acpi_nvs_index = 0; + +static inline grub_size_t +page_align (grub_size_t size) @@ -1808,18 +1898,18 @@ index 0000000..8db6516 + + mmap = grub_malloc (mmap_size); + if (! mmap) -+ return 0; ++ return 0; + + ret = grub_efi_get_memory_map (&mmap_size, mmap, 0, &desc_size, 0); + grub_free (mmap); + + if (ret < 0) -+ { -+ grub_error (GRUB_ERR_IO, "cannot get memory map"); -+ return 0; -+ } ++ { ++ grub_error (GRUB_ERR_IO, "cannot get memory map"); ++ return 0; ++ } + else if (ret > 0) -+ break; ++ break; + + mmap_size += (1 << 12); + } @@ -1857,12 +1947,154 @@ index 0000000..8db6516 + grub_err_t err; + struct bootparamsinterface * boot_params; + void * tmp_boot_params = NULL; ++ grub_efi_uint8_t new_interface_flag = 0; ++ mem_map * new_interface_mem = NULL; ++ char *p = NULL; ++ ++ struct memmap reserve_mem[GRUB_EFI_LOONGSON_MMAP_MAX]; ++ struct memmap free_mem[GRUB_EFI_LOONGSON_MMAP_MAX]; ++ struct memmap acpi_table_mem[GRUB_EFI_LOONGSON_MMAP_MAX]; ++ struct memmap acpi_nvs_mem[GRUB_EFI_LOONGSON_MMAP_MAX]; ++ ++ grub_memset(reserve_mem, 0, sizeof(struct memmap) * GRUB_EFI_LOONGSON_MMAP_MAX); ++ grub_memset(free_mem, 0, sizeof(struct memmap) * GRUB_EFI_LOONGSON_MMAP_MAX); ++ grub_memset(acpi_table_mem, 0, sizeof(struct memmap) * GRUB_EFI_LOONGSON_MMAP_MAX); ++ grub_memset(acpi_nvs_mem, 0, sizeof(struct memmap) * GRUB_EFI_LOONGSON_MMAP_MAX); ++ + tmp_boot_params = grub_efi_loongson_get_boot_params(); -+ ++ if(tmp_boot_params == NULL) ++ { ++ grub_printf("not find param\n"); ++ return -1; ++ } ++ ++ boot_params = (struct bootparamsinterface *)tmp_boot_params; ++ p = (char *)&(boot_params->signature); ++ if(grub_strncmp(p, "BPI", 3) == 0) ++ { ++ /* Check extlist headers */ ++ ext_list * listpointer = NULL; ++ listpointer = boot_params->extlist; ++ for( ;listpointer != NULL; listpointer = listpointer->next) ++ { ++ char *pl= (char *)&(listpointer->signature); ++ if(grub_strncmp(pl, "MEM", 3) == 0) ++ { ++ new_interface_mem = (mem_map *)listpointer; ++ } ++ } ++ ++ new_interface_flag = 1; ++ grub_dprintf("loongson", "get new parameter interface\n"); ++ }else{ ++ new_interface_flag = 0; ++ grub_dprintf("loongson", "get old parameter interface\n"); ++ } + state.gpr[6] = (grub_uint64_t)tmp_boot_params; + grub_dprintf("loongson", "boot_params is %p\n", state.gpr[6]); -+ grub_dprintf("loongson", "boot_params sis %s\n", state.gpr[6]); + ++ mmap_size = find_mmap_size (); ++ if (! mmap_size) ++ return grub_errno; ++ mmap_buf = grub_efi_allocate_any_pages (page_align (mmap_size) >> 12); ++ if (! mmap_buf) ++ return grub_error (GRUB_ERR_IO, "cannot allocate memory map"); ++ err = grub_efi_finish_boot_services (&mmap_size, mmap_buf, NULL, ++ &desc_size, NULL); ++ if (err) ++ return err; ++ ++ if(new_interface_flag) ++ { ++ if (!mmap_buf || !mmap_size || !desc_size) ++ return -1; ++ tmp_index = new_interface_mem -> mapcount; ++ ++ /* ++ According to UEFI SPEC,mmap_buf is the accurate Memory Map array \ ++ now we can fill platform specific memory structure. ++ */ ++ for(lsdesc = mmap_buf; lsdesc < (grub_efi_memory_descriptor_t *)((char *)mmap_buf + mmap_size); ++ lsdesc = (grub_efi_memory_descriptor_t *)((char *)lsdesc + desc_size)) ++ { ++ /* Recovery */ ++ if((lsdesc->type != GRUB_EFI_ACPI_RECLAIM_MEMORY) && \ ++ (lsdesc->type != GRUB_EFI_ACPI_MEMORY_NVS) && \ ++ (lsdesc->type != GRUB_EFI_RUNTIME_SERVICES_DATA) && \ ++ (lsdesc->type != GRUB_EFI_RUNTIME_SERVICES_CODE) && \ ++ (lsdesc->type != GRUB_EFI_RESERVED_MEMORY_TYPE) && \ ++ (lsdesc->type != GRUB_EFI_PAL_CODE)) ++ { ++ free_mem[free_index].memtype = GRUB_EFI_LOONGSON_SYSTEM_RAM; ++ free_mem[free_index].memstart = (lsdesc->physical_start) & 0xffffffffffff; ++ free_mem[free_index].memsize = lsdesc->num_pages * 4096; ++ free_index++; ++ ++ /*ACPI*/ ++ }else if((lsdesc->type == GRUB_EFI_ACPI_RECLAIM_MEMORY)){ ++ acpi_table_mem[acpi_table_index].memtype = GRUB_EFI_LOONGSON_ACPI_TABLE; ++ acpi_table_mem[acpi_table_index].memstart = (lsdesc->physical_start) & 0xffffffffffff; ++ acpi_table_mem[acpi_table_index].memsize = lsdesc->num_pages * 4096; ++ acpi_table_index++; ++ }else if((lsdesc->type == GRUB_EFI_ACPI_MEMORY_NVS)){ ++ acpi_nvs_mem[acpi_nvs_index].memtype = GRUB_EFI_LOONGSON_ACPI_NVS; ++ acpi_nvs_mem[acpi_nvs_index].memstart = (lsdesc->physical_start) & 0xffffffffffff; ++ acpi_nvs_mem[acpi_nvs_index].memsize = lsdesc->num_pages * 4096; ++ acpi_nvs_index++; ++ ++ /* Reserve */ ++ }else{ ++ reserve_mem[reserve_index].memtype = GRUB_EFI_LOONGSON_MEMORY_RESERVED; ++ reserve_mem[reserve_index].memstart = (lsdesc->physical_start) & 0xffffffffffff; ++ reserve_mem[reserve_index].memsize = lsdesc->num_pages * 4096; ++ reserve_index++; ++ } ++ } ++ ++ /* Recovery sort */ ++ for(j = 0; j < free_index;) ++ { ++ tempMemsize = free_mem[j].memsize; ++ for(t = j + 1; t < free_index; t++) ++ { ++ if((free_mem[j].memstart + tempMemsize == free_mem[t].memstart) && (free_mem[j].memtype == free_mem[t].memtype)) ++ { ++ tempMemsize += free_mem[t].memsize; ++ }else{ ++ break; ++ } ++ } ++ ++ new_interface_mem->map[tmp_index].memtype = GRUB_EFI_LOONGSON_SYSTEM_RAM; ++ new_interface_mem->map[tmp_index].memstart = free_mem[j].memstart; ++ new_interface_mem->map[tmp_index].memsize = tempMemsize; ++ grub_dprintf("loongson", "map[%d]:type %x, start 0x%llx, end 0x%llx\n", ++ tmp_index, ++ new_interface_mem->map[tmp_index].memtype, ++ new_interface_mem->map[tmp_index].memstart, ++ new_interface_mem->map[tmp_index].memstart+ new_interface_mem->map[tmp_index].memsize ++ ); ++ j = t; ++ tmp_index++; ++ } ++ /*ACPI Sort*/ ++ tmp_index = grub_efi_loongson_memmap_sort(acpi_table_mem, acpi_table_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_ACPI_TABLE); ++ tmp_index = grub_efi_loongson_memmap_sort(acpi_nvs_mem, acpi_nvs_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_ACPI_NVS); ++ /*Reserve Sort*/ ++ grub_uint64_t loongarch_addr; ++ asm volatile ("csrrd %0, 0x181" : "=r" (loongarch_addr)); ++ if((loongarch_addr & 0xff00000000000000) == 0x9000000000000000){ ++ tmp_index = grub_efi_loongson_memmap_sort(reserve_mem, reserve_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_MEMORY_RESERVED); ++ }else{ ++ tmp_index = grub_efi_loongson_memmap_sort(reserve_mem, reserve_index, new_interface_mem, tmp_index, GRUB_EFI_LOONGSON_MEMORY_RESERVED + 1); ++ } ++ ++ new_interface_mem->mapcount = tmp_index; ++ new_interface_mem->header.checksum = 0; ++ ++ checksum = grub_efi_loongson_grub_calculatechecksum8(new_interface_mem, new_interface_mem->header.length); ++ new_interface_mem->header.checksum = checksum; ++ } + } + + state.jumpreg = 1; @@ -1988,7 +2220,7 @@ index 0000000..8db6516 + /* Main arguments. */ + size = (linux_argc) * sizeof (grub_uint64_t); + /* Initrd address and size. */ -+ size += 2 * sizeof (grub_uint64_t); ++ size += 3 * sizeof (grub_uint64_t); + /* NULL terminator. */ + size += sizeof (grub_uint64_t); + /* First argument is always "a0". */ @@ -2000,6 +2232,7 @@ index 0000000..8db6516 + /* rd arguments. */ + size += ALIGN_UP (sizeof ("rd_start=0xXXXXXXXXXXXXXXXX"), 4); + size += ALIGN_UP (sizeof ("rd_size=0xXXXXXXXXXXXXXXXX"), 4); ++ size += ALIGN_UP (sizeof ("initrd=0xXXXXXXXXXXXXXXXX,0xXXXXXXXXXXXXXXXX"), 4); + + size = ALIGN_UP (size, 8); + @@ -2028,7 +2261,7 @@ index 0000000..8db6516 + } + + linux_argv = (grub_uint64_t *) linux_args_addr; -+ linux_args = (char *) (linux_argv + (linux_argc + 1 + 2)); ++ linux_args = (char *) (linux_argv + (linux_argc + 1 + 3)); + + grub_memcpy (linux_args, "a0", sizeof ("a0")); + *linux_argv = (grub_uint64_t) (grub_addr_t) linux_args; @@ -2054,6 +2287,12 @@ index 0000000..8db6516 + *linux_argv = 0; + linux_argv++; + ++ /* Reserve space for initrd arguments. */ ++ initrd_addr_arg_off = (grub_uint8_t *) linux_args - linux_args_addr; ++ linux_args += ALIGN_UP (sizeof ("initrd=0xXXXXXXXXXXXXXXXX,0xXXXXXXXXXXXXXXXX"), 4); ++ *linux_argv = 0; ++ linux_argv++; ++ + *linux_argv = 0; + + grub_loader_set (grub_linux_boot, grub_linux_unload, 0); @@ -2116,6 +2355,14 @@ index 0000000..8db6516 + = (grub_uint64_t) ((grub_addr_t) linux_args_addr + rd_size_arg_off); + linux_argc++; + ++ ++ grub_snprintf ((char *) linux_args_addr + initrd_addr_arg_off, ++ sizeof ("initrd=0xXXXXXXXXXXXXXXXX,0xXXXXXXXXXXXXXXXX"), "initrd=0x%lx,0x%lx", ++ ((grub_uint64_t) initrd_dest & 0xffffffff), (grub_uint64_t) size); ++ ((grub_uint64_t *) linux_args_addr)[linux_argc] ++ = (grub_uint64_t) ((grub_addr_t) linux_args_addr + initrd_addr_arg_off); ++ linux_argc++; ++ + initrd_loaded = 1; + + fail: @@ -2312,10 +2559,10 @@ index 0000000..71a0159 +#endif /* ! GRUB_LOADER_MACHINE_HEADER */ diff --git a/include/grub/loongarch64/efi/loongson.h b/include/grub/loongarch64/efi/loongson.h new file mode 100644 -index 0000000..a092803 +index 0000000..fa32ef5 --- /dev/null +++ b/include/grub/loongarch64/efi/loongson.h -@@ -0,0 +1,301 @@ +@@ -0,0 +1,290 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2017 Free Software Foundation, Inc. @@ -2348,21 +2595,10 @@ index 0000000..a092803 + +#define GRUB_EFI_LOONGSON_MMAP_MAX 128 +typedef enum -+ { -+ GRUB_EFI_LOONGSON_SYSTEM_RAM_LOW = 1, -+ GRUB_EFI_LOONGSON_SYSTEM_RAM_HIGH, ++ { ++ GRUB_EFI_LOONGSON_SYSTEM_RAM = 1, + GRUB_EFI_LOONGSON_MEMORY_RESERVED, -+ GRUB_EFI_LOONGSON_PCI_IO, -+ GRUB_EFI_LOONGSON_PCI_MEM, -+ GRUB_EFI_LOONGSON_CFG_REG, -+ GRUB_EFI_LOONGSON_VIDEO_ROM, -+ GRUB_EFI_LOONGSON_ADAPTER_ROM, + GRUB_EFI_LOONGSON_ACPI_TABLE, -+ GRUB_EFI_LOONGSON_SMBIOS_TABLE, -+ GRUB_EFI_LOONGSON_UMA_VIDEO_RAM, -+ GRUB_EFI_LOONGSON_VUMA_VIDEO_RAM, -+ GRUB_EFI_LOONGSON_SYSTEM_RAM_LOW_DMA, -+ GRUB_EFI_LOONGSON_SYSTEM_RAM_HIGH_DMA, + GRUB_EFI_LOONGSON_ACPI_NVS, + GRUB_EFI_LOONGSON_MAX_MEMORY_TYPE + } @@ -2619,17 +2855,23 @@ index 0000000..a092803 +#endif /* ! GRUB_EFI_LOONGSON_HEADER */ diff --git a/include/grub/loongarch64/efi/memory.h b/include/grub/loongarch64/efi/memory.h new file mode 100644 -index 0000000..a89daf6 +index 0000000..b8556c7 --- /dev/null +++ b/include/grub/loongarch64/efi/memory.h -@@ -0,0 +1,8 @@ +@@ -0,0 +1,14 @@ +#ifndef GRUB_MEMORY_CPU_HEADER +#include + -+//#define GRUB_EFI_MAX_USABLE_ADDRESS 0x980000000fffffffUL +#define GRUB_EFI_MAX_USABLE_ADDRESS 0x9800000fffffffffUL +#define GRUB_EFI_MAX_ALLOCATION_ADDRESS GRUB_EFI_MAX_USABLE_ADDRESS + ++static inline grub_uint64_t grub_efi_max_usable_address(void) ++{ ++ grub_uint64_t addr; ++ asm volatile ("csrrd %0, 0x181" : "=r" (addr)); ++ return addr |= 0xffffffffffUL; ++} ++ +#endif /* ! GRUB_MEMORY_CPU_HEADER */ diff --git a/include/grub/loongarch64/efi/time.h b/include/grub/loongarch64/efi/time.h new file mode 100644 @@ -2798,10 +3040,10 @@ index 0000000..ea3be3d +#endif diff --git a/include/grub/loongarch64/memory.h b/include/grub/loongarch64/memory.h new file mode 100644 -index 0000000..b0b61a5 +index 0000000..03398b3 --- /dev/null +++ b/include/grub/loongarch64/memory.h -@@ -0,0 +1,54 @@ +@@ -0,0 +1,57 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2017 Free Software Foundation, Inc. @@ -2844,7 +3086,10 @@ index 0000000..b0b61a5 +static inline void * +grub_map_memory (grub_phys_addr_t a, grub_size_t size) +{ -+ return (void *) (a | 0x9800000000000000UL); ++ grub_uint64_t addr; ++ ++ asm volatile ("csrrd %0, 0x181" : "=r" (addr)); ++ return (void *) (a | (addr & 0xffffffffffffff00UL)); +} + +static inline void @@ -3620,6 +3865,20 @@ index 1bb5eb8..240e193 100644 } } +diff --git a/util/grub-mknetdir.c b/util/grub-mknetdir.c +index ae31271..c998850 100644 +--- a/util/grub-mknetdir.c ++++ b/util/grub-mknetdir.c +@@ -112,7 +112,8 @@ static struct + [GRUB_INSTALL_PLATFORM_X86_64_EFI] = { "x86_64-efi", "efinet", ".efi" }, + [GRUB_INSTALL_PLATFORM_IA64_EFI] = { "ia64-efi", "efinet", ".efi" }, + [GRUB_INSTALL_PLATFORM_ARM_EFI] = { "arm-efi", "efinet", ".efi" }, +- [GRUB_INSTALL_PLATFORM_ARM64_EFI] = { "arm64-efi", "efinet", ".efi" } ++ [GRUB_INSTALL_PLATFORM_ARM64_EFI] = { "arm64-efi", "efinet", ".efi" }, ++ [GRUB_INSTALL_PLATFORM_LOONGARCH64_EFI] = { "loongarch64-efi", "efinet", ".efi" } + }; + + static void diff --git a/util/grub-module-verifier.c b/util/grub-module-verifier.c index 03ba1ab..4a9943a 100644 --- a/util/grub-module-verifier.c diff --git a/grub.patches b/grub.patches index 26e2bb3..fe44744 100644 --- a/grub.patches +++ b/grub.patches @@ -478,8 +478,5 @@ Patch0477: 0477-kern-misc-Add-function-to-check-printf-format-agains.patch Patch0478: 0478-gfxmenu-gui-Check-printf-format-in-the-gui_progress_.patch Patch0479: 0479-kern-mm-Fix-grub_debug_calloc-compilation-error.patch Patch0480: 0480-efi-net-Fix-malformed-device-path-arithmetic-errors-.patch -# Add by Anolis -Patch1000: 0001-grub2-anolis-loongarch64-Add-base-support.patch -Patch1001: 0002-grub2-anolis-loongarch64-fix-virtaddr-and-process-new-interface.patch -Patch1002: 0003-grub2-anolis-loongarch64-Fix-acpi-memmap.patch -Patch1003: 0004-grub2-anolis-mknetdir-Add-loongarch64-efi-support.patch +# Support loongarch64 +Patch1000: 0481-loongarch64-add-support.patch diff --git a/grub2.spec b/grub2.spec index 7584711..75599ca 100644 --- a/grub2.spec +++ b/grub2.spec @@ -1,4 +1,4 @@ -%define anolis_release .0.2 +%define anolis_release .0.3 %undefine _hardened_build @@ -517,6 +517,9 @@ fi %endif %changelog +* Tue Jan 04 2022 Wenlong Zhang - 2.02-99.0.3 +- Add loongarch64 base support + * Thu Aug 12 2021 Guoqi Chen - 2.02-99.0.2 - Add loongarch64 base support -- Gitee