Lines Matching refs:monmsg
104 static inline unsigned long mon_mca_start(struct mon_msg *monmsg) in mon_mca_start() argument
106 return *(u32 *) &monmsg->msg.rmmsg; in mon_mca_start()
109 static inline unsigned long mon_mca_end(struct mon_msg *monmsg) in mon_mca_end() argument
111 return *(u32 *) &monmsg->msg.rmmsg[4]; in mon_mca_end()
114 static inline u8 mon_mca_type(struct mon_msg *monmsg, u8 index) in mon_mca_type() argument
116 return *((u8 *) mon_mca_start(monmsg) + monmsg->mca_offset + index); in mon_mca_type()
119 static inline u32 mon_mca_size(struct mon_msg *monmsg) in mon_mca_size() argument
121 return mon_mca_end(monmsg) - mon_mca_start(monmsg) + 1; in mon_mca_size()
124 static inline u32 mon_rec_start(struct mon_msg *monmsg) in mon_rec_start() argument
126 return *((u32 *) (mon_mca_start(monmsg) + monmsg->mca_offset + 4)); in mon_rec_start()
129 static inline u32 mon_rec_end(struct mon_msg *monmsg) in mon_rec_end() argument
131 return *((u32 *) (mon_mca_start(monmsg) + monmsg->mca_offset + 8)); in mon_rec_end()
134 static int mon_check_mca(struct mon_msg *monmsg) in mon_check_mca() argument
136 if ((mon_rec_end(monmsg) <= mon_rec_start(monmsg)) || in mon_check_mca()
137 (mon_rec_start(monmsg) < mon_dcss_start) || in mon_check_mca()
138 (mon_rec_end(monmsg) > mon_dcss_end) || in mon_check_mca()
139 (mon_mca_type(monmsg, 0) == 0) || in mon_check_mca()
140 (mon_mca_size(monmsg) % 12 != 0) || in mon_check_mca()
141 (mon_mca_end(monmsg) <= mon_mca_start(monmsg)) || in mon_check_mca()
142 (mon_mca_end(monmsg) > mon_dcss_end) || in mon_check_mca()
143 (mon_mca_start(monmsg) < mon_dcss_start) || in mon_check_mca()
144 ((mon_mca_type(monmsg, 1) == 0) && (mon_mca_type(monmsg, 2) == 0))) in mon_check_mca()
149 static int mon_send_reply(struct mon_msg *monmsg, in mon_send_reply() argument
154 rc = iucv_message_reply(monpriv->path, &monmsg->msg, in mon_send_reply()
157 if (likely(!monmsg->msglim_reached)) { in mon_send_reply()
158 monmsg->pos = 0; in mon_send_reply()
159 monmsg->mca_offset = 0; in mon_send_reply()
164 monmsg->replied_msglim = 1; in mon_send_reply()
200 static inline void mon_next_mca(struct mon_msg *monmsg) in mon_next_mca() argument
202 if (likely((mon_mca_size(monmsg) - monmsg->mca_offset) == 12)) in mon_next_mca()
204 monmsg->mca_offset += 12; in mon_next_mca()
205 monmsg->pos = 0; in mon_next_mca()
210 struct mon_msg *monmsg; in mon_next_message() local
214 monmsg = monpriv->msg_array[monpriv->read_index]; in mon_next_message()
215 if (unlikely(monmsg->replied_msglim)) { in mon_next_message()
216 monmsg->replied_msglim = 0; in mon_next_message()
217 monmsg->msglim_reached = 0; in mon_next_message()
218 monmsg->pos = 0; in mon_next_message()
219 monmsg->mca_offset = 0; in mon_next_message()
225 return monmsg; in mon_next_message()
369 struct mon_msg *monmsg; in mon_read() local
373 monmsg = mon_next_message(monpriv); in mon_read()
374 if (IS_ERR(monmsg)) in mon_read()
375 return PTR_ERR(monmsg); in mon_read()
377 if (!monmsg) { in mon_read()
387 monmsg = monpriv->msg_array[monpriv->read_index]; in mon_read()
390 if (!monmsg->pos) in mon_read()
391 monmsg->pos = mon_mca_start(monmsg) + monmsg->mca_offset; in mon_read()
392 if (mon_check_mca(monmsg)) in mon_read()
396 mce_start = mon_mca_start(monmsg) + monmsg->mca_offset; in mon_read()
397 if ((monmsg->pos >= mce_start) && (monmsg->pos < mce_start + 12)) { in mon_read()
398 count = min(count, (size_t) mce_start + 12 - monmsg->pos); in mon_read()
399 ret = copy_to_user(data, (void *) (unsigned long) monmsg->pos, in mon_read()
403 monmsg->pos += count; in mon_read()
404 if (monmsg->pos == mce_start + 12) in mon_read()
405 monmsg->pos = mon_rec_start(monmsg); in mon_read()
410 if (monmsg->pos <= mon_rec_end(monmsg)) { in mon_read()
411 count = min(count, (size_t) mon_rec_end(monmsg) - monmsg->pos in mon_read()
413 ret = copy_to_user(data, (void *) (unsigned long) monmsg->pos, in mon_read()
417 monmsg->pos += count; in mon_read()
418 if (monmsg->pos > mon_rec_end(monmsg)) in mon_read()
419 mon_next_mca(monmsg); in mon_read()
423 ret = mon_send_reply(monmsg, monpriv); in mon_read()