grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v3 7/8] LoongArch: Add auxiliary files


From: Xiaotian Wu
Subject: [PATCH v3 7/8] LoongArch: Add auxiliary files
Date: Sun, 27 Mar 2022 21:35:12 +0800

Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Signed-off-by: Zhou Yang <zhouyang@loongson.cn>
---
 grub-core/kern/efi/mm.c                  |   3 +-
 grub-core/kern/loongarch64/cache.c       |  39 +++++++++
 grub-core/kern/loongarch64/cache_flush.S |  33 +++++++
 grub-core/kern/loongarch64/efi/init.c    |  77 ++++++++++++++++
 grub-core/lib/efi/halt.c                 |   2 +-
 include/grub/efi/efi.h                   |   2 +-
 include/grub/loongarch64/efi/memory.h    |  24 +++++
 include/grub/loongarch64/reloc.h         | 107 +++++++++++++++++++++++
 include/grub/loongarch64/time.h          |  28 ++++++
 include/grub/loongarch64/types.h         |  34 +++++++
 10 files changed, 346 insertions(+), 3 deletions(-)
 create mode 100644 grub-core/kern/loongarch64/cache.c
 create mode 100644 grub-core/kern/loongarch64/cache_flush.S
 create mode 100644 grub-core/kern/loongarch64/efi/init.c
 create mode 100644 include/grub/loongarch64/efi/memory.h
 create mode 100644 include/grub/loongarch64/reloc.h
 create mode 100644 include/grub/loongarch64/time.h
 create mode 100644 include/grub/loongarch64/types.h

diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
index d8e411454..1dce99882 100644
--- a/grub-core/kern/efi/mm.c
+++ b/grub-core/kern/efi/mm.c
@@ -659,7 +659,8 @@ grub_efi_mm_init (void)
                       2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE));
 }
 
-#if defined (__aarch64__) || defined (__arm__) || defined (__riscv)
+#if defined (__aarch64__) || defined (__arm__) || defined (__riscv) || \
+  defined (__loongarch__)
 grub_err_t
 grub_efi_get_ram_base(grub_addr_t *base_addr)
 {
diff --git a/grub-core/kern/loongarch64/cache.c 
b/grub-core/kern/loongarch64/cache.c
new file mode 100644
index 000000000..43d314df9
--- /dev/null
+++ b/grub-core/kern/loongarch64/cache.c
@@ -0,0 +1,39 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2022 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/cache.h>
+#include <grub/misc.h>
+
+/* Prototypes for asm functions. */
+void grub_arch_clean_dcache_range (void);
+void grub_arch_invalidate_icache_range (void);
+
+void
+grub_arch_sync_caches (void *address __attribute__((unused)),
+                      grub_size_t len __attribute__((unused)))
+{
+  grub_arch_clean_dcache_range ();
+  grub_arch_invalidate_icache_range ();
+}
+
+void
+grub_arch_sync_dma_caches (volatile void *address __attribute__((unused)),
+                          grub_size_t len __attribute__((unused)))
+{
+  /* DMA non-coherent devices not supported yet */
+}
diff --git a/grub-core/kern/loongarch64/cache_flush.S 
b/grub-core/kern/loongarch64/cache_flush.S
new file mode 100644
index 000000000..43b97d822
--- /dev/null
+++ b/grub-core/kern/loongarch64/cache_flush.S
@@ -0,0 +1,33 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2022 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/symbol.h>
+
+       .file   "cache_flush.S"
+       .text
+/*
+ * No further work to do because cache consistency is maintained by hardware on
+ * LoongArch.
+ */
+FUNCTION(grub_arch_clean_dcache_range)
+       dbar 0
+       jr $ra
+
+FUNCTION(grub_arch_invalidate_icache_range)
+       ibar 0
+       jr $ra
diff --git a/grub-core/kern/loongarch64/efi/init.c 
b/grub-core/kern/loongarch64/efi/init.c
new file mode 100644
index 000000000..8cbeafaba
--- /dev/null
+++ b/grub-core/kern/loongarch64/efi/init.c
@@ -0,0 +1,77 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2022 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/env.h>
+#include <grub/kernel.h>
+#include <grub/misc.h>
+#include <grub/mm.h>
+#include <grub/time.h>
+#include <grub/efi/efi.h>
+#include <grub/loader.h>
+
+#define EFI_TIMER_PERIOD_MILLISECONDS(ms) ((grub_uint64_t)(ms * 10000))
+
+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
+grub_loongson_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, grub_loongson_increment_timer, NULL, 
&tmr_evt);
+  efi_call_3 (b->set_timer, tmr_evt, GRUB_EFI_TIMER_PERIODIC, 
EFI_TIMER_PERIOD_MILLISECONDS(10));
+
+  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 ();
+
+  if (!(flags & GRUB_LOADER_FLAG_EFI_KEEP_ALLOCATED_MEMORY))
+    grub_efi_memory_fini ();
+}
diff --git a/grub-core/lib/efi/halt.c b/grub-core/lib/efi/halt.c
index 29d413641..e6356894a 100644
--- a/grub-core/lib/efi/halt.c
+++ b/grub-core/lib/efi/halt.c
@@ -31,7 +31,7 @@ grub_halt (void)
   grub_machine_fini (GRUB_LOADER_FLAG_NORETURN |
                     GRUB_LOADER_FLAG_EFI_KEEP_ALLOCATED_MEMORY);
 #if !defined(__ia64__) && !defined(__arm__) && !defined(__aarch64__) && \
-    !defined(__riscv)
+    !defined(__loongarch__) && !defined(__riscv)
   grub_acpi_halt ();
 #endif
   efi_call_4 (grub_efi_system_table->runtime_services->reset_system,
diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h
index eb2dfdfce..6f1a6254e 100644
--- a/include/grub/efi/efi.h
+++ b/include/grub/efi/efi.h
@@ -98,7 +98,7 @@ extern void (*EXPORT_VAR(grub_efi_net_config)) 
(grub_efi_handle_t hnd,
                                                char **device,
                                                char **path);
 
-#if defined(__arm__) || defined(__aarch64__) || defined(__riscv)
+#if defined(__arm__) || defined(__aarch64__) || defined(__riscv) || 
defined(__loongarch__)
 void *EXPORT_FUNC(grub_efi_get_firmware_fdt)(void);
 grub_err_t EXPORT_FUNC(grub_efi_get_ram_base)(grub_addr_t *);
 #include <grub/cpu/linux.h>
diff --git a/include/grub/loongarch64/efi/memory.h 
b/include/grub/loongarch64/efi/memory.h
new file mode 100644
index 000000000..ca8dbfea5
--- /dev/null
+++ b/include/grub/loongarch64/efi/memory.h
@@ -0,0 +1,24 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2022 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_MEMORY_CPU_HEADER
+#include <grub/efi/memory.h>
+
+#define GRUB_EFI_MAX_USABLE_ADDRESS 0xffffffffffffULL
+
+#endif /* ! GRUB_MEMORY_CPU_HEADER */
diff --git a/include/grub/loongarch64/reloc.h b/include/grub/loongarch64/reloc.h
new file mode 100644
index 000000000..3f6b0792a
--- /dev/null
+++ b/include/grub/loongarch64/reloc.h
@@ -0,0 +1,107 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2022 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_LOONGARCH64_RELOC_H
+#define GRUB_LOONGARCH64_RELOC_H 1
+#include <grub/types.h>
+
+#define LOONGARCH64_STACK_MAX 16
+
+struct grub_loongarch64_stack
+{
+  grub_uint64_t data[LOONGARCH64_STACK_MAX];
+  int count;
+  int top;
+};
+
+typedef struct grub_loongarch64_stack* grub_loongarch64_stack_t;
+
+void grub_loongarch64_stack_init            (grub_loongarch64_stack_t stack);
+void grub_loongarch64_sop_push              (grub_loongarch64_stack_t stack,
+                                             grub_int64_t offset);
+void grub_loongarch64_sop_sub               (grub_loongarch64_stack_t stack);
+void grub_loongarch64_sop_sl                (grub_loongarch64_stack_t stack);
+void grub_loongarch64_sop_sr                (grub_loongarch64_stack_t stack);
+void grub_loongarch64_sop_add               (grub_loongarch64_stack_t stack);
+void grub_loongarch64_sop_and               (grub_loongarch64_stack_t stack);
+void grub_loongarch64_sop_if_else           (grub_loongarch64_stack_t stack);
+void grub_loongarch64_sop_32_s_10_5         (grub_loongarch64_stack_t stack,
+                                             grub_uint64_t *place);
+void grub_loongarch64_sop_32_u_10_12        (grub_loongarch64_stack_t stack,
+                                             grub_uint64_t *place);
+void grub_loongarch64_sop_32_s_10_12        (grub_loongarch64_stack_t stack,
+                                             grub_uint64_t *place);
+void grub_loongarch64_sop_32_s_10_16        (grub_loongarch64_stack_t stack,
+                                             grub_uint64_t *place);
+void grub_loongarch64_sop_32_s_10_16_s2             (grub_loongarch64_stack_t 
stack,
+                                             grub_uint64_t *place);
+void grub_loongarch64_sop_32_s_5_20         (grub_loongarch64_stack_t stack,
+                                             grub_uint64_t *place);
+void grub_loongarch64_sop_32_s_0_5_10_16_s2  (grub_loongarch64_stack_t stack,
+                                             grub_uint64_t *place);
+void grub_loongarch64_sop_32_s_0_10_10_16_s2 (grub_loongarch64_stack_t stack,
+                                             grub_uint64_t *place);
+
+#define GRUB_LOONGARCH64_RELOCATION(STACK, PLACE, OFFSET)      \
+  case R_LARCH_SOP_PUSH_ABSOLUTE:                              \
+    grub_loongarch64_sop_push (STACK, OFFSET);                 \
+    break;                                                     \
+  case R_LARCH_SOP_SUB:                                                \
+    grub_loongarch64_sop_sub (STACK);                          \
+    break;                                                     \
+  case R_LARCH_SOP_SL:                                         \
+    grub_loongarch64_sop_sl (STACK);                           \
+    break;                                                     \
+  case R_LARCH_SOP_SR:                                         \
+    grub_loongarch64_sop_sr (STACK);                           \
+    break;                                                     \
+  case R_LARCH_SOP_ADD:                                                \
+    grub_loongarch64_sop_add (STACK);                          \
+    break;                                                     \
+  case R_LARCH_SOP_AND:                                                \
+    grub_loongarch64_sop_and (STACK);                          \
+    break;                                                     \
+  case R_LARCH_SOP_IF_ELSE:                                    \
+    grub_loongarch64_sop_if_else (STACK);                      \
+    break;                                                     \
+  case R_LARCH_SOP_POP_32_S_10_5:                              \
+    grub_loongarch64_sop_32_s_10_5 (STACK, PLACE);             \
+    break;                                                     \
+  case R_LARCH_SOP_POP_32_U_10_12:                             \
+    grub_loongarch64_sop_32_u_10_12 (STACK, PLACE);            \
+    break;                                                     \
+  case R_LARCH_SOP_POP_32_S_10_12:                             \
+    grub_loongarch64_sop_32_s_10_12 (STACK, PLACE);            \
+    break;                                                     \
+  case R_LARCH_SOP_POP_32_S_10_16:                             \
+    grub_loongarch64_sop_32_s_10_16 (STACK, PLACE);            \
+    break;                                                     \
+  case R_LARCH_SOP_POP_32_S_10_16_S2:                          \
+    grub_loongarch64_sop_32_s_10_16_s2 (STACK, PLACE);         \
+    break;                                                     \
+  case R_LARCH_SOP_POP_32_S_5_20:                              \
+    grub_loongarch64_sop_32_s_5_20 (STACK, PLACE);             \
+    break;                                                     \
+  case R_LARCH_SOP_POP_32_S_0_5_10_16_S2:                      \
+    grub_loongarch64_sop_32_s_0_5_10_16_s2 (STACK, PLACE);     \
+    break;                                                     \
+  case R_LARCH_SOP_POP_32_S_0_10_10_16_S2:                     \
+    grub_loongarch64_sop_32_s_0_10_10_16_s2 (STACK, PLACE);    \
+    break;
+
+#endif /* GRUB_LOONGARCH64_RELOC_H */
diff --git a/include/grub/loongarch64/time.h b/include/grub/loongarch64/time.h
new file mode 100644
index 000000000..e5724bd83
--- /dev/null
+++ b/include/grub/loongarch64/time.h
@@ -0,0 +1,28 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2022 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KERNEL_CPU_TIME_HEADER
+#define KERNEL_CPU_TIME_HEADER 1
+
+static inline void
+grub_cpu_idle(void)
+{
+  __asm__ __volatile__("idle 0");
+}
+
+#endif
diff --git a/include/grub/loongarch64/types.h b/include/grub/loongarch64/types.h
new file mode 100644
index 000000000..a9e09171a
--- /dev/null
+++ b/include/grub/loongarch64/types.h
@@ -0,0 +1,34 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2022 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_TYPES_CPU_HEADER
+#define GRUB_TYPES_CPU_HEADER  1
+
+/* The size of void *.  */
+#define GRUB_TARGET_SIZEOF_VOID_P      8
+
+/* The size of long.  */
+#define GRUB_TARGET_SIZEOF_LONG                8
+
+/* LoongArch is little-endian.  */
+#undef GRUB_TARGET_WORDS_BIGENDIAN
+
+/* Unaligned accesses are only supported if MMU is enabled.  */
+#undef GRUB_HAVE_UNALIGNED_ACCESS
+
+#endif /* ! GRUB_TYPES_CPU_HEADER */
-- 
2.20.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]