diff options
Diffstat (limited to 'arch/um')
-rw-r--r-- | arch/um/Kconfig | 10 | ||||
-rw-r--r-- | arch/um/Kconfig.x86_64 | 5 | ||||
-rw-r--r-- | arch/um/Makefile-i386 | 12 | ||||
-rw-r--r-- | arch/um/include/sysdep-i386/syscalls.h | 1 | ||||
-rw-r--r-- | arch/um/include/tlb.h | 1 | ||||
-rw-r--r-- | arch/um/kernel/process_kern.c | 8 | ||||
-rw-r--r-- | arch/um/kernel/skas/mmu.c | 4 | ||||
-rw-r--r-- | arch/um/kernel/time_kern.c | 4 | ||||
-rw-r--r-- | arch/um/kernel/tt/tlb.c | 36 |
9 files changed, 26 insertions, 55 deletions
diff --git a/arch/um/Kconfig b/arch/um/Kconfig index 684e1f8b2755..cd06ed7d842d 100644 --- a/arch/um/Kconfig +++ b/arch/um/Kconfig | |||
@@ -27,10 +27,6 @@ config UID16 | |||
27 | bool | 27 | bool |
28 | default y | 28 | default y |
29 | 29 | ||
30 | config RWSEM_GENERIC_SPINLOCK | ||
31 | bool | ||
32 | default y | ||
33 | |||
34 | config GENERIC_CALIBRATE_DELAY | 30 | config GENERIC_CALIBRATE_DELAY |
35 | bool | 31 | bool |
36 | default y | 32 | default y |
@@ -40,6 +36,12 @@ config IRQ_RELEASE_METHOD | |||
40 | bool | 36 | bool |
41 | default y | 37 | default y |
42 | 38 | ||
39 | menu "Host processor type and features" | ||
40 | |||
41 | source "arch/i386/Kconfig.cpu" | ||
42 | |||
43 | endmenu | ||
44 | |||
43 | menu "UML-specific options" | 45 | menu "UML-specific options" |
44 | 46 | ||
45 | config MODE_TT | 47 | config MODE_TT |
diff --git a/arch/um/Kconfig.x86_64 b/arch/um/Kconfig.x86_64 index bd35e59419c8..aae19bc4b06a 100644 --- a/arch/um/Kconfig.x86_64 +++ b/arch/um/Kconfig.x86_64 | |||
@@ -6,6 +6,11 @@ config 64BIT | |||
6 | bool | 6 | bool |
7 | default y | 7 | default y |
8 | 8 | ||
9 | #XXX: this is so in the underlying arch, but it's wrong!!! | ||
10 | config RWSEM_GENERIC_SPINLOCK | ||
11 | bool | ||
12 | default y | ||
13 | |||
9 | config SEMAPHORE_SLEEPERS | 14 | config SEMAPHORE_SLEEPERS |
10 | bool | 15 | bool |
11 | default y | 16 | default y |
diff --git a/arch/um/Makefile-i386 b/arch/um/Makefile-i386 index 2ee8a2858117..aef7c50f8e13 100644 --- a/arch/um/Makefile-i386 +++ b/arch/um/Makefile-i386 | |||
@@ -29,6 +29,12 @@ endif | |||
29 | 29 | ||
30 | CFLAGS += -U__$(SUBARCH)__ -U$(SUBARCH) | 30 | CFLAGS += -U__$(SUBARCH)__ -U$(SUBARCH) |
31 | 31 | ||
32 | ifneq ($(CONFIG_GPROF),y) | 32 | # First of all, tune CFLAGS for the specific CPU. This actually sets cflags-y. |
33 | ARCH_CFLAGS += -DUM_FASTCALL | 33 | include $(srctree)/arch/i386/Makefile.cpu |
34 | endif | 34 | |
35 | # prevent gcc from keeping the stack 16 byte aligned. Taken from i386. | ||
36 | cflags-y += $(call cc-option,-mpreferred-stack-boundary=2) | ||
37 | |||
38 | CFLAGS += $(cflags-y) | ||
39 | USER_CFLAGS += $(cflags-y) | ||
40 | |||
diff --git a/arch/um/include/sysdep-i386/syscalls.h b/arch/um/include/sysdep-i386/syscalls.h index a0d5b74d3731..57bd79efbee3 100644 --- a/arch/um/include/sysdep-i386/syscalls.h +++ b/arch/um/include/sysdep-i386/syscalls.h | |||
@@ -11,7 +11,6 @@ typedef long syscall_handler_t(struct pt_regs); | |||
11 | /* Not declared on x86, incompatible declarations on x86_64, so these have | 11 | /* Not declared on x86, incompatible declarations on x86_64, so these have |
12 | * to go here rather than in sys_call_table.c | 12 | * to go here rather than in sys_call_table.c |
13 | */ | 13 | */ |
14 | extern syscall_handler_t sys_ptrace; | ||
15 | extern syscall_handler_t sys_rt_sigaction; | 14 | extern syscall_handler_t sys_rt_sigaction; |
16 | 15 | ||
17 | extern syscall_handler_t old_mmap_i386; | 16 | extern syscall_handler_t old_mmap_i386; |
diff --git a/arch/um/include/tlb.h b/arch/um/include/tlb.h index 45d7da6c3b2c..8efc1e0f1b84 100644 --- a/arch/um/include/tlb.h +++ b/arch/um/include/tlb.h | |||
@@ -34,7 +34,6 @@ struct host_vm_op { | |||
34 | } u; | 34 | } u; |
35 | }; | 35 | }; |
36 | 36 | ||
37 | extern void mprotect_kernel_vm(int w); | ||
38 | extern void force_flush_all(void); | 37 | extern void force_flush_all(void); |
39 | extern void fix_range_common(struct mm_struct *mm, unsigned long start_addr, | 38 | extern void fix_range_common(struct mm_struct *mm, unsigned long start_addr, |
40 | unsigned long end_addr, int force, | 39 | unsigned long end_addr, int force, |
diff --git a/arch/um/kernel/process_kern.c b/arch/um/kernel/process_kern.c index 0d73ceeece72..34b54a3e2132 100644 --- a/arch/um/kernel/process_kern.c +++ b/arch/um/kernel/process_kern.c | |||
@@ -222,6 +222,7 @@ void *um_virt_to_phys(struct task_struct *task, unsigned long addr, | |||
222 | pud_t *pud; | 222 | pud_t *pud; |
223 | pmd_t *pmd; | 223 | pmd_t *pmd; |
224 | pte_t *pte; | 224 | pte_t *pte; |
225 | pte_t ptent; | ||
225 | 226 | ||
226 | if(task->mm == NULL) | 227 | if(task->mm == NULL) |
227 | return(ERR_PTR(-EINVAL)); | 228 | return(ERR_PTR(-EINVAL)); |
@@ -238,12 +239,13 @@ void *um_virt_to_phys(struct task_struct *task, unsigned long addr, | |||
238 | return(ERR_PTR(-EINVAL)); | 239 | return(ERR_PTR(-EINVAL)); |
239 | 240 | ||
240 | pte = pte_offset_kernel(pmd, addr); | 241 | pte = pte_offset_kernel(pmd, addr); |
241 | if(!pte_present(*pte)) | 242 | ptent = *pte; |
243 | if(!pte_present(ptent)) | ||
242 | return(ERR_PTR(-EINVAL)); | 244 | return(ERR_PTR(-EINVAL)); |
243 | 245 | ||
244 | if(pte_out != NULL) | 246 | if(pte_out != NULL) |
245 | *pte_out = *pte; | 247 | *pte_out = ptent; |
246 | return((void *) (pte_val(*pte) & PAGE_MASK) + (addr & ~PAGE_MASK)); | 248 | return((void *) (pte_val(ptent) & PAGE_MASK) + (addr & ~PAGE_MASK)); |
247 | } | 249 | } |
248 | 250 | ||
249 | char *current_cmd(void) | 251 | char *current_cmd(void) |
diff --git a/arch/um/kernel/skas/mmu.c b/arch/um/kernel/skas/mmu.c index 240143b616a2..9e5e39cea821 100644 --- a/arch/um/kernel/skas/mmu.c +++ b/arch/um/kernel/skas/mmu.c | |||
@@ -28,7 +28,6 @@ static int init_stub_pte(struct mm_struct *mm, unsigned long proc, | |||
28 | pmd_t *pmd; | 28 | pmd_t *pmd; |
29 | pte_t *pte; | 29 | pte_t *pte; |
30 | 30 | ||
31 | spin_lock(&mm->page_table_lock); | ||
32 | pgd = pgd_offset(mm, proc); | 31 | pgd = pgd_offset(mm, proc); |
33 | pud = pud_alloc(mm, pgd, proc); | 32 | pud = pud_alloc(mm, pgd, proc); |
34 | if (!pud) | 33 | if (!pud) |
@@ -63,7 +62,6 @@ static int init_stub_pte(struct mm_struct *mm, unsigned long proc, | |||
63 | *pte = mk_pte(virt_to_page(kernel), __pgprot(_PAGE_PRESENT)); | 62 | *pte = mk_pte(virt_to_page(kernel), __pgprot(_PAGE_PRESENT)); |
64 | *pte = pte_mkexec(*pte); | 63 | *pte = pte_mkexec(*pte); |
65 | *pte = pte_wrprotect(*pte); | 64 | *pte = pte_wrprotect(*pte); |
66 | spin_unlock(&mm->page_table_lock); | ||
67 | return(0); | 65 | return(0); |
68 | 66 | ||
69 | out_pmd: | 67 | out_pmd: |
@@ -71,7 +69,6 @@ static int init_stub_pte(struct mm_struct *mm, unsigned long proc, | |||
71 | out_pte: | 69 | out_pte: |
72 | pmd_free(pmd); | 70 | pmd_free(pmd); |
73 | out: | 71 | out: |
74 | spin_unlock(&mm->page_table_lock); | ||
75 | return(-ENOMEM); | 72 | return(-ENOMEM); |
76 | } | 73 | } |
77 | 74 | ||
@@ -147,6 +144,7 @@ void destroy_context_skas(struct mm_struct *mm) | |||
147 | 144 | ||
148 | if(!proc_mm || !ptrace_faultinfo){ | 145 | if(!proc_mm || !ptrace_faultinfo){ |
149 | free_page(mmu->id.stack); | 146 | free_page(mmu->id.stack); |
147 | pte_lock_deinit(virt_to_page(mmu->last_page_table)); | ||
150 | pte_free_kernel((pte_t *) mmu->last_page_table); | 148 | pte_free_kernel((pte_t *) mmu->last_page_table); |
151 | dec_page_state(nr_page_table_pages); | 149 | dec_page_state(nr_page_table_pages); |
152 | #ifdef CONFIG_3_LEVEL_PGTABLES | 150 | #ifdef CONFIG_3_LEVEL_PGTABLES |
diff --git a/arch/um/kernel/time_kern.c b/arch/um/kernel/time_kern.c index 4e08f7545d63..020ca79b8d33 100644 --- a/arch/um/kernel/time_kern.c +++ b/arch/um/kernel/time_kern.c | |||
@@ -22,10 +22,6 @@ | |||
22 | #include "mode.h" | 22 | #include "mode.h" |
23 | #include "os.h" | 23 | #include "os.h" |
24 | 24 | ||
25 | u64 jiffies_64 = INITIAL_JIFFIES; | ||
26 | |||
27 | EXPORT_SYMBOL(jiffies_64); | ||
28 | |||
29 | int hz(void) | 25 | int hz(void) |
30 | { | 26 | { |
31 | return(HZ); | 27 | return(HZ); |
diff --git a/arch/um/kernel/tt/tlb.c b/arch/um/kernel/tt/tlb.c index f1d85dbb45b9..ae6217c86135 100644 --- a/arch/um/kernel/tt/tlb.c +++ b/arch/um/kernel/tt/tlb.c | |||
@@ -74,42 +74,6 @@ void flush_tlb_kernel_range_tt(unsigned long start, unsigned long end) | |||
74 | atomic_inc(&vmchange_seq); | 74 | atomic_inc(&vmchange_seq); |
75 | } | 75 | } |
76 | 76 | ||
77 | static void protect_vm_page(unsigned long addr, int w, int must_succeed) | ||
78 | { | ||
79 | int err; | ||
80 | |||
81 | err = protect_memory(addr, PAGE_SIZE, 1, w, 1, must_succeed); | ||
82 | if(err == 0) return; | ||
83 | else if((err == -EFAULT) || (err == -ENOMEM)){ | ||
84 | flush_tlb_kernel_range(addr, addr + PAGE_SIZE); | ||
85 | protect_vm_page(addr, w, 1); | ||
86 | } | ||
87 | else panic("protect_vm_page : protect failed, errno = %d\n", err); | ||
88 | } | ||
89 | |||
90 | void mprotect_kernel_vm(int w) | ||
91 | { | ||
92 | struct mm_struct *mm; | ||
93 | pgd_t *pgd; | ||
94 | pud_t *pud; | ||
95 | pmd_t *pmd; | ||
96 | pte_t *pte; | ||
97 | unsigned long addr; | ||
98 | |||
99 | mm = &init_mm; | ||
100 | for(addr = start_vm; addr < end_vm;){ | ||
101 | pgd = pgd_offset(mm, addr); | ||
102 | pud = pud_offset(pgd, addr); | ||
103 | pmd = pmd_offset(pud, addr); | ||
104 | if(pmd_present(*pmd)){ | ||
105 | pte = pte_offset_kernel(pmd, addr); | ||
106 | if(pte_present(*pte)) protect_vm_page(addr, w, 0); | ||
107 | addr += PAGE_SIZE; | ||
108 | } | ||
109 | else addr += PMD_SIZE; | ||
110 | } | ||
111 | } | ||
112 | |||
113 | void flush_tlb_kernel_vm_tt(void) | 77 | void flush_tlb_kernel_vm_tt(void) |
114 | { | 78 | { |
115 | flush_tlb_kernel_range(start_vm, end_vm); | 79 | flush_tlb_kernel_range(start_vm, end_vm); |