ARM: domains: get rid of manager mode for user domain
[deliverable/linux.git] / arch / arm / include / asm / domain.h
index 6ddbe446425e11524d927b5cd8b479bcd2419238..08b601e69ddce08c44e5ea08e030c211a21f0c1b 100644 (file)
 #define DOMAIN_MANAGER 1
 #endif
 
-#define domain_val(dom,type)   ((type) << (2*(dom)))
+#define domain_mask(dom)       ((3) << (2 * (dom)))
+#define domain_val(dom,type)   ((type) << (2 * (dom)))
+
+#define DACR_INIT \
+       (domain_val(DOMAIN_USER, DOMAIN_CLIENT) | \
+        domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \
+        domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \
+        domain_val(DOMAIN_IO, DOMAIN_CLIENT))
 
 #ifndef __ASSEMBLY__
 
+static inline unsigned int get_domain(void)
+{
+       unsigned int domain;
+
+       asm(
+       "mrc    p15, 0, %0, c3, c0      @ get domain"
+        : "=r" (domain));
+
+       return domain;
+}
+
 #ifdef CONFIG_CPU_USE_DOMAINS
 static inline void set_domain(unsigned val)
 {
@@ -70,11 +88,10 @@ static inline void set_domain(unsigned val)
 
 #define modify_domain(dom,type)                                        \
        do {                                                    \
-       struct thread_info *thread = current_thread_info();     \
-       unsigned int domain = thread->cpu_domain;               \
-       domain &= ~domain_val(dom, DOMAIN_MANAGER);             \
-       thread->cpu_domain = domain | domain_val(dom, type);    \
-       set_domain(thread->cpu_domain);                         \
+               unsigned int domain = get_domain();             \
+               domain &= ~domain_mask(dom);                    \
+               domain = domain | domain_val(dom, type);        \
+               set_domain(domain);                             \
        } while (0)
 
 #else
This page took 0.036655 seconds and 5 git commands to generate.