From: Nico Boehr <nrb@linux.ibm.com>
To: kvm@vger.kernel.org, linux-s390@vger.kernel.org
Cc: frankja@linux.ibm.com, imbrenda@linux.ibm.com, thuth@redhat.com
Subject: [kvm-unit-tests PATCH v1 1/4] lib: s390x: add support for SCLP console read
Date: Mon, 11 Apr 2022 12:07:47 +0200 [thread overview]
Message-ID: <20220411100750.2868587-2-nrb@linux.ibm.com> (raw)
In-Reply-To: <20220411100750.2868587-1-nrb@linux.ibm.com>
Add a basic implementation for reading from the SCLP ACII console. The goal of
this is to support migration tests on s390x. To know when the migration has been
finished, we need to listen for a newline on our console.
Hence, this implementation is focused on the SCLP ASCII console of QEMU and
currently won't work under e.g. LPAR.
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
lib/s390x/sclp-console.c | 81 +++++++++++++++++++++++++++++++++++++---
lib/s390x/sclp.h | 7 ++++
s390x/Makefile | 1 +
3 files changed, 83 insertions(+), 6 deletions(-)
diff --git a/lib/s390x/sclp-console.c b/lib/s390x/sclp-console.c
index fa36a6a42381..8e22660bf25d 100644
--- a/lib/s390x/sclp-console.c
+++ b/lib/s390x/sclp-console.c
@@ -89,6 +89,10 @@ static char lm_buff[120];
static unsigned char lm_buff_off;
static struct spinlock lm_buff_lock;
+static char read_buf[4096];
+static int read_index = sizeof(read_buf) - 1;
+static int read_buf_end = 0;
+
static void sclp_print_ascii(const char *str)
{
int len = strlen(str);
@@ -185,7 +189,7 @@ static void sclp_print_lm(const char *str)
* indicating which messages the control program (we) want(s) to
* send/receive.
*/
-static void sclp_set_write_mask(void)
+static void sclp_write_event_mask(int receive_mask, int send_mask)
{
WriteEventMask *sccb = (void *)_sccb;
@@ -195,18 +199,27 @@ static void sclp_set_write_mask(void)
sccb->h.function_code = SCLP_FC_NORMAL_WRITE;
sccb->mask_length = sizeof(sccb_mask_t);
- /* For now we don't process sclp input. */
- sccb->cp_receive_mask = 0;
- /* We send ASCII and line mode. */
- sccb->cp_send_mask = SCLP_EVENT_MASK_MSG_ASCII | SCLP_EVENT_MASK_MSG;
+ sccb->cp_receive_mask = receive_mask;
+ sccb->cp_send_mask = send_mask;
sclp_service_call(SCLP_CMD_WRITE_EVENT_MASK, sccb);
assert(sccb->h.response_code == SCLP_RC_NORMAL_COMPLETION);
}
+static void sclp_console_enable_read(void)
+{
+ sclp_write_event_mask(SCLP_EVENT_MASK_MSG_ASCII, SCLP_EVENT_MASK_MSG_ASCII | SCLP_EVENT_MASK_MSG);
+}
+
+static void sclp_console_disable_read(void)
+{
+ sclp_write_event_mask(0, SCLP_EVENT_MASK_MSG_ASCII | SCLP_EVENT_MASK_MSG);
+}
+
void sclp_console_setup(void)
{
- sclp_set_write_mask();
+ /* We send ASCII and line mode. */
+ sclp_write_event_mask(0, SCLP_EVENT_MASK_MSG_ASCII | SCLP_EVENT_MASK_MSG);
}
void sclp_print(const char *str)
@@ -227,3 +240,59 @@ void sclp_print(const char *str)
sclp_print_ascii(str);
sclp_print_lm(str);
}
+
+#define SCLP_EVENT_ASCII_DATA_STREAM_FOLLOWS 0
+
+static int console_refill_read_buffer(void)
+{
+ const int MAX_EVENT_BUFFER_LEN = SCCB_SIZE - offsetof(ReadEventDataAsciiConsole, ebh);
+ ReadEventDataAsciiConsole *sccb = (void *)_sccb;
+ const int EVENT_BUFFER_ASCII_RECV_HEADER_LEN = sizeof(sccb->ebh) + sizeof(sccb->type);
+ int ret = -1;
+
+ sclp_console_enable_read();
+
+ sclp_mark_busy();
+ memset(sccb, 0, 4096);
+ sccb->h.length = PAGE_SIZE;
+ sccb->h.function_code = SCLP_UNCONDITIONAL_READ;
+ sccb->h.control_mask[2] = 0x80;
+
+ sclp_service_call(SCLP_CMD_READ_EVENT_DATA, sccb);
+
+ if ((sccb->h.response_code == SCLP_RC_NO_EVENT_BUFFERS_STORED) ||
+ (sccb->ebh.type != SCLP_EVENT_ASCII_CONSOLE_DATA) ||
+ (sccb->type != SCLP_EVENT_ASCII_DATA_STREAM_FOLLOWS)) {
+ ret = -1;
+ goto out;
+ }
+
+ assert(sccb->ebh.length <= MAX_EVENT_BUFFER_LEN);
+ assert(sccb->ebh.length > EVENT_BUFFER_ASCII_RECV_HEADER_LEN);
+
+ read_buf_end = sccb->ebh.length - EVENT_BUFFER_ASCII_RECV_HEADER_LEN;
+
+ assert(read_buf_end <= sizeof(read_buf));
+ memcpy(read_buf, sccb->data, read_buf_end);
+
+ read_index = 0;
+
+out:
+ sclp_console_disable_read();
+
+ return ret;
+}
+
+int __getchar(void)
+{
+ int ret;
+
+ if (read_index >= read_buf_end) {
+ ret = console_refill_read_buffer();
+ if (ret < 0) {
+ return ret;
+ }
+ }
+
+ return read_buf[read_index++];
+}
diff --git a/lib/s390x/sclp.h b/lib/s390x/sclp.h
index fead007a6037..5bd1741d721d 100644
--- a/lib/s390x/sclp.h
+++ b/lib/s390x/sclp.h
@@ -313,6 +313,13 @@ typedef struct ReadEventData {
uint32_t mask;
} __attribute__((packed)) ReadEventData;
+typedef struct ReadEventDataAsciiConsole {
+ SCCBHeader h;
+ EventBufferHeader ebh;
+ uint8_t type;
+ char data[];
+} __attribute__((packed)) ReadEventDataAsciiConsole;
+
extern char _sccb[];
void sclp_setup_int(void);
void sclp_handle_ext(void);
diff --git a/s390x/Makefile b/s390x/Makefile
index 53b0fe044fe7..62e197cb93d7 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -71,6 +71,7 @@ cflatobjs += lib/alloc_phys.o
cflatobjs += lib/alloc_page.o
cflatobjs += lib/vmalloc.o
cflatobjs += lib/alloc_phys.o
+cflatobjs += lib/getchar.o
cflatobjs += lib/s390x/io.o
cflatobjs += lib/s390x/stack.o
cflatobjs += lib/s390x/sclp.o
--
2.31.1
next prev parent reply other threads:[~2022-04-11 10:08 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-11 10:07 [kvm-unit-tests PATCH v1 0/4] s390x: add migration test suport Nico Boehr
2022-04-11 10:07 ` Nico Boehr [this message]
2022-04-12 8:02 ` [kvm-unit-tests PATCH v1 1/4] lib: s390x: add support for SCLP console read Thomas Huth
2022-04-13 14:41 ` Nico Boehr
2022-04-12 15:32 ` Janosch Frank
2022-04-13 15:00 ` Nico Boehr
2022-04-11 10:07 ` [kvm-unit-tests PATCH v1 2/4] s390x: add support for migration tests Nico Boehr
2022-04-11 12:58 ` Claudio Imbrenda
2022-04-12 8:05 ` Thomas Huth
2022-04-11 10:07 ` [kvm-unit-tests PATCH v1 3/4] s390x: don't run migration tests under PV Nico Boehr
2022-04-11 12:58 ` Claudio Imbrenda
2022-04-12 8:06 ` Thomas Huth
2022-04-11 10:07 ` [kvm-unit-tests PATCH v1 4/4] s390x: add selftest for migration Nico Boehr
2022-04-11 12:49 ` Claudio Imbrenda
2022-04-12 11:49 ` Nico Boehr
2022-04-13 8:42 ` Claudio Imbrenda
2022-04-11 15:30 ` Thomas Huth
2022-04-12 7:41 ` Nico Boehr
2022-04-12 7:49 ` Thomas Huth
2022-04-13 14:32 ` Nico Boehr
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220411100750.2868587-2-nrb@linux.ibm.com \
--to=nrb@linux.ibm.com \
--cc=frankja@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox