1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * Copyright (C) 2020 Loongson Technology Corporation Limited 4 * Author: Huacai Chen <chenhuacai@loongson.cn> 5 */ 6 7#ifndef __ASSEMBLY__ 8 9#include <asm/asm.h> 10#include <asm/page.h> 11#include <asm/vdso.h> 12 13struct vdso_pcpu_data { 14 u32 node; 15} ____cacheline_aligned_in_smp; 16 17struct loongarch_vdso_data { 18 struct vdso_pcpu_data pdata[NR_CPUS]; 19}; 20 21/* 22 * The layout of vvar: 23 * 24 * high 25 * +---------------------+--------------------------+ 26 * | loongarch vdso data | LOONGARCH_VDSO_DATA_SIZE | 27 * +---------------------+--------------------------+ 28 * | time-ns vdso data | PAGE_SIZE | 29 * +---------------------+--------------------------+ 30 * | generic vdso data | PAGE_SIZE | 31 * +---------------------+--------------------------+ 32 * low 33 */ 34#define LOONGARCH_VDSO_DATA_SIZE PAGE_ALIGN(sizeof(struct loongarch_vdso_data)) 35#define LOONGARCH_VDSO_DATA_PAGES (LOONGARCH_VDSO_DATA_SIZE >> PAGE_SHIFT) 36 37enum vvar_pages { 38 VVAR_GENERIC_PAGE_OFFSET, 39 VVAR_TIMENS_PAGE_OFFSET, 40 VVAR_LOONGARCH_PAGES_START, 41 VVAR_LOONGARCH_PAGES_END = VVAR_LOONGARCH_PAGES_START + LOONGARCH_VDSO_DATA_PAGES - 1, 42 VVAR_NR_PAGES, 43}; 44 45#define VVAR_SIZE (VVAR_NR_PAGES << PAGE_SHIFT) 46 47static inline unsigned long get_vdso_base(void) 48{ 49 unsigned long addr; 50 51 __asm__( 52 " la.pcrel %0, _start \n" 53 : "=r" (addr) 54 : 55 :); 56 57 return addr; 58} 59 60static inline unsigned long get_vdso_data(void) 61{ 62 return get_vdso_base() - VVAR_SIZE; 63} 64 65#endif /* __ASSEMBLY__ */ 66