Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/arch/riscv/kvm/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 3 kB image not shown  

Quelle  nacl.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (c) 2024 Ventana Micro Systems Inc.
 */


#include <linux/kvm_host.h>
#include <linux/vmalloc.h>
#include <asm/kvm_nacl.h>

DEFINE_STATIC_KEY_FALSE(kvm_riscv_nacl_available);
DEFINE_STATIC_KEY_FALSE(kvm_riscv_nacl_sync_csr_available);
DEFINE_STATIC_KEY_FALSE(kvm_riscv_nacl_sync_hfence_available);
DEFINE_STATIC_KEY_FALSE(kvm_riscv_nacl_sync_sret_available);
DEFINE_STATIC_KEY_FALSE(kvm_riscv_nacl_autoswap_csr_available);
DEFINE_PER_CPU(struct kvm_riscv_nacl, kvm_riscv_nacl);

void __kvm_riscv_nacl_hfence(void *shmem,
        unsigned long control,
        unsigned long page_num,
        unsigned long page_count)
{
 int i, ent = -1, try_count = 5;
 unsigned long *entp;

again:
 for (i = 0; i < SBI_NACL_SHMEM_HFENCE_ENTRY_MAX; i++) {
  entp = shmem + SBI_NACL_SHMEM_HFENCE_ENTRY_CONFIG(i);
  if (lelong_to_cpu(*entp) & SBI_NACL_SHMEM_HFENCE_CONFIG_PEND)
   continue;

  ent = i;
  break;
 }

 if (ent < 0) {
  if (try_count) {
   nacl_sync_hfence(-1UL);
   goto again;
  } else {
   pr_warn("KVM: No free entry in NACL shared memory\n");
   return;
  }
 }

 entp = shmem + SBI_NACL_SHMEM_HFENCE_ENTRY_CONFIG(i);
 *entp = cpu_to_lelong(control);
 entp = shmem + SBI_NACL_SHMEM_HFENCE_ENTRY_PNUM(i);
 *entp = cpu_to_lelong(page_num);
 entp = shmem + SBI_NACL_SHMEM_HFENCE_ENTRY_PCOUNT(i);
 *entp = cpu_to_lelong(page_count);
}

int kvm_riscv_nacl_enable(void)
{
 int rc;
 struct sbiret ret;
 struct kvm_riscv_nacl *nacl;

 if (!kvm_riscv_nacl_available())
  return 0;
 nacl = this_cpu_ptr(&kvm_riscv_nacl);

 ret = sbi_ecall(SBI_EXT_NACL, SBI_EXT_NACL_SET_SHMEM,
   nacl->shmem_phys, 0, 0, 0, 0, 0);
 rc = sbi_err_map_linux_errno(ret.error);
 if (rc)
  return rc;

 return 0;
}

void kvm_riscv_nacl_disable(void)
{
 if (!kvm_riscv_nacl_available())
  return;

 sbi_ecall(SBI_EXT_NACL, SBI_EXT_NACL_SET_SHMEM,
    SBI_SHMEM_DISABLE, SBI_SHMEM_DISABLE, 0, 0, 0, 0);
}

void kvm_riscv_nacl_exit(void)
{
 int cpu;
 struct kvm_riscv_nacl *nacl;

 if (!kvm_riscv_nacl_available())
  return;

 /* Allocate per-CPU shared memory */
 for_each_possible_cpu(cpu) {
  nacl = per_cpu_ptr(&kvm_riscv_nacl, cpu);
  if (!nacl->shmem)
   continue;

  free_pages((unsigned long)nacl->shmem,
      get_order(SBI_NACL_SHMEM_SIZE));
  nacl->shmem = NULL;
  nacl->shmem_phys = 0;
 }
}

static long nacl_probe_feature(long feature_id)
{
 struct sbiret ret;

 if (!kvm_riscv_nacl_available())
  return 0;

 ret = sbi_ecall(SBI_EXT_NACL, SBI_EXT_NACL_PROBE_FEATURE,
   feature_id, 0, 0, 0, 0, 0);
 return ret.value;
}

int kvm_riscv_nacl_init(void)
{
 int cpu;
 struct page *shmem_page;
 struct kvm_riscv_nacl *nacl;

 if (sbi_spec_version < sbi_mk_version(1, 0) ||
     sbi_probe_extension(SBI_EXT_NACL) <= 0)
  return -ENODEV;

 /* Enable NACL support */
 static_branch_enable(&kvm_riscv_nacl_available);

 /* Probe NACL features */
 if (nacl_probe_feature(SBI_NACL_FEAT_SYNC_CSR))
  static_branch_enable(&kvm_riscv_nacl_sync_csr_available);
 if (nacl_probe_feature(SBI_NACL_FEAT_SYNC_HFENCE))
  static_branch_enable(&kvm_riscv_nacl_sync_hfence_available);
 if (nacl_probe_feature(SBI_NACL_FEAT_SYNC_SRET))
  static_branch_enable(&kvm_riscv_nacl_sync_sret_available);
 if (nacl_probe_feature(SBI_NACL_FEAT_AUTOSWAP_CSR))
  static_branch_enable(&kvm_riscv_nacl_autoswap_csr_available);

 /* Allocate per-CPU shared memory */
 for_each_possible_cpu(cpu) {
  nacl = per_cpu_ptr(&kvm_riscv_nacl, cpu);

  shmem_page = alloc_pages(GFP_KERNEL | __GFP_ZERO,
      get_order(SBI_NACL_SHMEM_SIZE));
  if (!shmem_page) {
   kvm_riscv_nacl_exit();
   return -ENOMEM;
  }
  nacl->shmem = page_to_virt(shmem_page);
  nacl->shmem_phys = page_to_phys(shmem_page);
 }

 return 0;
}

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

¤ 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.