kboot: implement stripped down termios

Implement a stripped down termios, obtained from various files in musl
and HOST_ or host_ prepended to most things and a few unavoidable style
tweaks. Only implements the bits of termios we need for the boot loader:
put the terminal into raw mode, restore terminal settings and speed
stuff.

Sponsored by:		Netflix
This commit is contained in:
Warner Losh 2022-07-26 17:31:23 -06:00
parent 54e6e0deb4
commit 963037786f
6 changed files with 445 additions and 0 deletions

View file

@ -19,6 +19,7 @@ INSTALLFLAGS= -b
# Architecture-specific loader code
SRCS= crt1.c conf.c vers.c main.c host_syscalls.c hostcons.c hostdisk.c kbootfdt.c gfx_fb_stub.c
SRCS+= termios.c
CFLAGS.gfx_fb_stub.c += -I${SRCTOP}/contrib/pnglite -I${SRCTOP}/sys/teken

View file

@ -0,0 +1 @@
#include "termios_gen.h"

View file

@ -0,0 +1,184 @@
#undef HOST_NCCS
#define HOST_NCCS 19
struct host_termios {
host_tcflag_t c_iflag;
host_tcflag_t c_oflag;
host_tcflag_t c_cflag;
host_tcflag_t c_lflag;
host_cc_t c_cc[HOST_NCCS];
host_cc_t c_line;
host_speed_t __c_ispeed;
host_speed_t __c_ospeed;
};
#define HOST_VINTR 0
#define HOST_VQUIT 1
#define HOST_VERASE 2
#define HOST_VKILL 3
#define HOST_VEOF 4
#define HOST_VMIN 5
#define HOST_VEOL 6
#define HOST_VTIME 7
#define HOST_VEOL2 8
#define HOST_VSWTC 9
#define HOST_VWERASE 10
#define HOST_VREPRINT 11
#define HOST_VSUSP 12
#define HOST_VSTART 13
#define HOST_VSTOP 14
#define HOST_VLNEXT 15
#define HOST_VDISCARD 16
#define HOST_IGNBRK 0000001
#define HOST_BRKINT 0000002
#define HOST_IGNPAR 0000004
#define HOST_PARMRK 0000010
#define HOST_INPCK 0000020
#define HOST_ISTRIP 0000040
#define HOST_INLCR 0000100
#define HOST_IGNCR 0000200
#define HOST_ICRNL 0000400
#define HOST_IXON 0001000
#define HOST_IXOFF 0002000
#define HOST_IXANY 0004000
#define HOST_IUCLC 0010000
#define HOST_IMAXBEL 0020000
#define HOST_IUTF8 0040000
#define HOST_OPOST 0000001
#define HOST_ONLCR 0000002
#define HOST_OLCUC 0000004
#define HOST_OCRNL 0000010
#define HOST_ONOCR 0000020
#define HOST_ONLRET 0000040
#define HOST_OFILL 0000100
#define HOST_OFDEL 0000200
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
#define HOST_NLDLY 0001400
#define HOST_NL0 0000000
#define HOST_NL1 0000400
#define HOST_NL2 0001000
#define HOST_NL3 0001400
#define HOST_TABDLY 0006000
#define HOST_TAB0 0000000
#define HOST_TAB1 0002000
#define HOST_TAB2 0004000
#define HOST_TAB3 0006000
#define HOST_CRDLY 0030000
#define HOST_CR0 0000000
#define HOST_CR1 0010000
#define HOST_CR2 0020000
#define HOST_CR3 0030000
#define HOST_FFDLY 0040000
#define HOST_FF0 0000000
#define HOST_FF1 0040000
#define HOST_BSDLY 0100000
#define HOST_BS0 0000000
#define HOST_BS1 0100000
#endif
#define HOST_VTDLY 0200000
#define HOST_VT0 0000000
#define HOST_VT1 0200000
#define HOST_B0 0000000
#define HOST_B50 0000001
#define HOST_B75 0000002
#define HOST_B110 0000003
#define HOST_B134 0000004
#define HOST_B150 0000005
#define HOST_B200 0000006
#define HOST_B300 0000007
#define HOST_B600 0000010
#define HOST_B1200 0000011
#define HOST_B1800 0000012
#define HOST_B2400 0000013
#define HOST_B4800 0000014
#define HOST_B9600 0000015
#define HOST_B19200 0000016
#define HOST_B38400 0000017
#define HOST_B57600 00020
#define HOST_B115200 00021
#define HOST_B230400 00022
#define HOST_B460800 00023
#define HOST_B500000 00024
#define HOST_B576000 00025
#define HOST_B921600 00026
#define HOST_B1000000 00027
#define HOST_B1152000 00030
#define HOST_B1500000 00031
#define HOST_B2000000 00032
#define HOST_B2500000 00033
#define HOST_B3000000 00034
#define HOST_B3500000 00035
#define HOST_B4000000 00036
#define HOST_CSIZE 00001400
#define HOST_CS5 00000000
#define HOST_CS6 00000400
#define HOST_CS7 00001000
#define HOST_CS8 00001400
#define HOST_CSTOPB 00002000
#define HOST_CREAD 00004000
#define HOST_PARENB 00010000
#define HOST_PARODD 00020000
#define HOST_HUPCL 00040000
#define HOST_CLOCAL 00100000
#define HOST_ECHOE 0x00000002
#define HOST_ECHOK 0x00000004
#define HOST_ECHO 0x00000008
#define HOST_ECHONL 0x00000010
#define HOST_ISIG 0x00000080
#define HOST_ICANON 0x00000100
#define HOST_IEXTEN 0x00000400
#define HOST_TOSTOP 0x00400000
#define HOST_NOFLSH 0x80000000
#define HOST_TCOOFF 0
#define HOST_TCOON 1
#define HOST_TCIOFF 2
#define HOST_TCION 3
#define HOST_TCIFLUSH 0
#define HOST_TCOFLUSH 1
#define HOST_TCIOFLUSH 2
#define HOST_TCSANOW 0
#define HOST_TCSADRAIN 1
#define HOST_TCSAFLUSH 2
#define HOST_EXTA 0000016
#define HOST_EXTB 0000017
#define HOST_CBAUD 00377
#define HOST_CBAUDEX 0000020
#define HOST_CIBAUD 077600000
#define HOST_CMSPAR 010000000000
#define HOST_CRTSCTS 020000000000
#define HOST_XCASE 0x00004000
#define HOST_ECHOCTL 0x00000040
#define HOST_ECHOPRT 0x00000020
#define HOST_ECHOKE 0x00000001
#define HOST_FLUSHO 0x00800000
#define HOST_PENDIN 0x20000000
#define HOST_EXTPROC 0x10000000
#define HOST_XTABS 00006000
#define HOST_TIOCSER_TEMT 1
#define _IOC(a,b,c,d) ( ((a)<<29) | ((b)<<8) | (c) | ((d)<<16) )
#define _IOC_NONE 1U
#define _IOC_WRITE 4U
#define _IOC_READ 2U
#define _IO(a,b) _IOC(_IOC_NONE,(a),(b),0)
#define _IOW(a,b,c) _IOC(_IOC_WRITE,(a),(b),sizeof(c))
#define _IOR(a,b,c) _IOC(_IOC_READ,(a),(b),sizeof(c))
#define _IOWR(a,b,c) _IOC(_IOC_READ|_IOC_WRITE,(a),(b),sizeof(c))
#define HOST_TCGETS _IOR('t', 19, char[44])
#define HOST_TCSETS _IOW('t', 20, char[44])
#define HOST_TCSETSW _IOW('t', 21, char[44])
#define HOST_TCSETSF _IOW('t', 22, char[44])

