2 * arch/s390/kernel/cpcmd.c
5 * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
6 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
9 #include <linux/stddef.h>
10 #include <linux/kernel.h>
11 #include <linux/string.h>
12 #include <asm/ebcdic.h>
13 #include <linux/spinlock.h>
14 #include <asm/cpcmd.h>
15 #include <asm/system.h>
17 static spinlock_t cpcmd_lock = SPIN_LOCK_UNLOCKED;
18 static char cpcmd_buf[240];
20 void cpcmd(char *cmd, char *response, int rlen)
22 const int mask = 0x40000000L;
26 spin_lock_irqsave(&cpcmd_lock, flags);
29 strcpy(cpcmd_buf, cmd);
30 ASCEBC(cpcmd_buf, cmdlen);
32 if (response != NULL && rlen > 0) {
33 #ifndef CONFIG_ARCH_S390X
34 asm volatile ("LRA 2,0(%0)\n\t"
39 ".long 0x83240008 # Diagnose X'08'\n\t"
41 : "a" (cpcmd_buf), "d" (cmdlen),
42 "a" (response), "d" (rlen), "m" (mask)
43 : "cc", "2", "3", "4", "5" );
44 #else /* CONFIG_ARCH_S390X */
45 asm volatile (" lrag 2,0(%0)\n"
51 " .long 0x83240008 # Diagnose X'08'\n"
54 : "a" (cpcmd_buf), "d" (cmdlen),
55 "a" (response), "d" (rlen), "m" (mask)
56 : "cc", "2", "3", "4", "5" );
57 #endif /* CONFIG_ARCH_S390X */
58 EBCASC(response, rlen);
60 #ifndef CONFIG_ARCH_S390X
61 asm volatile ("LRA 2,0(%0)\n\t"
63 ".long 0x83230008 # Diagnose X'08'\n\t"
65 : "a" (cpcmd_buf), "d" (cmdlen)
67 #else /* CONFIG_ARCH_S390X */
68 asm volatile (" lrag 2,0(%0)\n"
71 " .long 0x83230008 # Diagnose X'08'\n"
74 : "a" (cpcmd_buf), "d" (cmdlen)
76 #endif /* CONFIG_ARCH_S390X */
78 spin_unlock_irqrestore(&cpcmd_lock, flags);