45 lines
1.0 KiB
C
45 lines
1.0 KiB
C
/*
|
|
* Copyright (C) 2010 Imagination Technologies
|
|
*/
|
|
|
|
#ifndef __ASM_METAG_USER_GATEWAY_H
|
|
#define __ASM_METAG_USER_GATEWAY_H
|
|
|
|
#include <asm/page.h>
|
|
|
|
/* Page of kernel code accessible to userspace. */
|
|
#define USER_GATEWAY_PAGE 0x6ffff000
|
|
/* Offset of TLS pointer array in gateway page. */
|
|
#define USER_GATEWAY_TLS 0x100
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
extern char __user_gateway_start;
|
|
extern char __user_gateway_end;
|
|
|
|
/* Kernel mapping of the gateway page. */
|
|
extern void *gateway_page;
|
|
|
|
static inline void set_gateway_tls(void __user *tls_ptr)
|
|
{
|
|
void **gateway_tls = (void **)(gateway_page + USER_GATEWAY_TLS +
|
|
hard_processor_id() * 4);
|
|
|
|
*gateway_tls = (__force void *)tls_ptr;
|
|
#ifdef CONFIG_METAG_META12
|
|
/* Avoid cache aliases on virtually tagged cache. */
|
|
__builtin_dcache_flush((void *)USER_GATEWAY_PAGE + USER_GATEWAY_TLS +
|
|
hard_processor_id() * sizeof(void *));
|
|
#endif
|
|
}
|
|
|
|
extern int __kuser_get_tls(void);
|
|
extern char *__kuser_get_tls_end[];
|
|
|
|
extern int __kuser_cmpxchg(int, int, unsigned long *);
|
|
extern char *__kuser_cmpxchg_end[];
|
|
|
|
#endif
|
|
|
|
#endif
|