📄 diag.c
字号:
/* * Implementation of s390 diagnose codes * * Copyright IBM Corp. 2007 * Author(s): Michael Holzheu <holzheu@de.ibm.com> */#include <linux/module.h>#include <asm/diag.h>/* * Diagnose 10: Release pages */void diag10(unsigned long addr){ if (addr >= 0x7ff00000) return; asm volatile(#ifdef CONFIG_64BIT " sam31\n" " diag %0,%0,0x10\n" "0: sam64\n"#else " diag %0,%0,0x10\n" "0:\n"#endif EX_TABLE(0b, 0b) : : "a" (addr));}EXPORT_SYMBOL(diag10);/* * Diagnose 14: Input spool file manipulation */int diag14(unsigned long rx, unsigned long ry1, unsigned long subcode){ register unsigned long _ry1 asm("2") = ry1; register unsigned long _ry2 asm("3") = subcode; int rc = 0; asm volatile(#ifdef CONFIG_64BIT " sam31\n" " diag %2,2,0x14\n" " sam64\n"#else " diag %2,2,0x14\n"#endif " ipm %0\n" " srl %0,28\n" : "=d" (rc), "+d" (_ry2) : "d" (rx), "d" (_ry1) : "cc"); return rc;}EXPORT_SYMBOL(diag14);/* * Diagnose 210: Get information about a virtual device */int diag210(struct diag210 *addr){ /* * diag 210 needs its data below the 2GB border, so we * use a static data area to be sure */ static struct diag210 diag210_tmp; static DEFINE_SPINLOCK(diag210_lock); unsigned long flags; int ccode; spin_lock_irqsave(&diag210_lock, flags); diag210_tmp = *addr;#ifdef CONFIG_64BIT asm volatile( " lhi %0,-1\n" " sam31\n" " diag %1,0,0x210\n" "0: ipm %0\n" " srl %0,28\n" "1: sam64\n" EX_TABLE(0b, 1b) : "=&d" (ccode) : "a" (&diag210_tmp) : "cc", "memory");#else asm volatile( " lhi %0,-1\n" " diag %1,0,0x210\n" "0: ipm %0\n" " srl %0,28\n" "1:\n" EX_TABLE(0b, 1b) : "=&d" (ccode) : "a" (&diag210_tmp) : "cc", "memory");#endif *addr = diag210_tmp; spin_unlock_irqrestore(&diag210_lock, flags); return ccode;}EXPORT_SYMBOL(diag210);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -