1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Author: Huacai Chen <chenhuacai@loongson.cn> 4 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 5 */ 6 7 #ifndef __ASSEMBLY__ 8 9 #include <asm/asm.h> 10 #include <asm/page.h> 11 #include <asm/vdso.h> 12 13 struct vdso_pcpu_data { 14 u32 node; 15 } ____cacheline_aligned_in_smp; 16 17 struct loongarch_vdso_data { 18 struct vdso_pcpu_data pdata[NR_CPUS]; 19 struct vdso_data data[CS_BASES]; /* Arch-independent data */ 20 }; 21 22 #define VDSO_DATA_SIZE PAGE_ALIGN(sizeof(struct loongarch_vdso_data)) 23 24 static inline unsigned long get_vdso_base(void) 25 { 26 unsigned long addr; 27 28 __asm__( 29 " la.pcrel %0, _start\n" 30 : "=r" (addr) 31 : 32 :); 33 34 return addr; 35 } 36 37 static inline const struct vdso_data *get_vdso_data(void) 38 { 39 return (const struct vdso_data *)(get_vdso_base() 40 - VDSO_DATA_SIZE + SMP_CACHE_BYTES * NR_CPUS); 41 } 42 43 #endif /* __ASSEMBLY__ */ 44