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