Lines Matching refs:monmsg

102 static inline unsigned long mon_mca_start(struct mon_msg *monmsg)
104 return *(u32 *) &monmsg->msg.rmmsg;
107 static inline unsigned long mon_mca_end(struct mon_msg *monmsg)
109 return *(u32 *) &monmsg->msg.rmmsg[4];
112 static inline u8 mon_mca_type(struct mon_msg *monmsg, u8 index)
114 return *((u8 *)__va(mon_mca_start(monmsg)) + monmsg->mca_offset + index);
117 static inline u32 mon_mca_size(struct mon_msg *monmsg)
119 return mon_mca_end(monmsg) - mon_mca_start(monmsg) + 1;
122 static inline u32 mon_rec_start(struct mon_msg *monmsg)
124 return *((u32 *)(__va(mon_mca_start(monmsg)) + monmsg->mca_offset + 4));
127 static inline u32 mon_rec_end(struct mon_msg *monmsg)
129 return *((u32 *)(__va(mon_mca_start(monmsg)) + monmsg->mca_offset + 8));
132 static int mon_check_mca(struct mon_msg *monmsg)
134 if ((mon_rec_end(monmsg) <= mon_rec_start(monmsg)) ||
135 (mon_rec_start(monmsg) < mon_dcss_start) ||
136 (mon_rec_end(monmsg) > mon_dcss_end) ||
137 (mon_mca_type(monmsg, 0) == 0) ||
138 (mon_mca_size(monmsg) % 12 != 0) ||
139 (mon_mca_end(monmsg) <= mon_mca_start(monmsg)) ||
140 (mon_mca_end(monmsg) > mon_dcss_end) ||
141 (mon_mca_start(monmsg) < mon_dcss_start) ||
142 ((mon_mca_type(monmsg, 1) == 0) && (mon_mca_type(monmsg, 2) == 0)))
147 static int mon_send_reply(struct mon_msg *monmsg,
152 rc = iucv_message_reply(monpriv->path, &monmsg->msg,
155 if (likely(!monmsg->msglim_reached)) {
156 monmsg->pos = 0;
157 monmsg->mca_offset = 0;
162 monmsg->replied_msglim = 1;
198 static inline void mon_next_mca(struct mon_msg *monmsg)
200 if (likely((mon_mca_size(monmsg) - monmsg->mca_offset) == 12))
202 monmsg->mca_offset += 12;
203 monmsg->pos = 0;
208 struct mon_msg *monmsg;
212 monmsg = monpriv->msg_array[monpriv->read_index];
213 if (unlikely(monmsg->replied_msglim)) {
214 monmsg->replied_msglim = 0;
215 monmsg->msglim_reached = 0;
216 monmsg->pos = 0;
217 monmsg->mca_offset = 0;
223 return monmsg;
365 struct mon_msg *monmsg;
369 monmsg = mon_next_message(monpriv);
370 if (IS_ERR(monmsg))
371 return PTR_ERR(monmsg);
373 if (!monmsg) {
383 monmsg = monpriv->msg_array[monpriv->read_index];
386 if (!monmsg->pos)
387 monmsg->pos = mon_mca_start(monmsg) + monmsg->mca_offset;
388 if (mon_check_mca(monmsg))
392 mce_start = mon_mca_start(monmsg) + monmsg->mca_offset;
393 if ((monmsg->pos >= mce_start) && (monmsg->pos < mce_start + 12)) {
394 count = min(count, (size_t) mce_start + 12 - monmsg->pos);
395 ret = copy_to_user(data, __va(monmsg->pos), count);
398 monmsg->pos += count;
399 if (monmsg->pos == mce_start + 12)
400 monmsg->pos = mon_rec_start(monmsg);
405 if (monmsg->pos <= mon_rec_end(monmsg)) {
406 count = min(count, (size_t) mon_rec_end(monmsg) - monmsg->pos
408 ret = copy_to_user(data, __va(monmsg->pos), count);
411 monmsg->pos += count;
412 if (monmsg->pos > mon_rec_end(monmsg))
413 mon_next_mca(monmsg);
417 ret = mon_send_reply(monmsg, monpriv);