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/sclp.c | |
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/sclp.c')
-rw-r--r-- | drivers/s390/char/sclp.c | 31 |
1 files changed, 9 insertions, 22 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(); |