sysinfo.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:9k
- /*
- * drivers/s390/sysinfo.c
- *
- * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
- * Author(s): Ulrich Weigand (Ulrich.Weigand@de.ibm.com)
- */
- #include <linux/config.h>
- #include <linux/kernel.h>
- #include <linux/mm.h>
- #include <linux/proc_fs.h>
- #include <linux/init.h>
- #include <asm/ebcdic.h>
- struct sysinfo_1_1_1
- {
- char reserved_0[32];
- char manufacturer[16];
- char type[4];
- char reserved_1[12];
- char model[16];
- char sequence[16];
- char plant[4];
- };
- struct sysinfo_1_2_1
- {
- char reserved_0[80];
- char sequence[16];
- char plant[4];
- char reserved_1[2];
- unsigned short cpu_address;
- };
- struct sysinfo_1_2_2
- {
- char reserved_0[32];
- unsigned int capability;
- unsigned short cpus_total;
- unsigned short cpus_configured;
- unsigned short cpus_standby;
- unsigned short cpus_reserved;
- unsigned short adjustment[0];
- };
- struct sysinfo_2_2_1
- {
- char reserved_0[80];
- char sequence[16];
- char plant[4];
- unsigned short cpu_id;
- unsigned short cpu_address;
- };
- struct sysinfo_2_2_2
- {
- char reserved_0[32];
- unsigned short lpar_number;
- char reserved_1;
- unsigned char characteristics;
- #define LPAR_CHAR_DEDICATED (1 << 7)
- #define LPAR_CHAR_SHARED (1 << 6)
- #define LPAR_CHAR_LIMITED (1 << 5)
- unsigned short cpus_total;
- unsigned short cpus_configured;
- unsigned short cpus_standby;
- unsigned short cpus_reserved;
- char name[8];
- unsigned int caf;
- char reserved_2[16];
- unsigned short cpus_dedicated;
- unsigned short cpus_shared;
- };
- struct sysinfo_3_2_2
- {
- char reserved_0[31];
- unsigned char count;
- struct
- {
- char reserved_0[4];
- unsigned short cpus_total;
- unsigned short cpus_configured;
- unsigned short cpus_standby;
- unsigned short cpus_reserved;
- char name[8];
- unsigned int caf;
- char cpi[16];
- char reserved_1[24];
- } vm[8];
- };
- union s390_sysinfo
- {
- struct sysinfo_1_1_1 sysinfo_1_1_1;
- struct sysinfo_1_2_1 sysinfo_1_2_1;
- struct sysinfo_1_2_2 sysinfo_1_2_2;
- struct sysinfo_2_2_1 sysinfo_2_2_1;
- struct sysinfo_2_2_2 sysinfo_2_2_2;
- struct sysinfo_3_2_2 sysinfo_3_2_2;
- };
- static inline int stsi (void *sysinfo,
- int fc, int sel1, int sel2)
- {
- int cc, retv;
- #ifndef CONFIG_ARCH_S390X
- __asm__ __volatile__ ( "lrt0,%2n"
- "tlrt1,%3n"
- "tstsit0(%4)n"
- "0:tipmt%0n"
- "tsrlt%0,28n"
- "1:lrt%1,0n"
- ".section .fixup,"ax"n"
- "2:tlhit%0,3n"
- "tbrast1,3fn"
- "t.long 1bn"
- "3:tlt1,0(1)n"
- "tbrt1n"
- ".previousn"
- ".section __ex_table,"a"n"
- "t.align 4n"
- "t.long 0b,2bn"
- ".previousn"
- : "=d" (cc), "=d" (retv)
- : "d" ((fc << 28) | sel1), "d" (sel2), "a" (sysinfo)
- : "cc", "memory", "0", "1" );
- #else
- __asm__ __volatile__ ( "lrt0,%2n"
- "lrt1,%3n"
- "tstsit0(%4)n"
- "0:tipmt%0n"
- "tsrlt%0,28n"
- "1:lrt%1,0n"
- ".section .fixup,"ax"n"
- "2:tlhit%0,3n"
- "tjgt1bn"
- ".previousn"
- ".section __ex_table,"a"n"
- "t.align 8n"
- "t.quad 0b,2bn"
- ".previousn"
- : "=d" (cc), "=d" (retv)
- : "d" ((fc << 28) | sel1), "d" (sel2), "a" (sysinfo)
- : "cc", "memory", "0", "1" );
- #endif
- return cc? -1 : retv;
- }
- static inline int stsi_0 (void)
- {
- int rc = stsi (NULL, 0, 0, 0);
- return rc == -1 ? rc : (((unsigned int)rc) >> 28);
- }
- static inline int stsi_1_1_1 (struct sysinfo_1_1_1 *info)
- {
- int rc = stsi (info, 1, 1, 1);
- if (rc != -1)
- {
- EBCASC (info->manufacturer, sizeof(info->manufacturer));
- EBCASC (info->type, sizeof(info->type));
- EBCASC (info->model, sizeof(info->model));
- EBCASC (info->sequence, sizeof(info->sequence));
- EBCASC (info->plant, sizeof(info->plant));
- }
- return rc == -1 ? rc : 0;
- }
- static inline int stsi_1_2_1 (struct sysinfo_1_2_1 *info)
- {
- int rc = stsi (info, 1, 2, 1);
- if (rc != -1)
- {
- EBCASC (info->sequence, sizeof(info->sequence));
- EBCASC (info->plant, sizeof(info->plant));
- }
- return rc == -1 ? rc : 0;
- }
- static inline int stsi_1_2_2 (struct sysinfo_1_2_2 *info)
- {
- int rc = stsi (info, 1, 2, 2);
- return rc == -1 ? rc : 0;
- }
- static inline int stsi_2_2_1 (struct sysinfo_2_2_1 *info)
- {
- int rc = stsi (info, 2, 2, 1);
- if (rc != -1)
- {
- EBCASC (info->sequence, sizeof(info->sequence));
- EBCASC (info->plant, sizeof(info->plant));
- }
- return rc == -1 ? rc : 0;
- }
- static inline int stsi_2_2_2 (struct sysinfo_2_2_2 *info)
- {
- int rc = stsi (info, 2, 2, 2);
- if (rc != -1)
- {
- EBCASC (info->name, sizeof(info->name));
- }
- return rc == -1 ? rc : 0;
- }
- static inline int stsi_3_2_2 (struct sysinfo_3_2_2 *info)
- {
- int rc = stsi (info, 3, 2, 2);
- if (rc != -1)
- {
- int i;
- for (i = 0; i < info->count; i++)
- {
- EBCASC (info->vm[i].name, sizeof(info->vm[i].name));
- EBCASC (info->vm[i].cpi, sizeof(info->vm[i].cpi));
- }
- }
- return rc == -1 ? rc : 0;
- }
- static int proc_read_sysinfo(char *page, char **start,
- off_t off, int count,
- int *eof, void *data)
- {
- unsigned long info_page = get_free_page (GFP_KERNEL);
- union s390_sysinfo *info = (union s390_sysinfo *) info_page;
- int len = 0;
- int level;
- int i;
-
- if (!info)
- return 0;
- level = stsi_0 ();
- if (level < 1)
- goto out;
- if (stsi_1_1_1 (&info->sysinfo_1_1_1))
- goto out;
- len += sprintf (page+len, "Manufacturer: %-16.16sn",
- info->sysinfo_1_1_1.manufacturer);
- len += sprintf (page+len, "Type: %-4.4sn",
- info->sysinfo_1_1_1.type);
- len += sprintf (page+len, "Model: %-16.16sn",
- info->sysinfo_1_1_1.model);
- len += sprintf (page+len, "Sequence Code: %-16.16sn",
- info->sysinfo_1_1_1.sequence);
- len += sprintf (page+len, "Plant: %-4.4sn",
- info->sysinfo_1_1_1.plant);
- if (stsi_1_2_2 (&info->sysinfo_1_2_2))
- goto out;
- len += sprintf (page+len, "n");
- len += sprintf (page+len, "CPUs Total: %dn",
- info->sysinfo_1_2_2.cpus_total);
- len += sprintf (page+len, "CPUs Configured: %dn",
- info->sysinfo_1_2_2.cpus_configured);
- len += sprintf (page+len, "CPUs Standby: %dn",
- info->sysinfo_1_2_2.cpus_standby);
- len += sprintf (page+len, "CPUs Reserved: %dn",
- info->sysinfo_1_2_2.cpus_reserved);
- len += sprintf (page+len, "Capability: %dn",
- info->sysinfo_1_2_2.capability);
- for (i = 2; i <= info->sysinfo_1_2_2.cpus_total; i++)
- len += sprintf (page+len, "Adjustment %02d-way: %dn",
- i, info->sysinfo_1_2_2.adjustment[i-2]);
-
- if (level < 2)
- goto out;
- if (stsi_2_2_2 (&info->sysinfo_2_2_2))
- goto out;
- len += sprintf (page+len, "n");
- len += sprintf (page+len, "LPAR Number: %dn",
- info->sysinfo_2_2_2.lpar_number);
- len += sprintf (page+len, "LPAR Characteristics: ");
- if (info->sysinfo_2_2_2.characteristics & LPAR_CHAR_DEDICATED)
- len += sprintf (page+len, "Dedicated ");
- if (info->sysinfo_2_2_2.characteristics & LPAR_CHAR_SHARED)
- len += sprintf (page+len, "Shared ");
- if (info->sysinfo_2_2_2.characteristics & LPAR_CHAR_LIMITED)
- len += sprintf (page+len, "Limited ");
- len += sprintf (page+len, "n");
- len += sprintf (page+len, "LPAR Name: %-8.8sn",
- info->sysinfo_2_2_2.name);
- len += sprintf (page+len, "LPAR Adjustment: %dn",
- info->sysinfo_2_2_2.caf);
- len += sprintf (page+len, "LPAR CPUs Total: %dn",
- info->sysinfo_2_2_2.cpus_total);
- len += sprintf (page+len, "LPAR CPUs Configured: %dn",
- info->sysinfo_2_2_2.cpus_configured);
- len += sprintf (page+len, "LPAR CPUs Standby: %dn",
- info->sysinfo_2_2_2.cpus_standby);
- len += sprintf (page+len, "LPAR CPUs Reserved: %dn",
- info->sysinfo_2_2_2.cpus_reserved);
- len += sprintf (page+len, "LPAR CPUs Dedicated: %dn",
- info->sysinfo_2_2_2.cpus_dedicated);
- len += sprintf (page+len, "LPAR CPUs Shared: %dn",
- info->sysinfo_2_2_2.cpus_shared);
- if (level < 3)
- goto out;
- if (stsi_3_2_2 (&info->sysinfo_3_2_2))
- goto out;
- for (i = 0; i < info->sysinfo_3_2_2.count; i++)
- {
- len += sprintf (page+len, "n");
- len += sprintf (page+len, "VM%02d Name: %-8.8sn",
- i, info->sysinfo_3_2_2.vm[i].name);
- len += sprintf (page+len, "VM%02d Control Program: %-16.16sn",
- i, info->sysinfo_3_2_2.vm[i].cpi);
- len += sprintf (page+len, "VM%02d Adjustment: %dn",
- i, info->sysinfo_3_2_2.vm[i].caf);
- len += sprintf (page+len, "VM%02d CPUs Total: %dn",
- i, info->sysinfo_3_2_2.vm[i].cpus_total);
- len += sprintf (page+len, "VM%02d CPUs Configured: %dn",
- i, info->sysinfo_3_2_2.vm[i].cpus_configured);
- len += sprintf (page+len, "VM%02d CPUs Standby: %dn",
- i, info->sysinfo_3_2_2.vm[i].cpus_standby);
- len += sprintf (page+len, "VM%02d CPUs Reserved: %dn",
- i, info->sysinfo_3_2_2.vm[i].cpus_reserved);
- }
- out:
- free_page (info_page);
- return len;
- }
- static __init int create_proc_sysinfo(void)
- {
- create_proc_read_entry ("sysinfo", 0444, NULL,
- proc_read_sysinfo, NULL);
- return 0;
- }
- __initcall(create_proc_sysinfo);