cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

early_alloc.c (1331B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) 2020 Google LLC
      4 * Author: Quentin Perret <qperret@google.com>
      5 */
      6
      7#include <asm/kvm_pgtable.h>
      8
      9#include <nvhe/early_alloc.h>
     10#include <nvhe/memory.h>
     11
     12struct kvm_pgtable_mm_ops hyp_early_alloc_mm_ops;
     13s64 __ro_after_init hyp_physvirt_offset;
     14
     15static unsigned long base;
     16static unsigned long end;
     17static unsigned long cur;
     18
     19unsigned long hyp_early_alloc_nr_used_pages(void)
     20{
     21	return (cur - base) >> PAGE_SHIFT;
     22}
     23
     24void *hyp_early_alloc_contig(unsigned int nr_pages)
     25{
     26	unsigned long size = (nr_pages << PAGE_SHIFT);
     27	void *ret = (void *)cur;
     28
     29	if (!nr_pages)
     30		return NULL;
     31
     32	if (end - cur < size)
     33		return NULL;
     34
     35	cur += size;
     36	memset(ret, 0, size);
     37
     38	return ret;
     39}
     40
     41void *hyp_early_alloc_page(void *arg)
     42{
     43	return hyp_early_alloc_contig(1);
     44}
     45
     46static void hyp_early_alloc_get_page(void *addr) { }
     47static void hyp_early_alloc_put_page(void *addr) { }
     48
     49void hyp_early_alloc_init(void *virt, unsigned long size)
     50{
     51	base = cur = (unsigned long)virt;
     52	end = base + size;
     53
     54	hyp_early_alloc_mm_ops.zalloc_page = hyp_early_alloc_page;
     55	hyp_early_alloc_mm_ops.phys_to_virt = hyp_phys_to_virt;
     56	hyp_early_alloc_mm_ops.virt_to_phys = hyp_virt_to_phys;
     57	hyp_early_alloc_mm_ops.get_page = hyp_early_alloc_get_page;
     58	hyp_early_alloc_mm_ops.put_page = hyp_early_alloc_put_page;
     59}