Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/firmware/efi/libstub/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 2 kB image not shown  

Quelle  riscv.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (C) 2020 Western Digital Corporation or its affiliates.
 */


#include <linux/efi.h>
#include <linux/libfdt.h>

#include <asm/efi.h>
#include <linux/unaligned.h>

#include "efistub.h"

typedef void __noreturn (*jump_kernel_func)(unsigned longunsigned long);

static unsigned long hartid;

static int get_boot_hartid_from_fdt(void)
{
 const void *fdt;
 int chosen_node, len;
 const void *prop;

 fdt = get_efi_config_table(DEVICE_TREE_GUID);
 if (!fdt)
  return -EINVAL;

 chosen_node = fdt_path_offset(fdt, "/chosen");
 if (chosen_node < 0)
  return -EINVAL;

 prop = fdt_getprop((void *)fdt, chosen_node, "boot-hartid", &len);
 if (!prop)
  return -EINVAL;

 if (len == sizeof(u32))
  hartid = (unsigned long) fdt32_to_cpu(*(fdt32_t *)prop);
 else if (len == sizeof(u64))
  hartid = (unsigned long) fdt64_to_cpu(__get_unaligned_t(fdt64_t, prop));
 else
  return -EINVAL;

 return 0;
}

static efi_status_t get_boot_hartid_from_efi(void)
{
 efi_guid_t boot_protocol_guid = RISCV_EFI_BOOT_PROTOCOL_GUID;
 struct riscv_efi_boot_protocol *boot_protocol;
 efi_status_t status;

 status = efi_bs_call(locate_protocol, &boot_protocol_guid, NULL,
        (void **)&boot_protocol);
 if (status != EFI_SUCCESS)
  return status;
 return efi_call_proto(boot_protocol, get_boot_hartid, &hartid);
}

efi_status_t check_platform_features(void)
{
 efi_status_t status;
 int ret;

 status = get_boot_hartid_from_efi();
 if (status != EFI_SUCCESS) {
  ret = get_boot_hartid_from_fdt();
  if (ret) {
   efi_err("Failed to get boot hartid!\n");
   return EFI_UNSUPPORTED;
  }
 }
 return EFI_SUCCESS;
}

unsigned long __weak stext_offset(void)
{
 /*
 * This fallback definition is used by the EFI zboot stub, which loads
 * the entire image so it can branch via the image header at offset #0.
 */

 return 0;
}

void __noreturn efi_enter_kernel(unsigned long entrypoint, unsigned long fdt,
     unsigned long fdt_size)
{
 unsigned long kernel_entry = entrypoint + stext_offset();
 jump_kernel_func jump_kernel = (jump_kernel_func)kernel_entry;

 /*
 * Jump to real kernel here with following constraints.
 * 1. MMU should be disabled.
 * 2. a0 should contain hartid
 * 3. a1 should DT address
 */

 csr_write(CSR_SATP, 0);
 jump_kernel(hartid, fdt);
}

Messung V0.5
C=92 H=96 G=93

¤ Dauer der Verarbeitung: 0.2 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.