ARMv8: adding debug syscall to get coreboot test working
authorReto Achermann <reto.achermann@inf.ethz.ch>
Sat, 4 Mar 2017 09:52:15 +0000 (10:52 +0100)
committerReto Achermann <reto.achermann@inf.ethz.ch>
Sat, 4 Mar 2017 09:52:15 +0000 (10:52 +0100)
Signed-off-by: Reto Achermann <reto.achermann@inf.ethz.ch>

include/barrelfish_kpi/sys_debug.h
kernel/arch/armv8/syscall.c
usr/drivers/cpuboot/arch/armv8/boot_arch.c

index f7dc3f7..2c7db9d 100644 (file)
@@ -34,7 +34,8 @@ enum debug_message {
     DEBUG_FEIGN_FRAME_CAP,
     DEBUG_TRACE_PMEM_CTRL,
     DEBUG_GET_APIC_ID,
-    DEBUG_CREATE_IRQ_SRC_CAP
+    DEBUG_CREATE_IRQ_SRC_CAP,
+    DEBUG_PSCI_CPU_ON,
 };
 
 #endif //BARRELFISH_KPI_SYS_DEBUG_H
index cdf4d31..a94a081 100644 (file)
@@ -1161,6 +1161,8 @@ static struct sysret handle_debug_syscall(int msg)
     return retval;
 }
 
+#include <psci.h>
+
 /* XXX - function documentation is inconsistent. */
 /**
  * System call dispatch routine.
@@ -1233,9 +1235,15 @@ void sys_syscall(uint64_t a0, uint64_t a1, uint64_t a2, uint64_t a3,
             break;
 
         case SYSCALL_DEBUG:
+            if (a1 == DEBUG_PSCI_CPU_ON) {
+                printf("Invoking PSCI on: cpu=%lx, entry=%lx, context=%lx\n", a2, a3, a4);
+                r.error = psci_cpu_on(a2, a3, a4);
+                break;
+            }
             if (argc == 2) {
                 r = handle_debug_syscall(a1);
             }
+
             break;
 
         default:
index d6e9aad..f78d03e 100644 (file)
@@ -174,34 +174,14 @@ get_module_info(const char *name, struct module_blob *blob)
     return SYS_ERR_OK;
 }
 
-#if 0
-
-/* Return the first program header of type 'type'. */
-static struct Elf64_Phdr *
-elf64_find_segment_type(void *elfdata, uint32_t type) {
-    struct Elf64_Ehdr *ehdr= (struct Elf64_Ehdr *)elfdata;
-
-    if(!IS_ELF(*ehdr)
-             || ehdr->e_ident[EI_CLASS] != ELFCLASS64
-             || ehdr->e_machine != EM_AARCH64) {
-        debug_printf("IS_ELF(*ehdr)=%u, ehdr->e_ident[EI_CLASS] != ELFCLASS64=%u, ehdr->e_machine != EM_AARCH64=%u",
-                     IS_ELF(*ehdr), ehdr->e_ident[EI_CLASS] != ELFCLASS64,ehdr->e_machine != EM_AARCH64);
-        return NULL;
-    }
-
-    void *phdrs_base= (void *)(elfdata + ehdr->e_phoff);
-
-    for(size_t i= 0; i < ehdr->e_phnum; i++) {
-        struct Elf64_Phdr *phdr= phdrs_base + i * ehdr->e_phentsize;
 
-        if(phdr->p_type == type) {
-            return phdr;
-        }
-    }
+#include <barrelfish_kpi/sys_debug.h>
 
-    return NULL;
+static errval_t sys_debug_invoke_psci(uintptr_t target, lpaddr_t entry, lpaddr_t context)
+{
+    struct sysret sr = syscall5(SYSCALL_DEBUG, DEBUG_PSCI_CPU_ON, target, entry, context);
+    return sr.error;
 }
-#endif
 
 errval_t spawn_xcore_monitor(coreid_t coreid, hwid_t hwid,
                              enum cpu_type cpu_type,
@@ -209,6 +189,9 @@ errval_t spawn_xcore_monitor(coreid_t coreid, hwid_t hwid,
                              struct frame_identity urpc_frame_id,
                              struct capref kcb)
 {
+
+    DEBUG("Booting: %" PRIuCOREID ", hwid=%" PRIxHWID "\n", coreid, hwid);
+
     static char cpuname[256], monitorname[256];
     genpaddr_t arch_page_size;
     errval_t err;
@@ -303,20 +286,9 @@ errval_t spawn_xcore_monitor(coreid_t coreid, hwid_t hwid,
                    symtab->sh_size,
                    state.elfbase, state.vbase);
 
-
-  //  "psci_boot_entry"
-  //  "parking_boot_entry"
-
-    struct Elf64_Sym *entry_sym =
-    elf64_find_symbol_by_name(cpu_binary.vaddr, cpu_binary.size,
-                              "psci_boot_entry", 0, STT_FUNC, NULL);
-
-
-    genvaddr_t cpu_reloc_entry = entry_sym->st_value - state.elfbase
+    genvaddr_t cpu_reloc_entry = cpu_entry - state.elfbase
                                  + cpu_mem.frameid.base + arch_page_size;
 
-    DEBUG("using psci_boot_entry @ %lx, reloc: %lx\n", entry_sym->st_value , cpu_reloc_entry);
-
     struct armv8_core_data *core_data = (struct armv8_core_data *)cpu_mem.buf;
 
     core_data->stack = stack_mem.frameid.base;
@@ -365,8 +337,10 @@ errval_t spawn_xcore_monitor(coreid_t coreid, hwid_t hwid,
 
     /* start */
 
-    //invoke_start_cpu(hwid, cpu_reloc_entry, core_data, type);
-
+    debug_printf("invoking PSCI_START hwid=%lx entry=%lx context=%lx\n",
+                 hwid, cpu_reloc_entry, cpu_mem.frameid.base);
+    err = sys_debug_invoke_psci(hwid, cpu_reloc_entry, cpu_mem.frameid.base);
+    DEBUG_ERR(err, "sys_debug_invoke_psci");
 
 
     err = mem_free(&stack_mem);
@@ -382,7 +356,7 @@ errval_t spawn_xcore_monitor(coreid_t coreid, hwid_t hwid,
     if (err_is_fail(err)) {
         USER_PANIC_ERR(err, "cap_destroy failed");
     }
-    return LIB_ERR_NOT_IMPLEMENTED;
+    return SYS_ERR_OK;
 }
 
 errval_t get_core_info(coreid_t core_id, hwid_t* hw_id, enum cpu_type* cpu_type)
@@ -393,13 +367,16 @@ errval_t get_core_info(coreid_t core_id, hwid_t* hw_id, enum cpu_type* cpu_type)
         goto out;
     }
 
+
     uint64_t enabled, type, barrelfish_id;
     err = oct_read(record, "_ { " HW_PROCESSOR_GENERIC_FIELDS " }",
-                   &enabled, &barrelfish_id, &hw_id, &type);
+                   &enabled, &barrelfish_id, hw_id, &type);
     if (err_is_fail(err)) {
         goto out;
     }
 
+    debug_printf("Get Core Info: %" PRIuCOREID ", hwid=%" PRIxHWID "\n", core_id, *hw_id);
+
     if (!enabled) {
         /* XXX: better error code */
         err = SYS_ERR_CORE_NOT_FOUND;