提交 511b00a3 编写于 作者: L Linus Torvalds

Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6

* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6:
  [S390] zcrypt: fix possible race when unloading zcrypt driver modules
  [S390] zcrypt: fix possible dead lock in AP bus module
  [S390] Wire up sys_utimes.
  [S390] reboot from and dump to SCSI under z/VM fails.
  [S390] Wire up compat_sys_epoll_pwait.
  [S390] strlcpy is smart enough
  [S390] memory detection: fix off by one bug.
  [S390] cio: qdio slsb setup
...@@ -1665,3 +1665,20 @@ sys_getcpu_wrapper: ...@@ -1665,3 +1665,20 @@ sys_getcpu_wrapper:
llgtr %r3,%r3 # unsigned * llgtr %r3,%r3 # unsigned *
llgtr %r4,%r4 # struct getcpu_cache * llgtr %r4,%r4 # struct getcpu_cache *
jg sys_getcpu jg sys_getcpu
.globl compat_sys_epoll_pwait_wrapper
compat_sys_epoll_pwait_wrapper:
lgfr %r2,%r2 # int
llgtr %r3,%r3 # struct compat_epoll_event *
lgfr %r4,%r4 # int
lgfr %r5,%r5 # int
llgtr %r6,%r6 # compat_sigset_t *
llgf %r0,164(%r15) # compat_size_t
stg %r0,160(%r15)
jg compat_sys_epoll_pwait
.globl compat_sys_utimes_wrapper
compat_sys_utimes_wrapper:
llgtr %r2,%r2 # char *
llgtr %r3,%r3 # struct compat_timeval *
jg compat_sys_utimes
...@@ -268,7 +268,7 @@ debug_info_alloc(char *name, int pages_per_area, int nr_areas, int buf_size, ...@@ -268,7 +268,7 @@ debug_info_alloc(char *name, int pages_per_area, int nr_areas, int buf_size,
rc->level = level; rc->level = level;
rc->buf_size = buf_size; rc->buf_size = buf_size;
rc->entry_size = sizeof(debug_entry_t) + buf_size; rc->entry_size = sizeof(debug_entry_t) + buf_size;
strlcpy(rc->name, name, sizeof(rc->name)-1); strlcpy(rc->name, name, sizeof(rc->name));
memset(rc->views, 0, DEBUG_MAX_VIEWS * sizeof(struct debug_view *)); memset(rc->views, 0, DEBUG_MAX_VIEWS * sizeof(struct debug_view *));
memset(rc->debugfs_entries, 0 ,DEBUG_MAX_VIEWS * memset(rc->debugfs_entries, 0 ,DEBUG_MAX_VIEWS *
sizeof(struct dentry*)); sizeof(struct dentry*));
......
...@@ -141,9 +141,9 @@ static noinline __init void detect_machine_type(void) ...@@ -141,9 +141,9 @@ static noinline __init void detect_machine_type(void)
machine_flags |= 4; machine_flags |= 4;
} }
#ifdef CONFIG_64BIT
static noinline __init int memory_fast_detect(void) static noinline __init int memory_fast_detect(void)
{ {
unsigned long val0 = 0; unsigned long val0 = 0;
unsigned long val1 = 0xc; unsigned long val1 = 0xc;
int ret = -ENOSYS; int ret = -ENOSYS;
...@@ -161,9 +161,15 @@ static noinline __init int memory_fast_detect(void) ...@@ -161,9 +161,15 @@ static noinline __init int memory_fast_detect(void)
if (ret || val0 != val1) if (ret || val0 != val1)
return -ENOSYS; return -ENOSYS;
memory_chunk[0].size = val0; memory_chunk[0].size = val0 + 1;
return 0; return 0;
} }
#else
static inline int memory_fast_detect(void)
{
return -ENOSYS;
}
#endif
#define ADDR2G (1UL << 31) #define ADDR2G (1UL << 31)
......
...@@ -839,7 +839,7 @@ static int __init reipl_ccw_init(void) ...@@ -839,7 +839,7 @@ static int __init reipl_ccw_init(void)
} }
reipl_block_ccw->hdr.len = IPL_PARM_BLK_CCW_LEN; reipl_block_ccw->hdr.len = IPL_PARM_BLK_CCW_LEN;
reipl_block_ccw->hdr.version = IPL_PARM_BLOCK_VERSION; reipl_block_ccw->hdr.version = IPL_PARM_BLOCK_VERSION;
reipl_block_ccw->hdr.blk0_len = sizeof(reipl_block_ccw->ipl_info.ccw); reipl_block_ccw->hdr.blk0_len = IPL_PARM_BLK0_CCW_LEN;
reipl_block_ccw->hdr.pbt = DIAG308_IPL_TYPE_CCW; reipl_block_ccw->hdr.pbt = DIAG308_IPL_TYPE_CCW;
/* check if read scp info worked and set loadparm */ /* check if read scp info worked and set loadparm */
if (SCCB_VALID) if (SCCB_VALID)
...@@ -880,8 +880,7 @@ static int __init reipl_fcp_init(void) ...@@ -880,8 +880,7 @@ static int __init reipl_fcp_init(void)
} else { } else {
reipl_block_fcp->hdr.len = IPL_PARM_BLK_FCP_LEN; reipl_block_fcp->hdr.len = IPL_PARM_BLK_FCP_LEN;
reipl_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION; reipl_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION;
reipl_block_fcp->hdr.blk0_len = reipl_block_fcp->hdr.blk0_len = IPL_PARM_BLK0_FCP_LEN;
sizeof(reipl_block_fcp->ipl_info.fcp);
reipl_block_fcp->hdr.pbt = DIAG308_IPL_TYPE_FCP; reipl_block_fcp->hdr.pbt = DIAG308_IPL_TYPE_FCP;
reipl_block_fcp->ipl_info.fcp.opt = DIAG308_IPL_OPT_IPL; reipl_block_fcp->ipl_info.fcp.opt = DIAG308_IPL_OPT_IPL;
} }
...@@ -930,7 +929,7 @@ static int __init dump_ccw_init(void) ...@@ -930,7 +929,7 @@ static int __init dump_ccw_init(void)
} }
dump_block_ccw->hdr.len = IPL_PARM_BLK_CCW_LEN; dump_block_ccw->hdr.len = IPL_PARM_BLK_CCW_LEN;
dump_block_ccw->hdr.version = IPL_PARM_BLOCK_VERSION; dump_block_ccw->hdr.version = IPL_PARM_BLOCK_VERSION;
dump_block_ccw->hdr.blk0_len = sizeof(reipl_block_ccw->ipl_info.ccw); dump_block_ccw->hdr.blk0_len = IPL_PARM_BLK0_CCW_LEN;
dump_block_ccw->hdr.pbt = DIAG308_IPL_TYPE_CCW; dump_block_ccw->hdr.pbt = DIAG308_IPL_TYPE_CCW;
dump_capabilities |= IPL_TYPE_CCW; dump_capabilities |= IPL_TYPE_CCW;
return 0; return 0;
...@@ -954,7 +953,7 @@ static int __init dump_fcp_init(void) ...@@ -954,7 +953,7 @@ static int __init dump_fcp_init(void)
} }
dump_block_fcp->hdr.len = IPL_PARM_BLK_FCP_LEN; dump_block_fcp->hdr.len = IPL_PARM_BLK_FCP_LEN;
dump_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION; dump_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION;
dump_block_fcp->hdr.blk0_len = sizeof(dump_block_fcp->ipl_info.fcp); dump_block_fcp->hdr.blk0_len = IPL_PARM_BLK0_FCP_LEN;
dump_block_fcp->hdr.pbt = DIAG308_IPL_TYPE_FCP; dump_block_fcp->hdr.pbt = DIAG308_IPL_TYPE_FCP;
dump_block_fcp->ipl_info.fcp.opt = DIAG308_IPL_OPT_DUMP; dump_block_fcp->ipl_info.fcp.opt = DIAG308_IPL_OPT_DUMP;
dump_capabilities |= IPL_TYPE_FCP; dump_capabilities |= IPL_TYPE_FCP;
......
...@@ -320,4 +320,5 @@ SYSCALL(sys_tee,sys_tee,sys_tee_wrapper) ...@@ -320,4 +320,5 @@ SYSCALL(sys_tee,sys_tee,sys_tee_wrapper)
SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper) SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper)
NI_SYSCALL /* 310 sys_move_pages */ NI_SYSCALL /* 310 sys_move_pages */
SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper) SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper)
SYSCALL(sys_epoll_pwait,sys_epoll_pwait,sys_ni_syscall) SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait_wrapper)
SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper)
...@@ -210,9 +210,11 @@ qdio_do_sqbs(struct qdio_q *q, unsigned char state, ...@@ -210,9 +210,11 @@ qdio_do_sqbs(struct qdio_q *q, unsigned char state,
goto again; goto again;
} }
if (rc < 0) { if (rc < 0) {
QDIO_DBF_TEXT3(1,trace,"sqberr"); QDIO_DBF_TEXT3(1,trace,"sqberr");
sprintf(dbf_text,"%2x,%2x,%d,%d",tmp_cnt,*cnt,ccq,q_no); sprintf(dbf_text,"%2x,%2x",tmp_cnt,*cnt);
QDIO_DBF_TEXT3(1,trace,dbf_text); QDIO_DBF_TEXT3(1,trace,dbf_text);
sprintf(dbf_text,"%d,%d",ccq,q_no);
QDIO_DBF_TEXT3(1,trace,dbf_text);
q->handler(q->cdev,QDIO_STATUS_ACTIVATE_CHECK_CONDITION| q->handler(q->cdev,QDIO_STATUS_ACTIVATE_CHECK_CONDITION|
QDIO_STATUS_LOOK_FOR_ERROR, QDIO_STATUS_LOOK_FOR_ERROR,
0, 0, 0, -1, -1, q->int_parm); 0, 0, 0, -1, -1, q->int_parm);
...@@ -1250,7 +1252,6 @@ qdio_is_inbound_q_done(struct qdio_q *q) ...@@ -1250,7 +1252,6 @@ qdio_is_inbound_q_done(struct qdio_q *q)
if (!no_used) { if (!no_used) {
QDIO_DBF_TEXT4(0,trace,"inqisdnA"); QDIO_DBF_TEXT4(0,trace,"inqisdnA");
QDIO_DBF_HEX4(0,trace,&q,sizeof(void*)); QDIO_DBF_HEX4(0,trace,&q,sizeof(void*));
QDIO_DBF_TEXT4(0,trace,dbf_text);
return 1; return 1;
} }
if (irq->is_qebsm) { if (irq->is_qebsm) {
...@@ -3371,10 +3372,15 @@ qdio_do_qdio_fill_input(struct qdio_q *q, unsigned int qidx, ...@@ -3371,10 +3372,15 @@ qdio_do_qdio_fill_input(struct qdio_q *q, unsigned int qidx,
unsigned int count, struct qdio_buffer *buffers) unsigned int count, struct qdio_buffer *buffers)
{ {
struct qdio_irq *irq = (struct qdio_irq *) q->irq_ptr; struct qdio_irq *irq = (struct qdio_irq *) q->irq_ptr;
int tmp = 0;
qidx &= (QDIO_MAX_BUFFERS_PER_Q - 1); qidx &= (QDIO_MAX_BUFFERS_PER_Q - 1);
if (irq->is_qebsm) { if (irq->is_qebsm) {
while (count) while (count) {
set_slsb(q, &qidx, SLSB_CU_INPUT_EMPTY, &count); tmp = set_slsb(q, &qidx, SLSB_CU_INPUT_EMPTY, &count);
if (!tmp)
return;
}
return; return;
} }
for (;;) { for (;;) {
...@@ -3390,11 +3396,15 @@ qdio_do_qdio_fill_output(struct qdio_q *q, unsigned int qidx, ...@@ -3390,11 +3396,15 @@ qdio_do_qdio_fill_output(struct qdio_q *q, unsigned int qidx,
unsigned int count, struct qdio_buffer *buffers) unsigned int count, struct qdio_buffer *buffers)
{ {
struct qdio_irq *irq = (struct qdio_irq *) q->irq_ptr; struct qdio_irq *irq = (struct qdio_irq *) q->irq_ptr;
int tmp = 0;
qidx &= (QDIO_MAX_BUFFERS_PER_Q - 1); qidx &= (QDIO_MAX_BUFFERS_PER_Q - 1);
if (irq->is_qebsm) { if (irq->is_qebsm) {
while (count) while (count) {
set_slsb(q, &qidx, SLSB_CU_OUTPUT_PRIMED, &count); tmp = set_slsb(q, &qidx, SLSB_CU_OUTPUT_PRIMED, &count);
if (!tmp)
return;
}
return; return;
} }
......
...@@ -65,6 +65,8 @@ module_param_named(poll_thread, ap_thread_flag, int, 0000); ...@@ -65,6 +65,8 @@ module_param_named(poll_thread, ap_thread_flag, int, 0000);
MODULE_PARM_DESC(poll_thread, "Turn on/off poll thread, default is 1 (on)."); MODULE_PARM_DESC(poll_thread, "Turn on/off poll thread, default is 1 (on).");
static struct device *ap_root_device = NULL; static struct device *ap_root_device = NULL;
static DEFINE_SPINLOCK(ap_device_lock);
static LIST_HEAD(ap_device_list);
/** /**
* Workqueue & timer for bus rescan. * Workqueue & timer for bus rescan.
...@@ -457,6 +459,9 @@ static int ap_device_probe(struct device *dev) ...@@ -457,6 +459,9 @@ static int ap_device_probe(struct device *dev)
int rc; int rc;
ap_dev->drv = ap_drv; ap_dev->drv = ap_drv;
spin_lock_bh(&ap_device_lock);
list_add(&ap_dev->list, &ap_device_list);
spin_unlock_bh(&ap_device_lock);
rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV; rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV;
return rc; return rc;
} }
...@@ -497,6 +502,9 @@ static int ap_device_remove(struct device *dev) ...@@ -497,6 +502,9 @@ static int ap_device_remove(struct device *dev)
ap_flush_queue(ap_dev); ap_flush_queue(ap_dev);
if (ap_drv->remove) if (ap_drv->remove)
ap_drv->remove(ap_dev); ap_drv->remove(ap_dev);
spin_lock_bh(&ap_device_lock);
list_del_init(&ap_dev->list);
spin_unlock_bh(&ap_device_lock);
return 0; return 0;
} }
...@@ -772,6 +780,7 @@ static void ap_scan_bus(struct work_struct *unused) ...@@ -772,6 +780,7 @@ static void ap_scan_bus(struct work_struct *unused)
spin_lock_init(&ap_dev->lock); spin_lock_init(&ap_dev->lock);
INIT_LIST_HEAD(&ap_dev->pendingq); INIT_LIST_HEAD(&ap_dev->pendingq);
INIT_LIST_HEAD(&ap_dev->requestq); INIT_LIST_HEAD(&ap_dev->requestq);
INIT_LIST_HEAD(&ap_dev->list);
if (device_type == 0) if (device_type == 0)
ap_probe_device_type(ap_dev); ap_probe_device_type(ap_dev);
else else
...@@ -1033,14 +1042,13 @@ static void ap_poll_timeout(unsigned long unused) ...@@ -1033,14 +1042,13 @@ static void ap_poll_timeout(unsigned long unused)
* polling until bit 2^0 of the control flags is not set. If bit 2^1 * polling until bit 2^0 of the control flags is not set. If bit 2^1
* of the control flags has been set arm the poll timer. * of the control flags has been set arm the poll timer.
*/ */
static int __ap_poll_all(struct device *dev, void *data) static int __ap_poll_all(struct ap_device *ap_dev, unsigned long *flags)
{ {
struct ap_device *ap_dev = to_ap_dev(dev);
int rc; int rc;
spin_lock(&ap_dev->lock); spin_lock(&ap_dev->lock);
if (!ap_dev->unregistered) { if (!ap_dev->unregistered) {
rc = ap_poll_queue(to_ap_dev(dev), (unsigned long *) data); rc = ap_poll_queue(ap_dev, flags);
if (rc) if (rc)
ap_dev->unregistered = 1; ap_dev->unregistered = 1;
} else } else
...@@ -1054,10 +1062,15 @@ static int __ap_poll_all(struct device *dev, void *data) ...@@ -1054,10 +1062,15 @@ static int __ap_poll_all(struct device *dev, void *data)
static void ap_poll_all(unsigned long dummy) static void ap_poll_all(unsigned long dummy)
{ {
unsigned long flags; unsigned long flags;
struct ap_device *ap_dev;
do { do {
flags = 0; flags = 0;
bus_for_each_dev(&ap_bus_type, NULL, &flags, __ap_poll_all); spin_lock(&ap_device_lock);
list_for_each_entry(ap_dev, &ap_device_list, list) {
__ap_poll_all(ap_dev, &flags);
}
spin_unlock(&ap_device_lock);
} while (flags & 1); } while (flags & 1);
if (flags & 2) if (flags & 2)
ap_schedule_poll_timer(); ap_schedule_poll_timer();
...@@ -1075,6 +1088,7 @@ static int ap_poll_thread(void *data) ...@@ -1075,6 +1088,7 @@ static int ap_poll_thread(void *data)
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
unsigned long flags; unsigned long flags;
int requests; int requests;
struct ap_device *ap_dev;
set_user_nice(current, 19); set_user_nice(current, 19);
while (1) { while (1) {
...@@ -1092,10 +1106,12 @@ static int ap_poll_thread(void *data) ...@@ -1092,10 +1106,12 @@ static int ap_poll_thread(void *data)
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
remove_wait_queue(&ap_poll_wait, &wait); remove_wait_queue(&ap_poll_wait, &wait);
local_bh_disable();
flags = 0; flags = 0;
bus_for_each_dev(&ap_bus_type, NULL, &flags, __ap_poll_all); spin_lock_bh(&ap_device_lock);
local_bh_enable(); list_for_each_entry(ap_dev, &ap_device_list, list) {
__ap_poll_all(ap_dev, &flags);
}
spin_unlock_bh(&ap_device_lock);
} }
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
remove_wait_queue(&ap_poll_wait, &wait); remove_wait_queue(&ap_poll_wait, &wait);
......
...@@ -106,6 +106,7 @@ struct ap_device { ...@@ -106,6 +106,7 @@ struct ap_device {
struct device device; struct device device;
struct ap_driver *drv; /* Pointer to AP device driver. */ struct ap_driver *drv; /* Pointer to AP device driver. */
spinlock_t lock; /* Per device lock. */ spinlock_t lock; /* Per device lock. */
struct list_head list; /* private list of all AP devices. */
ap_qid_t qid; /* AP queue id. */ ap_qid_t qid; /* AP queue id. */
int queue_depth; /* AP queue depth.*/ int queue_depth; /* AP queue depth.*/
......
...@@ -298,14 +298,14 @@ static long zcrypt_rsa_modexpo(struct ica_rsa_modexpo *mex) ...@@ -298,14 +298,14 @@ static long zcrypt_rsa_modexpo(struct ica_rsa_modexpo *mex)
get_device(&zdev->ap_dev->device); get_device(&zdev->ap_dev->device);
zdev->request_count++; zdev->request_count++;
__zcrypt_decrease_preference(zdev); __zcrypt_decrease_preference(zdev);
spin_unlock_bh(&zcrypt_device_lock);
if (try_module_get(zdev->ap_dev->drv->driver.owner)) { if (try_module_get(zdev->ap_dev->drv->driver.owner)) {
spin_unlock_bh(&zcrypt_device_lock);
rc = zdev->ops->rsa_modexpo(zdev, mex); rc = zdev->ops->rsa_modexpo(zdev, mex);
spin_lock_bh(&zcrypt_device_lock);
module_put(zdev->ap_dev->drv->driver.owner); module_put(zdev->ap_dev->drv->driver.owner);
} }
else else
rc = -EAGAIN; rc = -EAGAIN;
spin_lock_bh(&zcrypt_device_lock);
zdev->request_count--; zdev->request_count--;
__zcrypt_increase_preference(zdev); __zcrypt_increase_preference(zdev);
put_device(&zdev->ap_dev->device); put_device(&zdev->ap_dev->device);
...@@ -373,14 +373,14 @@ static long zcrypt_rsa_crt(struct ica_rsa_modexpo_crt *crt) ...@@ -373,14 +373,14 @@ static long zcrypt_rsa_crt(struct ica_rsa_modexpo_crt *crt)
get_device(&zdev->ap_dev->device); get_device(&zdev->ap_dev->device);
zdev->request_count++; zdev->request_count++;
__zcrypt_decrease_preference(zdev); __zcrypt_decrease_preference(zdev);
spin_unlock_bh(&zcrypt_device_lock);
if (try_module_get(zdev->ap_dev->drv->driver.owner)) { if (try_module_get(zdev->ap_dev->drv->driver.owner)) {
spin_unlock_bh(&zcrypt_device_lock);
rc = zdev->ops->rsa_modexpo_crt(zdev, crt); rc = zdev->ops->rsa_modexpo_crt(zdev, crt);
spin_lock_bh(&zcrypt_device_lock);
module_put(zdev->ap_dev->drv->driver.owner); module_put(zdev->ap_dev->drv->driver.owner);
} }
else else
rc = -EAGAIN; rc = -EAGAIN;
spin_lock_bh(&zcrypt_device_lock);
zdev->request_count--; zdev->request_count--;
__zcrypt_increase_preference(zdev); __zcrypt_increase_preference(zdev);
put_device(&zdev->ap_dev->device); put_device(&zdev->ap_dev->device);
...@@ -408,14 +408,14 @@ static long zcrypt_send_cprb(struct ica_xcRB *xcRB) ...@@ -408,14 +408,14 @@ static long zcrypt_send_cprb(struct ica_xcRB *xcRB)
get_device(&zdev->ap_dev->device); get_device(&zdev->ap_dev->device);
zdev->request_count++; zdev->request_count++;
__zcrypt_decrease_preference(zdev); __zcrypt_decrease_preference(zdev);
spin_unlock_bh(&zcrypt_device_lock);
if (try_module_get(zdev->ap_dev->drv->driver.owner)) { if (try_module_get(zdev->ap_dev->drv->driver.owner)) {
spin_unlock_bh(&zcrypt_device_lock);
rc = zdev->ops->send_cprb(zdev, xcRB); rc = zdev->ops->send_cprb(zdev, xcRB);
spin_lock_bh(&zcrypt_device_lock);
module_put(zdev->ap_dev->drv->driver.owner); module_put(zdev->ap_dev->drv->driver.owner);
} }
else else
rc = -EAGAIN; rc = -EAGAIN;
spin_lock_bh(&zcrypt_device_lock);
zdev->request_count--; zdev->request_count--;
__zcrypt_increase_preference(zdev); __zcrypt_increase_preference(zdev);
put_device(&zdev->ap_dev->device); put_device(&zdev->ap_dev->device);
......
...@@ -14,9 +14,13 @@ ...@@ -14,9 +14,13 @@
#define IPL_PARM_BLK_FCP_LEN (sizeof(struct ipl_list_hdr) + \ #define IPL_PARM_BLK_FCP_LEN (sizeof(struct ipl_list_hdr) + \
sizeof(struct ipl_block_fcp)) sizeof(struct ipl_block_fcp))
#define IPL_PARM_BLK0_FCP_LEN (sizeof(struct ipl_block_fcp) + 8)
#define IPL_PARM_BLK_CCW_LEN (sizeof(struct ipl_list_hdr) + \ #define IPL_PARM_BLK_CCW_LEN (sizeof(struct ipl_list_hdr) + \
sizeof(struct ipl_block_ccw)) sizeof(struct ipl_block_ccw))
#define IPL_PARM_BLK0_CCW_LEN (sizeof(struct ipl_block_ccw) + 8)
#define IPL_MAX_SUPPORTED_VERSION (0) #define IPL_MAX_SUPPORTED_VERSION (0)
#define IPL_PARMBLOCK_START ((struct ipl_parameter_block *) \ #define IPL_PARMBLOCK_START ((struct ipl_parameter_block *) \
...@@ -58,6 +62,7 @@ struct ipl_block_ccw { ...@@ -58,6 +62,7 @@ struct ipl_block_ccw {
u8 vm_flags; u8 vm_flags;
u8 reserved3[3]; u8 reserved3[3];
u32 vm_parm_len; u32 vm_parm_len;
u8 reserved4[80];
} __attribute__((packed)); } __attribute__((packed));
struct ipl_parameter_block { struct ipl_parameter_block {
......
...@@ -250,8 +250,9 @@ ...@@ -250,8 +250,9 @@
/* Number 310 is reserved for new sys_move_pages */ /* Number 310 is reserved for new sys_move_pages */
#define __NR_getcpu 311 #define __NR_getcpu 311
#define __NR_epoll_pwait 312 #define __NR_epoll_pwait 312
#define __NR_utimes 313
#define NR_syscalls 313 #define NR_syscalls 314
/* /*
* There are some system calls that are not present on 64 bit, some * There are some system calls that are not present on 64 bit, some
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册