66
stand/kboot/termios.c Normal file
View file

@ -0,0 +1,66 @@
/*
* Copyright (c) 2005-2020 Rich Felker, et al.
*
* SPDX-License-Identifier: MIT
*
* Note: From the musl project, stripped down and repackaged with HOST_/host_ prepended
*/
#include <sys/types.h>
#include "termios.h"
#include "host_syscall.h"
int
host_tcgetattr(int fd, struct host_termios *tio)
{
if (host_ioctl(fd, HOST_TCGETS, (uintptr_t)tio))
return -1;
return 0;
}
int
host_tcsetattr(int fd, int act, const struct host_termios *tio)
{
if (act < 0 || act > 2) {
// errno = EINVAL; /* XXX ?? */
return -1;
}
return host_ioctl(fd, HOST_TCSETS+act, (uintptr_t)tio);
}
void
host_cfmakeraw(struct host_termios *t)
{
t->c_iflag &= ~(HOST_IGNBRK | HOST_BRKINT | HOST_PARMRK | HOST_ISTRIP |
HOST_INLCR | HOST_IGNCR | HOST_ICRNL | HOST_IXON);
t->c_oflag &= ~HOST_OPOST;
t->c_lflag &= ~(HOST_ECHO | HOST_ECHONL | HOST_ICANON | HOST_ISIG |
HOST_IEXTEN);
t->c_cflag &= ~(HOST_CSIZE | HOST_PARENB);
t->c_cflag |= HOST_CS8;
t->c_cc[HOST_VMIN] = 1;
t->c_cc[HOST_VTIME] = 0;
}
int host_cfsetospeed(struct host_termios *tio, host_speed_t speed)
{
if (speed & ~HOST_CBAUD) {
// errno = EINVAL; /* XXX ? */
return -1;
}
tio->c_cflag &= ~HOST_CBAUD;
tio->c_cflag |= speed;
return 0;
}
int host_cfsetispeed(struct host_termios *tio, host_speed_t speed)
{
return speed ? host_cfsetospeed(tio, speed) : 0;
}
int
host_cfsetspeed(struct host_termios *tio, host_speed_t speed)
{
return host_cfsetospeed(tio, speed); /* weak alias in musl */
}

