#include "qemu/osdep.h"
#include "qapi/error.h"
-#include "sysemu/char.h"
+#include "chardev/char-fe.h"
#include "hw/s390x/3270-ccw.h"
/* Enough spaces for different window sizes. */
uint8_t inv[INPUT_BUFFER_SIZE];
uint8_t outv[OUTPUT_BUFFER_SIZE];
int in_len;
- int out_len;
bool handshake_done;
guint timer_tag;
} Terminal3270;
/* Ensure the initial status correct, always reset them. */
t->in_len = 0;
- t->out_len = 0;
t->handshake_done = false;
if (t->timer_tag) {
g_source_remove(t->timer_tag);
}
terminal_available = true;
qemu_chr_fe_set_handlers(&t->chr, terminal_can_read,
- terminal_read, chr_event, t, NULL, true);
+ terminal_read, chr_event, NULL, t, NULL, true);
}
-static int read_payload_3270(EmulatedCcw3270Device *dev, uint32_t cda,
- uint16_t count)
+static inline CcwDataStream *get_cds(Terminal3270 *t)
+{
+ return &(CCW_DEVICE(&t->cdev)->sch->cds);
+}
+
+static int read_payload_3270(EmulatedCcw3270Device *dev)
{
Terminal3270 *t = TERMINAL_3270(dev);
int len;
- len = MIN(count, t->in_len);
- cpu_physical_memory_write(cda, t->inv, len);
+ len = MIN(ccw_dstream_avail(get_cds(t)), t->in_len);
+ ccw_dstream_write_buf(get_cds(t), t->inv, len);
t->in_len -= len;
return len;
* Write 3270 outbound to socket.
* Return the count of 3270 data field if succeeded, zero if failed.
*/
-static int write_payload_3270(EmulatedCcw3270Device *dev, uint8_t cmd,
- uint32_t cda, uint16_t count)
+static int write_payload_3270(EmulatedCcw3270Device *dev, uint8_t cmd)
{
Terminal3270 *t = TERMINAL_3270(dev);
int retval = 0;
-
- assert(count <= (OUTPUT_BUFFER_SIZE - 3) / 2);
+ int count = ccw_dstream_avail(get_cds(t));
+ int bound = (OUTPUT_BUFFER_SIZE - 3) / 2;
+ int len = MIN(count, bound);
+ int out_len = 0;
if (!t->handshake_done) {
if (!(t->outv[0] == IAC && t->outv[1] != IAC)) {
return 0;
}
}
- if (!qemu_chr_fe_get_driver(&t->chr)) {
+ if (!qemu_chr_fe_backend_connected(&t->chr)) {
/* We just say we consumed all data if there's no backend. */
return count;
}
- t->outv[0] = cmd;
- cpu_physical_memory_read(cda, &t->outv[1], count);
- t->out_len = count + 1;
- t->out_len = insert_IAC_escape_char(t->outv, t->out_len);
- t->outv[t->out_len++] = IAC;
- t->outv[t->out_len++] = IAC_EOR;
+ t->outv[out_len++] = cmd;
+ do {
+ ccw_dstream_read_buf(get_cds(t), &t->outv[out_len], len);
+ count = ccw_dstream_avail(get_cds(t));
+ out_len += len;
- retval = qemu_chr_fe_write_all(&t->chr, t->outv, t->out_len);
- return (retval <= 0) ? 0 : (retval - 3);
+ out_len = insert_IAC_escape_char(t->outv, out_len);
+ if (!count) {
+ t->outv[out_len++] = IAC;
+ t->outv[out_len++] = IAC_EOR;
+ }
+ retval = qemu_chr_fe_write_all(&t->chr, t->outv, out_len);
+ len = MIN(count, bound);
+ out_len = 0;
+ } while (len && retval >= 0);
+ return (retval <= 0) ? 0 : get_cds(t)->count;
}
static Property terminal_properties[] = {