Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.6-rc7 224 lines 3.7 kB view raw
1/* 2 * Channel subsystem I/O instructions. 3 */ 4 5#include <linux/export.h> 6 7#include <asm/chpid.h> 8#include <asm/schid.h> 9#include <asm/crw.h> 10 11#include "ioasm.h" 12#include "orb.h" 13#include "cio.h" 14 15int stsch(struct subchannel_id schid, struct schib *addr) 16{ 17 register struct subchannel_id reg1 asm ("1") = schid; 18 int ccode = -EIO; 19 20 asm volatile( 21 " stsch 0(%3)\n" 22 "0: ipm %0\n" 23 " srl %0,28\n" 24 "1:\n" 25 EX_TABLE(0b, 1b) 26 : "+d" (ccode), "=m" (*addr) 27 : "d" (reg1), "a" (addr) 28 : "cc"); 29 trace_s390_cio_stsch(schid, addr, ccode); 30 31 return ccode; 32} 33EXPORT_SYMBOL(stsch); 34 35int msch(struct subchannel_id schid, struct schib *addr) 36{ 37 register struct subchannel_id reg1 asm ("1") = schid; 38 int ccode = -EIO; 39 40 asm volatile( 41 " msch 0(%2)\n" 42 "0: ipm %0\n" 43 " srl %0,28\n" 44 "1:\n" 45 EX_TABLE(0b, 1b) 46 : "+d" (ccode) 47 : "d" (reg1), "a" (addr), "m" (*addr) 48 : "cc"); 49 trace_s390_cio_msch(schid, addr, ccode); 50 51 return ccode; 52} 53 54int tsch(struct subchannel_id schid, struct irb *addr) 55{ 56 register struct subchannel_id reg1 asm ("1") = schid; 57 int ccode; 58 59 asm volatile( 60 " tsch 0(%3)\n" 61 " ipm %0\n" 62 " srl %0,28" 63 : "=d" (ccode), "=m" (*addr) 64 : "d" (reg1), "a" (addr) 65 : "cc"); 66 trace_s390_cio_tsch(schid, addr, ccode); 67 68 return ccode; 69} 70 71int ssch(struct subchannel_id schid, union orb *addr) 72{ 73 register struct subchannel_id reg1 asm("1") = schid; 74 int ccode = -EIO; 75 76 asm volatile( 77 " ssch 0(%2)\n" 78 "0: ipm %0\n" 79 " srl %0,28\n" 80 "1:\n" 81 EX_TABLE(0b, 1b) 82 : "+d" (ccode) 83 : "d" (reg1), "a" (addr), "m" (*addr) 84 : "cc", "memory"); 85 trace_s390_cio_ssch(schid, addr, ccode); 86 87 return ccode; 88} 89EXPORT_SYMBOL(ssch); 90 91int csch(struct subchannel_id schid) 92{ 93 register struct subchannel_id reg1 asm("1") = schid; 94 int ccode; 95 96 asm volatile( 97 " csch\n" 98 " ipm %0\n" 99 " srl %0,28" 100 : "=d" (ccode) 101 : "d" (reg1) 102 : "cc"); 103 trace_s390_cio_csch(schid, ccode); 104 105 return ccode; 106} 107EXPORT_SYMBOL(csch); 108 109int tpi(struct tpi_info *addr) 110{ 111 int ccode; 112 113 asm volatile( 114 " tpi 0(%2)\n" 115 " ipm %0\n" 116 " srl %0,28" 117 : "=d" (ccode), "=m" (*addr) 118 : "a" (addr) 119 : "cc"); 120 trace_s390_cio_tpi(addr, ccode); 121 122 return ccode; 123} 124 125int chsc(void *chsc_area) 126{ 127 typedef struct { char _[4096]; } addr_type; 128 int cc; 129 130 asm volatile( 131 " .insn rre,0xb25f0000,%2,0\n" 132 " ipm %0\n" 133 " srl %0,28\n" 134 : "=d" (cc), "=m" (*(addr_type *) chsc_area) 135 : "d" (chsc_area), "m" (*(addr_type *) chsc_area) 136 : "cc"); 137 trace_s390_cio_chsc(chsc_area, cc); 138 139 return cc; 140} 141EXPORT_SYMBOL(chsc); 142 143int rchp(struct chp_id chpid) 144{ 145 register struct chp_id reg1 asm ("1") = chpid; 146 int ccode; 147 148 asm volatile( 149 " lr 1,%1\n" 150 " rchp\n" 151 " ipm %0\n" 152 " srl %0,28" 153 : "=d" (ccode) : "d" (reg1) : "cc"); 154 trace_s390_cio_rchp(chpid, ccode); 155 156 return ccode; 157} 158 159int rsch(struct subchannel_id schid) 160{ 161 register struct subchannel_id reg1 asm("1") = schid; 162 int ccode; 163 164 asm volatile( 165 " rsch\n" 166 " ipm %0\n" 167 " srl %0,28" 168 : "=d" (ccode) 169 : "d" (reg1) 170 : "cc", "memory"); 171 trace_s390_cio_rsch(schid, ccode); 172 173 return ccode; 174} 175 176int hsch(struct subchannel_id schid) 177{ 178 register struct subchannel_id reg1 asm("1") = schid; 179 int ccode; 180 181 asm volatile( 182 " hsch\n" 183 " ipm %0\n" 184 " srl %0,28" 185 : "=d" (ccode) 186 : "d" (reg1) 187 : "cc"); 188 trace_s390_cio_hsch(schid, ccode); 189 190 return ccode; 191} 192 193int xsch(struct subchannel_id schid) 194{ 195 register struct subchannel_id reg1 asm("1") = schid; 196 int ccode; 197 198 asm volatile( 199 " xsch\n" 200 " ipm %0\n" 201 " srl %0,28" 202 : "=d" (ccode) 203 : "d" (reg1) 204 : "cc"); 205 trace_s390_cio_xsch(schid, ccode); 206 207 return ccode; 208} 209 210int stcrw(struct crw *crw) 211{ 212 int ccode; 213 214 asm volatile( 215 " stcrw 0(%2)\n" 216 " ipm %0\n" 217 " srl %0,28\n" 218 : "=d" (ccode), "=m" (*crw) 219 : "a" (crw) 220 : "cc"); 221 trace_s390_cio_stcrw(crw, ccode); 222 223 return ccode; 224}