diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-11-06 10:46:18 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-11-06 10:46:18 -0500 |
commit | 330f28f691e9b349e34adcaf82b273cf061bb491 (patch) | |
tree | fca3bfe41eff25ef19f576cef1979c68f6521af5 /arch/s390/lib | |
parent | fe3e78e073d25308756f38019956061153267769 (diff) | |
parent | 6fc786d5034ed7ce2d43c459211137de6d99dd28 (diff) |
Merge branch 'for-2.6.32' into for-2.6.33
Diffstat (limited to 'arch/s390/lib')
-rw-r--r-- | arch/s390/lib/delay.c | 27 | ||||
-rw-r--r-- | arch/s390/lib/uaccess_mvcos.c | 12 | ||||
-rw-r--r-- | arch/s390/lib/uaccess_std.c | 14 |
3 files changed, 30 insertions, 23 deletions
diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c index 97c1eca83cc2..752b362bf651 100644 --- a/arch/s390/lib/delay.c +++ b/arch/s390/lib/delay.c | |||
@@ -25,13 +25,13 @@ void __delay(unsigned long loops) | |||
25 | asm volatile("0: brct %0,0b" : : "d" ((loops/2) + 1)); | 25 | asm volatile("0: brct %0,0b" : : "d" ((loops/2) + 1)); |
26 | } | 26 | } |
27 | 27 | ||
28 | static void __udelay_disabled(unsigned long usecs) | 28 | static void __udelay_disabled(unsigned long long usecs) |
29 | { | 29 | { |
30 | unsigned long mask, cr0, cr0_saved; | 30 | unsigned long mask, cr0, cr0_saved; |
31 | u64 clock_saved; | 31 | u64 clock_saved; |
32 | 32 | ||
33 | clock_saved = local_tick_disable(); | 33 | clock_saved = local_tick_disable(); |
34 | set_clock_comparator(get_clock() + ((u64) usecs << 12)); | 34 | set_clock_comparator(get_clock() + (usecs << 12)); |
35 | __ctl_store(cr0_saved, 0, 0); | 35 | __ctl_store(cr0_saved, 0, 0); |
36 | cr0 = (cr0_saved & 0xffff00e0) | 0x00000800; | 36 | cr0 = (cr0_saved & 0xffff00e0) | 0x00000800; |
37 | __ctl_load(cr0 , 0, 0); | 37 | __ctl_load(cr0 , 0, 0); |
@@ -46,20 +46,25 @@ static void __udelay_disabled(unsigned long usecs) | |||
46 | set_clock_comparator(S390_lowcore.clock_comparator); | 46 | set_clock_comparator(S390_lowcore.clock_comparator); |
47 | } | 47 | } |
48 | 48 | ||
49 | static void __udelay_enabled(unsigned long usecs) | 49 | static void __udelay_enabled(unsigned long long usecs) |
50 | { | 50 | { |
51 | unsigned long mask; | 51 | unsigned long mask; |
52 | u64 end, time; | 52 | u64 clock_saved; |
53 | u64 end; | ||
53 | 54 | ||
54 | mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT | PSW_MASK_IO; | 55 | mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT | PSW_MASK_IO; |
55 | end = get_clock() + ((u64) usecs << 12); | 56 | end = get_clock() + (usecs << 12); |
56 | do { | 57 | do { |
57 | time = end < S390_lowcore.clock_comparator ? | 58 | clock_saved = 0; |
58 | end : S390_lowcore.clock_comparator; | 59 | if (end < S390_lowcore.clock_comparator) { |
59 | set_clock_comparator(time); | 60 | clock_saved = local_tick_disable(); |
61 | set_clock_comparator(end); | ||
62 | } | ||
60 | trace_hardirqs_on(); | 63 | trace_hardirqs_on(); |
61 | __load_psw_mask(mask); | 64 | __load_psw_mask(mask); |
62 | local_irq_disable(); | 65 | local_irq_disable(); |
66 | if (clock_saved) | ||
67 | local_tick_enable(clock_saved); | ||
63 | } while (get_clock() < end); | 68 | } while (get_clock() < end); |
64 | set_clock_comparator(S390_lowcore.clock_comparator); | 69 | set_clock_comparator(S390_lowcore.clock_comparator); |
65 | } | 70 | } |
@@ -67,7 +72,7 @@ static void __udelay_enabled(unsigned long usecs) | |||
67 | /* | 72 | /* |
68 | * Waits for 'usecs' microseconds using the TOD clock comparator. | 73 | * Waits for 'usecs' microseconds using the TOD clock comparator. |
69 | */ | 74 | */ |
70 | void __udelay(unsigned long usecs) | 75 | void __udelay(unsigned long long usecs) |
71 | { | 76 | { |
72 | unsigned long flags; | 77 | unsigned long flags; |
73 | 78 | ||
@@ -101,11 +106,11 @@ EXPORT_SYMBOL(__udelay); | |||
101 | * Simple udelay variant. To be used on startup and reboot | 106 | * Simple udelay variant. To be used on startup and reboot |
102 | * when the interrupt handler isn't working. | 107 | * when the interrupt handler isn't working. |
103 | */ | 108 | */ |
104 | void udelay_simple(unsigned long usecs) | 109 | void udelay_simple(unsigned long long usecs) |
105 | { | 110 | { |
106 | u64 end; | 111 | u64 end; |
107 | 112 | ||
108 | end = get_clock() + ((u64) usecs << 12); | 113 | end = get_clock() + (usecs << 12); |
109 | while (get_clock() < end) | 114 | while (get_clock() < end) |
110 | cpu_relax(); | 115 | cpu_relax(); |
111 | } | 116 | } |
diff --git a/arch/s390/lib/uaccess_mvcos.c b/arch/s390/lib/uaccess_mvcos.c index 3f15aaf54855..58da3f461214 100644 --- a/arch/s390/lib/uaccess_mvcos.c +++ b/arch/s390/lib/uaccess_mvcos.c | |||
@@ -36,7 +36,7 @@ static size_t copy_from_user_mvcos(size_t size, const void __user *ptr, void *x) | |||
36 | tmp1 = -4096UL; | 36 | tmp1 = -4096UL; |
37 | asm volatile( | 37 | asm volatile( |
38 | "0: .insn ss,0xc80000000000,0(%0,%2),0(%1),0\n" | 38 | "0: .insn ss,0xc80000000000,0(%0,%2),0(%1),0\n" |
39 | " jz 7f\n" | 39 | "9: jz 7f\n" |
40 | "1:"ALR" %0,%3\n" | 40 | "1:"ALR" %0,%3\n" |
41 | " "SLR" %1,%3\n" | 41 | " "SLR" %1,%3\n" |
42 | " "SLR" %2,%3\n" | 42 | " "SLR" %2,%3\n" |
@@ -47,7 +47,7 @@ static size_t copy_from_user_mvcos(size_t size, const void __user *ptr, void *x) | |||
47 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ | 47 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ |
48 | " jnh 4f\n" | 48 | " jnh 4f\n" |
49 | "3: .insn ss,0xc80000000000,0(%4,%2),0(%1),0\n" | 49 | "3: .insn ss,0xc80000000000,0(%4,%2),0(%1),0\n" |
50 | " "SLR" %0,%4\n" | 50 | "10:"SLR" %0,%4\n" |
51 | " "ALR" %2,%4\n" | 51 | " "ALR" %2,%4\n" |
52 | "4:"LHI" %4,-1\n" | 52 | "4:"LHI" %4,-1\n" |
53 | " "ALR" %4,%0\n" /* copy remaining size, subtract 1 */ | 53 | " "ALR" %4,%0\n" /* copy remaining size, subtract 1 */ |
@@ -61,7 +61,7 @@ static size_t copy_from_user_mvcos(size_t size, const void __user *ptr, void *x) | |||
61 | " j 8f\n" | 61 | " j 8f\n" |
62 | "7:"SLR" %0,%0\n" | 62 | "7:"SLR" %0,%0\n" |
63 | "8: \n" | 63 | "8: \n" |
64 | EX_TABLE(0b,2b) EX_TABLE(3b,4b) | 64 | EX_TABLE(0b,2b) EX_TABLE(3b,4b) EX_TABLE(9b,2b) EX_TABLE(10b,4b) |
65 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) | 65 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) |
66 | : "d" (reg0) : "cc", "memory"); | 66 | : "d" (reg0) : "cc", "memory"); |
67 | return size; | 67 | return size; |
@@ -82,7 +82,7 @@ static size_t copy_to_user_mvcos(size_t size, void __user *ptr, const void *x) | |||
82 | tmp1 = -4096UL; | 82 | tmp1 = -4096UL; |
83 | asm volatile( | 83 | asm volatile( |
84 | "0: .insn ss,0xc80000000000,0(%0,%1),0(%2),0\n" | 84 | "0: .insn ss,0xc80000000000,0(%0,%1),0(%2),0\n" |
85 | " jz 4f\n" | 85 | "6: jz 4f\n" |
86 | "1:"ALR" %0,%3\n" | 86 | "1:"ALR" %0,%3\n" |
87 | " "SLR" %1,%3\n" | 87 | " "SLR" %1,%3\n" |
88 | " "SLR" %2,%3\n" | 88 | " "SLR" %2,%3\n" |
@@ -93,11 +93,11 @@ static size_t copy_to_user_mvcos(size_t size, void __user *ptr, const void *x) | |||
93 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ | 93 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ |
94 | " jnh 5f\n" | 94 | " jnh 5f\n" |
95 | "3: .insn ss,0xc80000000000,0(%4,%1),0(%2),0\n" | 95 | "3: .insn ss,0xc80000000000,0(%4,%1),0(%2),0\n" |
96 | " "SLR" %0,%4\n" | 96 | "7:"SLR" %0,%4\n" |
97 | " j 5f\n" | 97 | " j 5f\n" |
98 | "4:"SLR" %0,%0\n" | 98 | "4:"SLR" %0,%0\n" |
99 | "5: \n" | 99 | "5: \n" |
100 | EX_TABLE(0b,2b) EX_TABLE(3b,5b) | 100 | EX_TABLE(0b,2b) EX_TABLE(3b,5b) EX_TABLE(6b,2b) EX_TABLE(7b,5b) |
101 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) | 101 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) |
102 | : "d" (reg0) : "cc", "memory"); | 102 | : "d" (reg0) : "cc", "memory"); |
103 | return size; | 103 | return size; |
diff --git a/arch/s390/lib/uaccess_std.c b/arch/s390/lib/uaccess_std.c index d2ffbadb51a7..07deaeee14c8 100644 --- a/arch/s390/lib/uaccess_std.c +++ b/arch/s390/lib/uaccess_std.c | |||
@@ -36,12 +36,12 @@ size_t copy_from_user_std(size_t size, const void __user *ptr, void *x) | |||
36 | tmp1 = -256UL; | 36 | tmp1 = -256UL; |
37 | asm volatile( | 37 | asm volatile( |
38 | "0: mvcp 0(%0,%2),0(%1),%3\n" | 38 | "0: mvcp 0(%0,%2),0(%1),%3\n" |
39 | " jz 8f\n" | 39 | "10:jz 8f\n" |
40 | "1:"ALR" %0,%3\n" | 40 | "1:"ALR" %0,%3\n" |
41 | " la %1,256(%1)\n" | 41 | " la %1,256(%1)\n" |
42 | " la %2,256(%2)\n" | 42 | " la %2,256(%2)\n" |
43 | "2: mvcp 0(%0,%2),0(%1),%3\n" | 43 | "2: mvcp 0(%0,%2),0(%1),%3\n" |
44 | " jnz 1b\n" | 44 | "11:jnz 1b\n" |
45 | " j 8f\n" | 45 | " j 8f\n" |
46 | "3: la %4,255(%1)\n" /* %4 = ptr + 255 */ | 46 | "3: la %4,255(%1)\n" /* %4 = ptr + 255 */ |
47 | " "LHI" %3,-4096\n" | 47 | " "LHI" %3,-4096\n" |
@@ -50,7 +50,7 @@ size_t copy_from_user_std(size_t size, const void __user *ptr, void *x) | |||
50 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ | 50 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ |
51 | " jnh 5f\n" | 51 | " jnh 5f\n" |
52 | "4: mvcp 0(%4,%2),0(%1),%3\n" | 52 | "4: mvcp 0(%4,%2),0(%1),%3\n" |
53 | " "SLR" %0,%4\n" | 53 | "12:"SLR" %0,%4\n" |
54 | " "ALR" %2,%4\n" | 54 | " "ALR" %2,%4\n" |
55 | "5:"LHI" %4,-1\n" | 55 | "5:"LHI" %4,-1\n" |
56 | " "ALR" %4,%0\n" /* copy remaining size, subtract 1 */ | 56 | " "ALR" %4,%0\n" /* copy remaining size, subtract 1 */ |
@@ -65,6 +65,7 @@ size_t copy_from_user_std(size_t size, const void __user *ptr, void *x) | |||
65 | "8:"SLR" %0,%0\n" | 65 | "8:"SLR" %0,%0\n" |
66 | "9: \n" | 66 | "9: \n" |
67 | EX_TABLE(0b,3b) EX_TABLE(2b,3b) EX_TABLE(4b,5b) | 67 | EX_TABLE(0b,3b) EX_TABLE(2b,3b) EX_TABLE(4b,5b) |
68 | EX_TABLE(10b,3b) EX_TABLE(11b,3b) EX_TABLE(12b,5b) | ||
68 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) | 69 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) |
69 | : : "cc", "memory"); | 70 | : : "cc", "memory"); |
70 | return size; | 71 | return size; |
@@ -85,12 +86,12 @@ size_t copy_to_user_std(size_t size, void __user *ptr, const void *x) | |||
85 | tmp1 = -256UL; | 86 | tmp1 = -256UL; |
86 | asm volatile( | 87 | asm volatile( |
87 | "0: mvcs 0(%0,%1),0(%2),%3\n" | 88 | "0: mvcs 0(%0,%1),0(%2),%3\n" |
88 | " jz 5f\n" | 89 | "7: jz 5f\n" |
89 | "1:"ALR" %0,%3\n" | 90 | "1:"ALR" %0,%3\n" |
90 | " la %1,256(%1)\n" | 91 | " la %1,256(%1)\n" |
91 | " la %2,256(%2)\n" | 92 | " la %2,256(%2)\n" |
92 | "2: mvcs 0(%0,%1),0(%2),%3\n" | 93 | "2: mvcs 0(%0,%1),0(%2),%3\n" |
93 | " jnz 1b\n" | 94 | "8: jnz 1b\n" |
94 | " j 5f\n" | 95 | " j 5f\n" |
95 | "3: la %4,255(%1)\n" /* %4 = ptr + 255 */ | 96 | "3: la %4,255(%1)\n" /* %4 = ptr + 255 */ |
96 | " "LHI" %3,-4096\n" | 97 | " "LHI" %3,-4096\n" |
@@ -99,11 +100,12 @@ size_t copy_to_user_std(size_t size, void __user *ptr, const void *x) | |||
99 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ | 100 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ |
100 | " jnh 6f\n" | 101 | " jnh 6f\n" |
101 | "4: mvcs 0(%4,%1),0(%2),%3\n" | 102 | "4: mvcs 0(%4,%1),0(%2),%3\n" |
102 | " "SLR" %0,%4\n" | 103 | "9:"SLR" %0,%4\n" |
103 | " j 6f\n" | 104 | " j 6f\n" |
104 | "5:"SLR" %0,%0\n" | 105 | "5:"SLR" %0,%0\n" |
105 | "6: \n" | 106 | "6: \n" |
106 | EX_TABLE(0b,3b) EX_TABLE(2b,3b) EX_TABLE(4b,6b) | 107 | EX_TABLE(0b,3b) EX_TABLE(2b,3b) EX_TABLE(4b,6b) |
108 | EX_TABLE(7b,3b) EX_TABLE(8b,3b) EX_TABLE(9b,6b) | ||
107 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) | 109 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) |
108 | : : "cc", "memory"); | 110 | : : "cc", "memory"); |
109 | return size; | 111 | return size; |