2005-04-16 15:20:36 -07:00
/*
2008-08-02 10:55:55 +01:00
* arch / arm / include / asm / domain . h
2005-04-16 15:20:36 -07:00
*
* Copyright ( C ) 1999 Russell King .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# ifndef __ASM_PROC_DOMAIN_H
# define __ASM_PROC_DOMAIN_H
2012-03-28 18:30:01 +01:00
# ifndef __ASSEMBLY__
# include <asm/barrier.h>
2015-09-11 08:34:52 +01:00
# include <asm/thread_info.h>
2012-03-28 18:30:01 +01:00
# endif
2005-04-16 15:20:36 -07:00
/*
* Domain numbers
*
* DOMAIN_IO - domain 2 includes all IO only
* DOMAIN_USER - domain 1 includes all user memory only
* DOMAIN_KERNEL - domain 0 includes all kernel memory only
2006-03-28 21:00:40 +01:00
*
* The domain numbering depends on whether we support 36 physical
* address for I / O or not . Addresses above the 32 bit boundary can
* only be mapped using supersections and supersections can only
* be set for domain 0. We could just default to DOMAIN_IO as zero ,
* but there may be systems with supersection support and no 36 - bit
* addressing . In such cases , we want to map system memory with
* supersections to reduce TLB misses and footprint .
*
* 36 - bit addressing and supersections are only available on
* CPUs based on ARMv6 + or the Intel XSC3 core .
2005-04-16 15:20:36 -07:00
*/
2006-03-28 21:00:40 +01:00
# ifndef CONFIG_IO_36
2005-04-16 15:20:36 -07:00
# define DOMAIN_KERNEL 0
# define DOMAIN_USER 1
# define DOMAIN_IO 2
2006-03-28 21:00:40 +01:00
# else
# define DOMAIN_KERNEL 2
# define DOMAIN_USER 1
# define DOMAIN_IO 0
# endif
2015-08-21 09:38:31 +01:00
# define DOMAIN_VECTORS 3
2005-04-16 15:20:36 -07:00
/*
* Domain types
*/
# define DOMAIN_NOACCESS 0
# define DOMAIN_CLIENT 1
2010-09-13 16:03:21 +01:00
# ifdef CONFIG_CPU_USE_DOMAINS
2005-04-16 15:20:36 -07:00
# define DOMAIN_MANAGER 3
2010-09-13 16:03:21 +01:00
# else
# define DOMAIN_MANAGER 1
# endif
2005-04-16 15:20:36 -07:00
2015-08-19 22:36:24 +01:00
# define domain_mask(dom) ((3) << (2 * (dom)))
# define domain_val(dom,type) ((type) << (2 * (dom)))
2005-04-16 15:20:36 -07:00
2015-08-19 20:40:41 +01:00
# ifdef CONFIG_CPU_SW_DOMAIN_PAN
# define DACR_INIT \
( domain_val ( DOMAIN_USER , DOMAIN_NOACCESS ) | \
domain_val ( DOMAIN_KERNEL , DOMAIN_MANAGER ) | \
domain_val ( DOMAIN_IO , DOMAIN_CLIENT ) | \
domain_val ( DOMAIN_VECTORS , DOMAIN_CLIENT ) )
# else
2015-08-21 09:23:26 +01:00
# define DACR_INIT \
2015-08-21 09:30:16 +01:00
( domain_val ( DOMAIN_USER , DOMAIN_CLIENT ) | \
2015-08-21 09:23:26 +01:00
domain_val ( DOMAIN_KERNEL , DOMAIN_MANAGER ) | \
2015-08-21 09:38:31 +01:00
domain_val ( DOMAIN_IO , DOMAIN_CLIENT ) | \
domain_val ( DOMAIN_VECTORS , DOMAIN_CLIENT ) )
2015-08-19 20:40:41 +01:00
# endif
# define __DACR_DEFAULT \
domain_val ( DOMAIN_KERNEL , DOMAIN_CLIENT ) | \
domain_val ( DOMAIN_IO , DOMAIN_CLIENT ) | \
domain_val ( DOMAIN_VECTORS , DOMAIN_CLIENT )
# define DACR_UACCESS_DISABLE \
( __DACR_DEFAULT | domain_val ( DOMAIN_USER , DOMAIN_NOACCESS ) )
# define DACR_UACCESS_ENABLE \
( __DACR_DEFAULT | domain_val ( DOMAIN_USER , DOMAIN_CLIENT ) )
2015-08-21 09:23:26 +01:00
2005-04-16 15:20:36 -07:00
# ifndef __ASSEMBLY__
2006-06-20 20:46:52 +01:00
2016-05-04 10:39:02 +01:00
# ifdef CONFIG_CPU_CP15_MMU
2015-08-19 21:23:48 +01:00
static inline unsigned int get_domain ( void )
{
unsigned int domain ;
asm (
" mrc p15, 0, %0, c3, c0 @ get domain "
2015-09-11 08:34:52 +01:00
: " =r " ( domain )
: " m " ( current_thread_info ( ) - > cpu_domain ) ) ;
2015-08-19 21:23:48 +01:00
return domain ;
}
2012-07-04 17:05:28 +01:00
static inline void set_domain ( unsigned val )
{
asm volatile (
" mcr p15, 0, %0, c3, c0 @ set domain "
2015-09-11 08:34:52 +01:00
: : " r " ( val ) : " memory " ) ;
2012-07-04 17:05:28 +01:00
isb ( ) ;
}
2016-05-04 10:39:02 +01:00
# else
static inline unsigned int get_domain ( void )
{
return 0 ;
}
static inline void set_domain ( unsigned val )
{
}
# endif
2005-04-16 15:20:36 -07:00
2015-08-19 20:40:41 +01:00
# ifdef CONFIG_CPU_USE_DOMAINS
2005-04-16 15:20:36 -07:00
# define modify_domain(dom,type) \
do { \
2015-08-19 21:23:48 +01:00
unsigned int domain = get_domain ( ) ; \
2015-08-19 22:36:24 +01:00
domain & = ~ domain_mask ( dom ) ; \
2015-08-19 21:23:48 +01:00
domain = domain | domain_val ( dom , type ) ; \
set_domain ( domain ) ; \
2005-04-16 15:20:36 -07:00
} while ( 0 )
2006-06-20 20:46:52 +01:00
# else
2012-07-04 17:05:28 +01:00
static inline void modify_domain ( unsigned dom , unsigned type ) { }
2006-06-20 20:46:52 +01:00
# endif
2010-09-13 16:03:21 +01:00
/*
* Generate the T ( user ) versions of the LDR / STR and related
* instructions ( inline assembly )
*/
# ifdef CONFIG_CPU_USE_DOMAINS
2012-01-25 11:38:13 +01:00
# define TUSER(instr) #instr "t"
2010-09-13 16:03:21 +01:00
# else
2012-01-25 11:38:13 +01:00
# define TUSER(instr) #instr
2005-04-16 15:20:36 -07:00
# endif
2010-09-13 16:03:21 +01:00
# else /* __ASSEMBLY__ */
/*
* Generate the T ( user ) versions of the LDR / STR and related
* instructions
*/
# ifdef CONFIG_CPU_USE_DOMAINS
2012-01-25 11:38:13 +01:00
# define TUSER(instr) instr ## t
2010-09-13 16:03:21 +01:00
# else
2012-01-25 11:38:13 +01:00
# define TUSER(instr) instr
2010-09-13 16:03:21 +01:00
# endif
# endif /* __ASSEMBLY__ */
# endif /* !__ASM_PROC_DOMAIN_H */