24
stand/kboot/termios.h Normal file
View file

@ -0,0 +1,24 @@
#ifndef _TERMIOS_H
#define _TERMIOS_H
typedef unsigned char host_cc_t;
typedef unsigned int host_speed_t;
typedef unsigned int host_tcflag_t;
#define HOST_NCCS 32
#include "termios_arch.h"
#define HOST_TCSANOW 0
#define HOST_TCSADRAIN 1
#define HOST_TCSAFLUSH 2
int host_tcgetattr (int, struct host_termios *);
int host_tcsetattr (int, int, const struct host_termios *);
void host_cfmakeraw(struct host_termios *);
int host_cfsetispeed(struct host_termios *, host_speed_t);
int host_cfsetospeed(struct host_termios *, host_speed_t);
int host_cfsetspeed(struct host_termios *, host_speed_t);
#endif

169
stand/kboot/termios_gen.h Normal file
View file

@ -0,0 +1,169 @@
struct host_termios {
host_tcflag_t c_iflag;
host_tcflag_t c_oflag;
host_tcflag_t c_cflag;
host_tcflag_t c_lflag;
host_cc_t c_line;
host_cc_t c_cc[HOST_NCCS];
host_speed_t __c_ispeed;
host_speed_t __c_ospeed;
};
#define HOST_VINTR 0
#define HOST_VQUIT 1
#define HOST_VERASE 2
#define HOST_VKILL 3
#define HOST_VEOF 4
#define HOST_VTIME 5
#define HOST_VMIN 6
#define HOST_VSWTC 7
#define HOST_VSTART 8
#define HOST_VSTOP 9
#define HOST_VSUSP 10
#define HOST_VEOL 11
#define HOST_VREPRINT 12
#define HOST_VDISCARD 13
#define HOST_VWERASE 14
#define HOST_VLNEXT 15
#define HOST_VEOL2 16
#define HOST_IGNBRK 0000001
#define HOST_BRKINT 0000002
#define HOST_IGNPAR 0000004
#define HOST_PARMRK 0000010
#define HOST_INPCK 0000020
#define HOST_ISTRIP 0000040
#define HOST_INLCR 0000100
#define HOST_IGNCR 0000200
#define HOST_ICRNL 0000400
#define HOST_IUCLC 0001000
#define HOST_IXON 0002000
#define HOST_IXANY 0004000
#define HOST_IXOFF 0010000
#define HOST_IMAXBEL 0020000
#define HOST_IUTF8 0040000
#define HOST_OPOST 0000001
#define HOST_OLCUC 0000002
#define HOST_ONLCR 0000004
#define HOST_OCRNL 0000010
#define HOST_ONOCR 0000020
#define HOST_ONLRET 0000040
#define HOST_OFILL 0000100
#define HOST_OFDEL 0000200
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
#define HOST_NLDLY 0000400
#define HOST_NL0 0000000
#define HOST_NL1 0000400
#define HOST_CRDLY 0003000
#define HOST_CR0 0000000
#define HOST_CR1 0001000
#define HOST_CR2 0002000
#define HOST_CR3 0003000
#define HOST_TABDLY 0014000
#define HOST_TAB0 0000000
#define HOST_TAB1 0004000
#define HOST_TAB2 0010000
#define HOST_TAB3 0014000
#define HOST_BSDLY 0020000
#define HOST_BS0 0000000
#define HOST_BS1 0020000
#define HOST_FFDLY 0100000
#define HOST_FF0 0000000
#define HOST_FF1 0100000
#endif
#define HOST_VTDLY 0040000
#define HOST_VT0 0000000
#define HOST_VT1 0040000
#define HOST_B0 0000000
#define HOST_B50 0000001
#define HOST_B75 0000002
#define HOST_B110 0000003
#define HOST_B134 0000004
#define HOST_B150 0000005
#define HOST_B200 0000006
#define HOST_B300 0000007
#define HOST_B600 0000010
#define HOST_B1200 0000011
#define HOST_B1800 0000012
#define HOST_B2400 0000013
#define HOST_B4800 0000014
#define HOST_B9600 0000015
#define HOST_B19200 0000016
#define HOST_B38400 0000017
#define HOST_B57600 0010001
#define HOST_B115200 0010002
#define HOST_B230400 0010003
#define HOST_B460800 0010004
#define HOST_B500000 0010005
#define HOST_B576000 0010006
#define HOST_B921600 0010007
#define HOST_B1000000 0010010
#define HOST_B1152000 0010011
#define HOST_B1500000 0010012
#define HOST_B2000000 0010013
#define HOST_B2500000 0010014
#define HOST_B3000000 0010015
#define HOST_B3500000 0010016
#define HOST_B4000000 0010017
#define HOST_CSIZE 0000060
#define HOST_CS5 0000000
#define HOST_CS6 0000020
#define HOST_CS7 0000040
#define HOST_CS8 0000060
#define HOST_CSTOPB 0000100
#define HOST_CREAD 0000200
#define HOST_PARENB 0000400
#define HOST_PARODD 0001000
#define HOST_HUPCL 0002000
#define HOST_CLOCAL 0004000
#define HOST_ISIG 0000001
#define HOST_ICANON 0000002
#define HOST_ECHO 0000010
#define HOST_ECHOE 0000020
#define HOST_ECHOK 0000040
#define HOST_ECHONL 0000100
#define HOST_NOFLSH 0000200
#define HOST_TOSTOP 0000400
#define HOST_IEXTEN 0100000
#define HOST_TCOOFF 0
#define HOST_TCOON 1
#define HOST_TCIOFF 2
#define HOST_TCION 3
#define HOST_TCIFLUSH 0
#define HOST_TCOFLUSH 1
#define HOST_TCIOFLUSH 2
#define HOST_TCSANOW 0
#define HOST_TCSADRAIN 1
#define HOST_TCSAFLUSH 2
#define HOST_EXTA 0000016
#define HOST_EXTB 0000017
#define HOST_CBAUD 0010017
#define HOST_CBAUDEX 0010000
#define HOST_CIBAUD 002003600000
#define HOST_CMSPAR 010000000000
#define HOST_CRTSCTS 020000000000
#define HOST_XCASE 0000004
#define HOST_ECHOCTL 0001000
#define HOST_ECHOPRT 0002000
#define HOST_ECHOKE 0004000
#define HOST_FLUSHO 0010000
#define HOST_PENDIN 0040000
#define HOST_EXTPROC 0200000
#define HOST_XTABS 0014000
#define HOST_TCGETS 0x5401
#define HOST_TCSETS 0x5402
#define HOST_TCSETSW 0x5403
#define HOST_TCSETSF 0x5404