diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2006-09-28 10:56:43 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2006-09-28 10:56:43 -0400 |
commit | 94c12cc7d196bab34aaa98d38521549fa1e5ef76 (patch) | |
tree | 8e0cec0ed44445d74a2cb5160303d6b4dfb1bc31 /drivers/s390/char | |
parent | 25d83cbfaa44e1b9170c0941c3ef52ca39f54ccc (diff) |
[S390] Inline assembly cleanup.
Major cleanup of all s390 inline assemblies. They now have a common
coding style. Quite a few have been shortened, mainly by using register
asm variables. Use of the EX_TABLE macro helps as well. The atomic ops,
bit ops and locking inlines new use the Q-constraint if a newer gcc
is used. That results in slightly better code.
Thanks to Christian Borntraeger for proof reading the changes.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/char')
-rw-r--r-- | drivers/s390/char/sclp.c | 31 | ||||
-rw-r--r-- | drivers/s390/char/vmwatchdog.c | 52 |
2 files changed, 21 insertions, 62 deletions
diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c index 985d1613baaa..31e335751d6d 100644 --- a/drivers/s390/char/sclp.c +++ b/drivers/s390/char/sclp.c | |||
@@ -100,13 +100,12 @@ service_call(sclp_cmdw_t command, void *sccb) | |||
100 | { | 100 | { |
101 | int cc; | 101 | int cc; |
102 | 102 | ||
103 | __asm__ __volatile__( | 103 | asm volatile( |
104 | " .insn rre,0xb2200000,%1,%2\n" /* servc %1,%2 */ | 104 | " .insn rre,0xb2200000,%1,%2\n" /* servc %1,%2 */ |
105 | " ipm %0\n" | 105 | " ipm %0\n" |
106 | " srl %0,28" | 106 | " srl %0,28" |
107 | : "=&d" (cc) | 107 | : "=&d" (cc) : "d" (command), "a" (__pa(sccb)) |
108 | : "d" (command), "a" (__pa(sccb)) | 108 | : "cc", "memory"); |
109 | : "cc", "memory" ); | ||
110 | if (cc == 3) | 109 | if (cc == 3) |
111 | return -EIO; | 110 | return -EIO; |
112 | if (cc == 2) | 111 | if (cc == 2) |
@@ -360,16 +359,6 @@ sclp_interrupt_handler(struct pt_regs *regs, __u16 code) | |||
360 | sclp_process_queue(); | 359 | sclp_process_queue(); |
361 | } | 360 | } |
362 | 361 | ||
363 | /* Return current Time-Of-Day clock. */ | ||
364 | static inline u64 | ||
365 | sclp_get_clock(void) | ||
366 | { | ||
367 | u64 result; | ||
368 | |||
369 | asm volatile ("STCK 0(%1)" : "=m" (result) : "a" (&(result)) : "cc"); | ||
370 | return result; | ||
371 | } | ||
372 | |||
373 | /* Convert interval in jiffies to TOD ticks. */ | 362 | /* Convert interval in jiffies to TOD ticks. */ |
374 | static inline u64 | 363 | static inline u64 |
375 | sclp_tod_from_jiffies(unsigned long jiffies) | 364 | sclp_tod_from_jiffies(unsigned long jiffies) |
@@ -382,7 +371,6 @@ sclp_tod_from_jiffies(unsigned long jiffies) | |||
382 | void | 371 | void |
383 | sclp_sync_wait(void) | 372 | sclp_sync_wait(void) |
384 | { | 373 | { |
385 | unsigned long psw_mask; | ||
386 | unsigned long flags; | 374 | unsigned long flags; |
387 | unsigned long cr0, cr0_sync; | 375 | unsigned long cr0, cr0_sync; |
388 | u64 timeout; | 376 | u64 timeout; |
@@ -392,7 +380,7 @@ sclp_sync_wait(void) | |||
392 | timeout = 0; | 380 | timeout = 0; |
393 | if (timer_pending(&sclp_request_timer)) { | 381 | if (timer_pending(&sclp_request_timer)) { |
394 | /* Get timeout TOD value */ | 382 | /* Get timeout TOD value */ |
395 | timeout = sclp_get_clock() + | 383 | timeout = get_clock() + |
396 | sclp_tod_from_jiffies(sclp_request_timer.expires - | 384 | sclp_tod_from_jiffies(sclp_request_timer.expires - |
397 | jiffies); | 385 | jiffies); |
398 | } | 386 | } |
@@ -406,13 +394,12 @@ sclp_sync_wait(void) | |||
406 | cr0_sync |= 0x00000200; | 394 | cr0_sync |= 0x00000200; |
407 | cr0_sync &= 0xFFFFF3AC; | 395 | cr0_sync &= 0xFFFFF3AC; |
408 | __ctl_load(cr0_sync, 0, 0); | 396 | __ctl_load(cr0_sync, 0, 0); |
409 | asm volatile ("STOSM 0(%1),0x01" | 397 | __raw_local_irq_stosm(0x01); |
410 | : "=m" (psw_mask) : "a" (&psw_mask) : "memory"); | ||
411 | /* Loop until driver state indicates finished request */ | 398 | /* Loop until driver state indicates finished request */ |
412 | while (sclp_running_state != sclp_running_state_idle) { | 399 | while (sclp_running_state != sclp_running_state_idle) { |
413 | /* Check for expired request timer */ | 400 | /* Check for expired request timer */ |
414 | if (timer_pending(&sclp_request_timer) && | 401 | if (timer_pending(&sclp_request_timer) && |
415 | sclp_get_clock() > timeout && | 402 | get_clock() > timeout && |
416 | del_timer(&sclp_request_timer)) | 403 | del_timer(&sclp_request_timer)) |
417 | sclp_request_timer.function(sclp_request_timer.data); | 404 | sclp_request_timer.function(sclp_request_timer.data); |
418 | barrier(); | 405 | barrier(); |
diff --git a/drivers/s390/char/vmwatchdog.c b/drivers/s390/char/vmwatchdog.c index 807320a41fa4..4b868f72fe89 100644 --- a/drivers/s390/char/vmwatchdog.c +++ b/drivers/s390/char/vmwatchdog.c | |||
@@ -54,48 +54,20 @@ enum vmwdt_func { | |||
54 | static int __diag288(enum vmwdt_func func, unsigned int timeout, | 54 | static int __diag288(enum vmwdt_func func, unsigned int timeout, |
55 | char *cmd, size_t len) | 55 | char *cmd, size_t len) |
56 | { | 56 | { |
57 | register unsigned long __func asm("2"); | 57 | register unsigned long __func asm("2") = func; |
58 | register unsigned long __timeout asm("3"); | 58 | register unsigned long __timeout asm("3") = timeout; |
59 | register unsigned long __cmdp asm("4"); | 59 | register unsigned long __cmdp asm("4") = virt_to_phys(cmd); |
60 | register unsigned long __cmdl asm("5"); | 60 | register unsigned long __cmdl asm("5") = len; |
61 | int err; | 61 | int err; |
62 | 62 | ||
63 | __func = func; | 63 | err = -EINVAL; |
64 | __timeout = timeout; | 64 | asm volatile( |
65 | __cmdp = virt_to_phys(cmd); | 65 | " diag %1,%3,0x288\n" |
66 | __cmdl = len; | 66 | "0: la %0,0\n" |
67 | err = 0; | 67 | "1:\n" |
68 | asm volatile ( | 68 | EX_TABLE(0b,1b) |
69 | #ifdef CONFIG_64BIT | 69 | : "=d" (err) : "d"(__func), "d"(__timeout), |
70 | "diag %2,%4,0x288\n" | 70 | "d"(__cmdp), "d"(__cmdl), "0" (-EINVAL) : "1", "cc"); |
71 | "1: \n" | ||
72 | ".section .fixup,\"ax\"\n" | ||
73 | "2: lghi %0,%1\n" | ||
74 | " jg 1b\n" | ||
75 | ".previous\n" | ||
76 | ".section __ex_table,\"a\"\n" | ||
77 | " .align 8\n" | ||
78 | " .quad 1b,2b\n" | ||
79 | ".previous\n" | ||
80 | #else | ||
81 | "diag %2,%4,0x288\n" | ||
82 | "1: \n" | ||
83 | ".section .fixup,\"ax\"\n" | ||
84 | "2: lhi %0,%1\n" | ||
85 | " bras 1,3f\n" | ||
86 | " .long 1b\n" | ||
87 | "3: l 1,0(1)\n" | ||
88 | " br 1\n" | ||
89 | ".previous\n" | ||
90 | ".section __ex_table,\"a\"\n" | ||
91 | " .align 4\n" | ||
92 | " .long 1b,2b\n" | ||
93 | ".previous\n" | ||
94 | #endif | ||
95 | : "+&d"(err) | ||
96 | : "i"(-EINVAL), "d"(__func), "d"(__timeout), | ||
97 | "d"(__cmdp), "d"(__cmdl) | ||
98 | : "1", "cc"); | ||
99 | return err; | 71 | return err; |
100 | } | 72 | } |
101 | 73 | ||