Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 64197
b: refs/heads/master
c: 0a87c5c
h: refs/heads/master
i:
  64195: c69f037
v: v3
  • Loading branch information
Michael Holzheu authored and Martin Schwidefsky committed Aug 22, 2007
1 parent 8fb275e commit a42a61b
Show file tree
Hide file tree
Showing 13 changed files with 151 additions and 112 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 37cd0a007f88f1d6269035bdb02b50f536cca8de
refs/heads/master: 0a87c5cfc0bb0c1bdcc1cc9fd82e4a1711fac512
2 changes: 1 addition & 1 deletion trunk/arch/s390/kernel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ EXTRA_AFLAGS := -traditional

obj-y := bitmap.o traps.o time.o process.o base.o early.o \
setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \
semaphore.o s390_ext.o debug.o irq.o ipl.o dis.o
semaphore.o s390_ext.o debug.o irq.o ipl.o dis.o diag.o

obj-y += $(if $(CONFIG_64BIT),entry64.o,entry.o)
obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o)
Expand Down
102 changes: 102 additions & 0 deletions trunk/arch/s390/kernel/diag.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/*
* 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);
1 change: 0 additions & 1 deletion trunk/arch/s390/kernel/s390_ksyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ EXPORT_SYMBOL(_oi_bitmap);
EXPORT_SYMBOL(_ni_bitmap);
EXPORT_SYMBOL(_zb_findmap);
EXPORT_SYMBOL(_sb_findmap);
EXPORT_SYMBOL(diag10);

/*
* semaphore ops
Expand Down
1 change: 1 addition & 0 deletions trunk/arch/s390/mm/cmm.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

#include <asm/pgalloc.h>
#include <asm/uaccess.h>
#include <asm/diag.h>

static char *sender = "VMRMSVM";
module_param(sender, charp, 0400);
Expand Down
17 changes: 0 additions & 17 deletions trunk/arch/s390/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,23 +42,6 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__((__aligned__(PAGE_SIZE)));
char empty_zero_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));

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));
}

void show_mem(void)
{
int i, total = 0, reserved = 0;
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/s390/block/dasd_diag.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <asm/s390_ext.h>
#include <asm/todclk.h>
#include <asm/vtoc.h>
#include <asm/diag.h>

#include "dasd_int.h"
#include "dasd_diag.h"
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/s390/char/raw3270.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <asm/ccwdev.h>
#include <asm/cio.h>
#include <asm/ebcdic.h>
#include <asm/diag.h>

#include "raw3270.h"

Expand Down
32 changes: 4 additions & 28 deletions trunk/drivers/s390/char/vmur.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <asm/cio.h>
#include <asm/ccwdev.h>
#include <asm/debug.h>
#include <asm/diag.h>

#include "vmur.h"

Expand Down Expand Up @@ -379,31 +380,6 @@ static ssize_t ur_write(struct file *file, const char __user *udata,
return do_write(urf->urd, udata, count, urf->dev_reclen, ppos);
}

static int do_diag_14(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");

TRACE("diag 14: subcode=0x%lx, cc=%i\n", subcode, rc);
return rc;
}

/*
* diagnose code 0x14 subcode 0x0028 - position spool file to designated
* record
Expand All @@ -415,7 +391,7 @@ static int diag_position_to_record(int devno, int record)
{
int cc;

cc = do_diag_14(record, devno, 0x28);
cc = diag14(record, devno, 0x28);
switch (cc) {
case 0:
return 0;
Expand All @@ -440,7 +416,7 @@ static int diag_read_file(int devno, char *buf)
{
int cc;

cc = do_diag_14((unsigned long) buf, devno, 0x00);
cc = diag14((unsigned long) buf, devno, 0x00);
switch (cc) {
case 0:
return 0;
Expand Down Expand Up @@ -533,7 +509,7 @@ static int diag_read_next_file_info(struct file_control_block *buf, int spid)
{
int cc;

cc = do_diag_14((unsigned long) buf, spid, 0xfff);
cc = diag14((unsigned long) buf, spid, 0xfff);
switch (cc) {
case 0:
return 0;
Expand Down
48 changes: 1 addition & 47 deletions trunk/drivers/s390/cio/device_id.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,58 +17,14 @@
#include <asm/delay.h>
#include <asm/cio.h>
#include <asm/lowcore.h>
#include <asm/diag.h>

#include "cio.h"
#include "cio_debug.h"
#include "css.h"
#include "device.h"
#include "ioasm.h"

/*
* diag210 is used under VM to 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;
}

/*
* Input :
* devno - device number
Expand Down Expand Up @@ -349,5 +305,3 @@ ccw_device_sense_id_irq(struct ccw_device *cdev, enum dev_event dev_event)
break;
}
}

EXPORT_SYMBOL(diag210);
15 changes: 0 additions & 15 deletions trunk/include/asm-s390/cio.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,19 +258,6 @@ struct ciw {
/* Sick revalidation of device. */
#define CIO_REVALIDATE 0x0008

struct diag210 {
__u16 vrdcdvno : 16; /* device number (input) */
__u16 vrdclen : 16; /* data block length (input) */
__u32 vrdcvcla : 8; /* virtual device class (output) */
__u32 vrdcvtyp : 8; /* virtual device type (output) */
__u32 vrdcvsta : 8; /* virtual device status (output) */
__u32 vrdcvfla : 8; /* virtual device flags (output) */
__u32 vrdcrccl : 8; /* real device class (output) */
__u32 vrdccrty : 8; /* real device type (output) */
__u32 vrdccrmd : 8; /* real device model (output) */
__u32 vrdccrft : 8; /* real device feature (output) */
} __attribute__ ((packed,aligned(4)));

struct ccw_dev_id {
u8 ssid;
u16 devno;
Expand All @@ -285,8 +272,6 @@ static inline int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1,
return 0;
}

extern int diag210(struct diag210 *addr);

extern void wait_cons_dev(void);

extern void css_schedule_reprobe(void);
Expand Down
39 changes: 39 additions & 0 deletions trunk/include/asm-s390/diag.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* s390 diagnose functions
*
* Copyright IBM Corp. 2007
* Author(s): Michael Holzheu <holzheu@de.ibm.com>
*/

#ifndef _ASM_S390_DIAG_H
#define _ASM_S390_DIAG_H

/*
* Diagnose 10: Release pages
*/
extern void diag10(unsigned long addr);

/*
* Diagnose 14: Input spool file manipulation
*/
extern int diag14(unsigned long rx, unsigned long ry1, unsigned long subcode);

/*
* Diagnose 210: Get information about a virtual device
*/
struct diag210 {
u16 vrdcdvno; /* device number (input) */
u16 vrdclen; /* data block length (input) */
u8 vrdcvcla; /* virtual device class (output) */
u8 vrdcvtyp; /* virtual device type (output) */
u8 vrdcvsta; /* virtual device status (output) */
u8 vrdcvfla; /* virtual device flags (output) */
u8 vrdcrccl; /* real device class (output) */
u8 vrdccrty; /* real device type (output) */
u8 vrdccrmd; /* real device model (output) */
u8 vrdccrft; /* real device feature (output) */
} __attribute__((packed, aligned(4)));

extern int diag210(struct diag210 *addr);

#endif /* _ASM_S390_DIAG_H */
2 changes: 0 additions & 2 deletions trunk/include/asm-s390/pgalloc.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@

#define check_pgt_cache() do {} while (0)

extern void diag10(unsigned long addr);

/*
* Page allocation orders.
*/
Expand Down

0 comments on commit a42a61b

Please sign in to comment.