aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Reifenberger <mr@FreeBSD.org>2022-01-20 22:44:04 +0000
committerCorvin Köhne <corvink@FreeBSD.org>2022-11-23 09:11:56 +0000
commitcc820887ab0ea05c5dcad6d99d9a0d996eb3e19e (patch)
tree006d08d9448f6fcd97fe4d3127ff81ea73e3aa69
parent7c85b2342aa2f737ed7c81a83dc510db8f7e172d (diff)
downloadsrc-cc820887ab0ea05c5dcad6d99d9a0d996eb3e19e.tar.gz
src-cc820887ab0ea05c5dcad6d99d9a0d996eb3e19e.zip
Append Keyboard Layout specified option for using VNC.
Part two: Append bhyve -K option for specified keyboard layout with layout setting files every languages. Since the cmd option '-k' was used in the meantime it was changed to '-K' PR: 246121 Submitted by: koinec@yahoo.co.jp Reviewed by: grehan@ Differential Revision: https://reviews.freebsd.org/D29473 MFC after: 4 weeks (cherry picked from commit 19eaa01beaba68ed4c70c44127955f5c9b331cb9)
-rw-r--r--etc/mtree/BSD.usr.dist4
-rw-r--r--usr.sbin/bhyve/Makefile1
-rw-r--r--usr.sbin/bhyve/bhyve.88
-rw-r--r--usr.sbin/bhyve/bhyve_config.56
-rw-r--r--usr.sbin/bhyve/bhyverun.c8
-rw-r--r--usr.sbin/bhyve/kbdlayout/Makefile40
-rw-r--r--usr.sbin/bhyve/kbdlayout/Makefile.depend11
-rw-r--r--usr.sbin/bhyve/kbdlayout/am10
-rw-r--r--usr.sbin/bhyve/kbdlayout/be45
-rw-r--r--usr.sbin/bhyve/kbdlayout/be_acc42
-rw-r--r--usr.sbin/bhyve/kbdlayout/bg_bds10
-rw-r--r--usr.sbin/bhyve/kbdlayout/bg_phonetic9
-rw-r--r--usr.sbin/bhyve/kbdlayout/br19
-rw-r--r--usr.sbin/bhyve/kbdlayout/br_noacc22
-rw-r--r--usr.sbin/bhyve/kbdlayout/centraleuropean12
-rw-r--r--usr.sbin/bhyve/kbdlayout/ch36
-rw-r--r--usr.sbin/bhyve/kbdlayout/ch-fr36
-rw-r--r--usr.sbin/bhyve/kbdlayout/ch-fr_acc33
-rw-r--r--usr.sbin/bhyve/kbdlayout/ch_acc33
-rw-r--r--usr.sbin/bhyve/kbdlayout/ch_macbook_acc37
-rw-r--r--usr.sbin/bhyve/kbdlayout/cz11
-rw-r--r--usr.sbin/bhyve/kbdlayout/de37
-rw-r--r--usr.sbin/bhyve/kbdlayout/de_acc36
-rw-r--r--usr.sbin/bhyve/kbdlayout/de_noacc38
-rw-r--r--usr.sbin/bhyve/kbdlayout/default248
-rw-r--r--usr.sbin/bhyve/kbdlayout/dk32
-rw-r--r--usr.sbin/bhyve/kbdlayout/dk_macbook35
-rw-r--r--usr.sbin/bhyve/kbdlayout/ee31
-rw-r--r--usr.sbin/bhyve/kbdlayout/es28
-rw-r--r--usr.sbin/bhyve/kbdlayout/es_acc28
-rw-r--r--usr.sbin/bhyve/kbdlayout/es_dvorak78
-rw-r--r--usr.sbin/bhyve/kbdlayout/fi32
-rw-r--r--usr.sbin/bhyve/kbdlayout/fr46
-rw-r--r--usr.sbin/bhyve/kbdlayout/fr_acc46
-rw-r--r--usr.sbin/bhyve/kbdlayout/fr_dvorak87
-rw-r--r--usr.sbin/bhyve/kbdlayout/fr_dvorak_acc86
-rw-r--r--usr.sbin/bhyve/kbdlayout/fr_macbook49
-rw-r--r--usr.sbin/bhyve/kbdlayout/gr9
-rw-r--r--usr.sbin/bhyve/kbdlayout/gr_101_acc9
-rw-r--r--usr.sbin/bhyve/kbdlayout/gr_elot_acc17
-rw-r--r--usr.sbin/bhyve/kbdlayout/hr36
-rw-r--r--usr.sbin/bhyve/kbdlayout/hu_1019
-rw-r--r--usr.sbin/bhyve/kbdlayout/hu_10241
-rw-r--r--usr.sbin/bhyve/kbdlayout/is33
-rw-r--r--usr.sbin/bhyve/kbdlayout/is_acc32
-rw-r--r--usr.sbin/bhyve/kbdlayout/it34
-rw-r--r--usr.sbin/bhyve/kbdlayout/jp36
-rw-r--r--usr.sbin/bhyve/kbdlayout/jp_capsctrl37
-rw-r--r--usr.sbin/bhyve/kbdlayout/kz_io11
-rw-r--r--usr.sbin/bhyve/kbdlayout/kz_kst11
-rw-r--r--usr.sbin/bhyve/kbdlayout/latinamerican33
-rw-r--r--usr.sbin/bhyve/kbdlayout/latinamerican_acc31
-rw-r--r--usr.sbin/bhyve/kbdlayout/lt10
-rw-r--r--usr.sbin/bhyve/kbdlayout/nl31
-rw-r--r--usr.sbin/bhyve/kbdlayout/no32
-rw-r--r--usr.sbin/bhyve/kbdlayout/no_dvorak81
-rw-r--r--usr.sbin/bhyve/kbdlayout/nordic_asus-eee32
-rw-r--r--usr.sbin/bhyve/kbdlayout/pl_dvorak74
-rw-r--r--usr.sbin/bhyve/kbdlayout/pt31
-rw-r--r--usr.sbin/bhyve/kbdlayout/pt_acc28
-rw-r--r--usr.sbin/bhyve/kbdlayout/ru14
-rw-r--r--usr.sbin/bhyve/kbdlayout/ru_shift9
-rw-r--r--usr.sbin/bhyve/kbdlayout/ru_win9
-rw-r--r--usr.sbin/bhyve/kbdlayout/se32
-rw-r--r--usr.sbin/bhyve/kbdlayout/si36
-rw-r--r--usr.sbin/bhyve/kbdlayout/tr36
-rw-r--r--usr.sbin/bhyve/kbdlayout/tr_f81
-rw-r--r--usr.sbin/bhyve/kbdlayout/ua9
-rw-r--r--usr.sbin/bhyve/kbdlayout/ua_shift_alt10
-rw-r--r--usr.sbin/bhyve/kbdlayout/uk14
-rw-r--r--usr.sbin/bhyve/kbdlayout/uk_capsctrl14
-rw-r--r--usr.sbin/bhyve/kbdlayout/uk_dvorak78
-rw-r--r--usr.sbin/bhyve/kbdlayout/uk_macbook10
-rw-r--r--usr.sbin/bhyve/kbdlayout/us_dvorak74
-rw-r--r--usr.sbin/bhyve/kbdlayout/us_dvorakl88
-rw-r--r--usr.sbin/bhyve/kbdlayout/us_dvorakp95
-rw-r--r--usr.sbin/bhyve/kbdlayout/us_dvorakr86
-rw-r--r--usr.sbin/bhyve/kbdlayout/us_dvorakx80
-rw-r--r--usr.sbin/bhyve/kbdlayout/us_emacs9
-rw-r--r--usr.sbin/bhyve/kbdlayout/us_unix14
-rw-r--r--usr.sbin/bhyve/ps2kbd.c95
81 files changed, 2956 insertions, 5 deletions
diff --git a/etc/mtree/BSD.usr.dist b/etc/mtree/BSD.usr.dist
index 46a975178595..fcaf5c72cef8 100644
--- a/etc/mtree/BSD.usr.dist
+++ b/etc/mtree/BSD.usr.dist
@@ -170,6 +170,10 @@
share
atf tags=package=tests
..
+ bhyve
+ kbdlayout
+ ..
+ ..
bsdconfig
media
..
diff --git a/usr.sbin/bhyve/Makefile b/usr.sbin/bhyve/Makefile
index e35d528ab605..d55022d05f18 100644
--- a/usr.sbin/bhyve/Makefile
+++ b/usr.sbin/bhyve/Makefile
@@ -132,4 +132,5 @@ CFLAGS+=-DGDB_LOG
WARNS?= 2
+SUBDIR= kbdlayout
.include <bsd.prog.mk>
diff --git a/usr.sbin/bhyve/bhyve.8 b/usr.sbin/bhyve/bhyve.8
index ddd74cc819f1..f56f4e771b70 100644
--- a/usr.sbin/bhyve/bhyve.8
+++ b/usr.sbin/bhyve/bhyve.8
@@ -53,6 +53,7 @@
.Sm on
.Oc
.Op Fl k Ar config_file
+.Op Fl K Ar layout
.Oo Fl l
.Sm off
.Ar lpcdev Op Cm \&, Ar conf
@@ -171,6 +172,13 @@ Print help message and exit.
Set configuration variables from a simple, key-value config file.
Each line of the config file is expected to consist of a config variable
name, an equals sign
+.It Fl K Ar layout
+Specify the keyboard layout.
+The value that can be specified sets the file name in
+.Ar /usr/share/bhyve/kbdlayout .
+This specification only works when loaded with UEFI mode for VNC.
+When using a VNC client that supports QEMU Extended Key Event Message (e.g. TigerVNC), this option isn't needed.
+When using a VNC client that doesn't support QEMU Extended Key Event Message (e.g. tightVNC), the layout defaults to the US keyboard unless specified otherwise.
.Pq Sq = ,
and a value.
No spaces are permitted between the variable name, equals sign, or
diff --git a/usr.sbin/bhyve/bhyve_config.5 b/usr.sbin/bhyve/bhyve_config.5
index 488dfb21bab7..882479bf7b00 100644
--- a/usr.sbin/bhyve/bhyve_config.5
+++ b/usr.sbin/bhyve/bhyve_config.5
@@ -133,6 +133,12 @@ will listen for connections on this port.
.It Va gdb.wait Ta bool Ta false Ta
If the debug server is enabled, wait for a debugger to connect
before starting the guest.
+.It Va keyboard.layout Ta string Ta Ta
+Specify the keyboard layout name with the file name in
+.Ar /usr/share/bhyve/kbdlayout .
+This value only works when loaded with UEFI mode for VNC, and
+used a VNC client that don't support QEMU Extended Key Event
+Message (e.g. TightVNC).
.It Va rtc.use_localtime Ta bool Ta true Ta
The real time clock uses the local time of the host.
If this is set to false, the real time clock uses UTC.
diff --git a/usr.sbin/bhyve/bhyverun.c b/usr.sbin/bhyve/bhyverun.c
index e9fc3c98ddeb..27166d9046e5 100644
--- a/usr.sbin/bhyve/bhyverun.c
+++ b/usr.sbin/bhyve/bhyverun.c
@@ -236,6 +236,7 @@ usage(int code)
" -H: vmexit from the guest on HLT\n"
" -h: help\n"
" -k: key=value flat config file\n"
+ " -K: PS2 keyboard layout\n"
" -l: LPC device configuration\n"
" -m: memory size\n"
" -o: set config 'var' to 'value'\n"
@@ -1242,9 +1243,9 @@ main(int argc, char *argv[])
progname = basename(argv[0]);
#ifdef BHYVE_SNAPSHOT
- optstr = "aehuwxACDHIPSWYk:o:p:G:c:s:m:l:U:r:";
+ optstr = "aehuwxACDHIPSWYk:o:p:G:c:s:m:l:K:U:r:";
#else
- optstr = "aehuwxACDHIPSWYk:o:p:G:c:s:m:l:U:";
+ optstr = "aehuwxACDHIPSWYk:o:p:G:c:s:m:l:K:U:";
#endif
while ((c = getopt(argc, argv, optstr)) != -1) {
switch (c) {
@@ -1278,6 +1279,9 @@ main(int argc, char *argv[])
case 'k':
parse_simple_config_file(optarg);
break;
+ case 'K':
+ set_config_value("keyboard.layout", optarg);
+ break;
case 'l':
if (strncmp(optarg, "help", strlen(optarg)) == 0) {
lpc_print_supported_devices();
diff --git a/usr.sbin/bhyve/kbdlayout/Makefile b/usr.sbin/bhyve/kbdlayout/Makefile
new file mode 100644
index 000000000000..dc608508f67e
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/Makefile
@@ -0,0 +1,40 @@
+# $FreeBSD$
+
+FILESDIR= ${SHAREDIR}/bhyve/kbdlayout
+FILES= default \
+ am \
+ be be_acc \
+ bg_bds bg_phonetic \
+ br br_noacc \
+ centraleuropean \
+ ch ch_acc ch_macbook_acc ch-fr ch-fr_acc \
+ cz \
+ de de_acc de_noacc \
+ dk dk_macbook \
+ ee \
+ es es_acc es_dvorak \
+ fi \
+ fr fr_acc fr_dvorak fr_dvorak_acc fr_macbook \
+ gr gr_101_acc gr_elot_acc \
+ hr \
+ hu_101 hu_102 \
+ is is_acc \
+ it \
+ jp jp_capsctrl \
+ kz_io kz_kst \
+ latinamerican latinamerican_acc \
+ lt \
+ nl \
+ no no_dvorak nordic_asus-eee \
+ pl_dvorak \
+ pt pt_acc \
+ ru ru_shift ru_win \
+ se \
+ si \
+ tr tr_f \
+ ua ua_shift_alt \
+ uk uk_capsctrl uk_dvorak uk_macbook \
+ us_dvorak us_dvorakl us_dvorakp us_dvorakr us_dvorakx \
+ us_emacs us_unix
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/bhyve/kbdlayout/Makefile.depend b/usr.sbin/bhyve/kbdlayout/Makefile.depend
new file mode 100644
index 000000000000..f80275d86ab1
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/Makefile.depend
@@ -0,0 +1,11 @@
+# $FreeBSD$
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/usr.sbin/bhyve/kbdlayout/am b/usr.sbin/bhyve/kbdlayout/am
new file mode 100644
index 000000000000..c102fb10801a
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/am
@@ -0,0 +1,10 @@
+# bhyve ps2kbd keyboard layout file
+# (am : Armenian phonetic layout)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+')',0x87; ) (0x29)
+'+',0xce; + (0x2b)
+
diff --git a/usr.sbin/bhyve/kbdlayout/be b/usr.sbin/bhyve/kbdlayout/be
new file mode 100644
index 000000000000..26f8cdc3acbc
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/be
@@ -0,0 +1,45 @@
+# bhyve ps2kbd keyboard layout file
+# (be : Belgian)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x3e; ! (0x21)
+'"',0x26; " (0x22)
+'$',0x5b; $ (0x24)
+'%',0x52; % (0x25)
+'&',0x16; & (0x26)
+''',0x25; ' (0x27)
+'(',0x2e; ( (0x28)
+')',0x4e; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x4a; + (0x2b)
+',',0x3a; , (0x2c)
+'-',0x55; - (0x2d)
+'.',0x41; . (0x2e)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x4a; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x3a; ? (0x3f)
+'A',0x15; A (0x41)
+'M',0x4c; M (0x4d)
+'Q',0x1c; Q (0x51)
+'W',0x1a; W (0x57)
+'Z',0x1d; Z (0x5a)
+'\',0x61; \ (0x5c)
+'^',0x54; ^ (0x5e)
+'_',0x55; _ (0x5f)
+'`',0x5d; ` (0x60)
+'a',0x15; a (0x61)
+'m',0x4c; m (0x6d)
+'q',0x1c; q (0x71)
+'w',0x1a; w (0x77)
+'z',0x1d; z (0x7a)
+'{',0x46; { (0x7b)
+'|',0x16; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x4a; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/be_acc b/usr.sbin/bhyve/kbdlayout/be_acc
new file mode 100644
index 000000000000..adf136634eb2
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/be_acc
@@ -0,0 +1,42 @@
+# bhyve ps2kbd keyboard layout file
+# (be_acc : Belgian (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x3e; ! (0x21)
+'"',0x26; " (0x22)
+'$',0x5b; $ (0x24)
+'%',0x52; % (0x25)
+'&',0x16; & (0x26)
+''',0x25; ' (0x27)
+'(',0x2e; ( (0x28)
+')',0x4e; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x4a; + (0x2b)
+',',0x3a; , (0x2c)
+'-',0x55; - (0x2d)
+'.',0x41; . (0x2e)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x4a; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x3a; ? (0x3f)
+'A',0x15; A (0x41)
+'M',0x4c; M (0x4d)
+'Q',0x1c; Q (0x51)
+'W',0x1a; W (0x57)
+'Z',0x1d; Z (0x5a)
+'\',0x61; \ (0x5c)
+'_',0x55; _ (0x5f)
+'a',0x15; a (0x61)
+'m',0x4c; m (0x6d)
+'q',0x1c; q (0x71)
+'w',0x1a; w (0x77)
+'z',0x1d; z (0x7a)
+'{',0x46; { (0x7b)
+'|',0x16; | (0x7c)
+'}',0x45; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/bg_bds b/usr.sbin/bhyve/kbdlayout/bg_bds
new file mode 100644
index 000000000000..9c25ed4640d3
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/bg_bds
@@ -0,0 +1,10 @@
+# bhyve ps2kbd keyboard layout file
+# (bg_bds : Bulgarian (BDS))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'(',0xa9; ( (0x28)
+'*',0xb7; * (0x2a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/bg_phonetic b/usr.sbin/bhyve/kbdlayout/bg_phonetic
new file mode 100644
index 000000000000..dfe972db5b5b
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/bg_phonetic
@@ -0,0 +1,9 @@
+# bhyve ps2kbd keyboard layout file
+# (bg_phonetic : Bulgarian (Phonetic))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'*',0xb7; * (0x2a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/br b/usr.sbin/bhyve/kbdlayout/br
new file mode 100644
index 000000000000..b4605e1748c3
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/br
@@ -0,0 +1,19 @@
+# bhyve ps2kbd keyboard layout file
+# (br : Brazilian (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x0e; " (0x22)
+''',0x0e; ' (0x27)
+':',0x4a; : (0x3a)
+';',0x4a; ; (0x3b)
+'?',0x51; ? (0x3f)
+'[',0x5b; [ (0x5b)
+'\',0x61; \ (0x5c)
+']',0x5d; ] (0x5d)
+'{',0x5b; { (0x7b)
+'|',0x61; | (0x7c)
+'}',0x5d; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/br_noacc b/usr.sbin/bhyve/kbdlayout/br_noacc
new file mode 100644
index 000000000000..62bea6254ced
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/br_noacc
@@ -0,0 +1,22 @@
+# bhyve ps2kbd keyboard layout file
+# (br_noacc : Brazilian (without accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x0e; " (0x22)
+''',0x0e; ' (0x27)
+':',0x4a; : (0x3a)
+';',0x4a; ; (0x3b)
+'?',0x51; ? (0x3f)
+'[',0x5b; [ (0x5b)
+'\',0x61; \ (0x5c)
+']',0x5d; ] (0x5d)
+'^',0x52; ^ (0x5e)
+'`',0x54; ` (0x60)
+'{',0x5b; { (0x7b)
+'|',0x61; | (0x7c)
+'}',0x5d; } (0x7d)
+'~',0x52; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/centraleuropean b/usr.sbin/bhyve/kbdlayout/centraleuropean
new file mode 100644
index 000000000000..7b3a2f883aaa
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/centraleuropean
@@ -0,0 +1,12 @@
+# bhyve ps2kbd keyboard layout file
+# (centraleuropean : Central European)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/ch b/usr.sbin/bhyve/kbdlayout/ch
new file mode 100644
index 000000000000..c68f78a49ede
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/ch
@@ -0,0 +1,36 @@
+# bhyve ps2kbd keyboard layout file
+# (ch : Swiss-German)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x5b; ! (0x21)
+'"',0x1e; " (0x22)
+'$',0x5d; $ (0x24)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x26; * (0x2a)
+'+',0x16; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'\',0x61; \ (0x5c)
+'^',0x55; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x55; ` (0x60)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+'{',0x52; { (0x7b)
+'|',0x16; | (0x7c)
+'}',0x5d; } (0x7d)
+'~',0x55; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/ch-fr b/usr.sbin/bhyve/kbdlayout/ch-fr
new file mode 100644
index 000000000000..33d747f58f5a
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/ch-fr
@@ -0,0 +1,36 @@
+# bhyve ps2kbd keyboard layout file
+# (ch-fr : Swiss-French)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x5b; ! (0x21)
+'"',0x1e; " (0x22)
+'$',0x5d; $ (0x24)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x26; * (0x2a)
+'+',0x16; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'\',0x61; \ (0x5c)
+'^',0x55; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x55; ` (0x60)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+'{',0x52; { (0x7b)
+'|',0x16; | (0x7c)
+'}',0x5d; } (0x7d)
+'~',0x55; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/ch-fr_acc b/usr.sbin/bhyve/kbdlayout/ch-fr_acc
new file mode 100644
index 000000000000..3d081fb6711c
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/ch-fr_acc
@@ -0,0 +1,33 @@
+# bhyve ps2kbd keyboard layout file
+# (ch-fr_acc : Swiss-French (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x5b; ! (0x21)
+'"',0x1e; " (0x22)
+'$',0x5d; $ (0x24)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x26; * (0x2a)
+'+',0x16; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'\',0x61; \ (0x5c)
+'_',0x4a; _ (0x5f)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+'{',0x52; { (0x7b)
+'|',0x16; | (0x7c)
+'}',0x5d; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/ch_acc b/usr.sbin/bhyve/kbdlayout/ch_acc
new file mode 100644
index 000000000000..5b916d444e6f
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/ch_acc
@@ -0,0 +1,33 @@
+# bhyve ps2kbd keyboard layout file
+# (ch_acc : Swiss-German (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x5b; ! (0x21)
+'"',0x1e; " (0x22)
+'$',0x5d; $ (0x24)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x26; * (0x2a)
+'+',0x16; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'\',0x61; \ (0x5c)
+'_',0x4a; _ (0x5f)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+'{',0x52; { (0x7b)
+'|',0x16; | (0x7c)
+'}',0x5d; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/ch_macbook_acc b/usr.sbin/bhyve/kbdlayout/ch_macbook_acc
new file mode 100644
index 000000000000..3c7a032bebe6
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/ch_macbook_acc
@@ -0,0 +1,37 @@
+# bhyve ps2kbd keyboard layout file
+# (ch_macbook_acc : Swiss-German Macbook/Macbook Pro (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x5b; ! (0x21)
+'"',0x1e; " (0x22)
+'$',0x5d; $ (0x24)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x26; * (0x2a)
+'+',0x16; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x0e; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x0e; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x34; @ (0x40)
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'[',0x2e; [ (0x5b)
+'\',0x61; \ (0x5c)
+']',0x36; ] (0x5d)
+'_',0x4a; _ (0x5f)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+'{',0x3e; { (0x7b)
+'|',0x3d; | (0x7c)
+'}',0x46; } (0x7d)
+'~',0x31; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/cz b/usr.sbin/bhyve/kbdlayout/cz
new file mode 100644
index 000000000000..98f6108231ee
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/cz
@@ -0,0 +1,11 @@
+# bhyve ps2kbd keyboard layout file
+# (cz : Czech (QWERTZ, accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+')',0x9b; ) (0x29)
+'*',0xb7; * (0x2a)
+'+',0x82; + (0x2b)
+
diff --git a/usr.sbin/bhyve/kbdlayout/de b/usr.sbin/bhyve/kbdlayout/de
new file mode 100644
index 000000000000..745f826a9de2
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/de
@@ -0,0 +1,37 @@
+# bhyve ps2kbd keyboard layout file
+# (de : German)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'#',0x5d; # (0x23)
+'&',0x36; & (0x26)
+''',0x5d; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x5b; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x15; @ (0x40)
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'[',0x3e; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x0e; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+'{',0x3d; { (0x7b)
+'|',0x61; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/de_acc b/usr.sbin/bhyve/kbdlayout/de_acc
new file mode 100644
index 000000000000..2ba06f3d166b
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/de_acc
@@ -0,0 +1,36 @@
+# bhyve ps2kbd keyboard layout file
+# (de_acc : German (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'#',0x5d; # (0x23)
+'&',0x36; & (0x26)
+''',0x5d; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x5b; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x15; @ (0x40)
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'[',0x3e; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x0e; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+'{',0x3d; { (0x7b)
+'|',0x61; | (0x7c)
+'}',0x45; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/de_noacc b/usr.sbin/bhyve/kbdlayout/de_noacc
new file mode 100644
index 000000000000..4d215116e2a7
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/de_noacc
@@ -0,0 +1,38 @@
+# bhyve ps2kbd keyboard layout file
+# (de_noacc : German (no accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'#',0x5d; # (0x23)
+'&',0x36; & (0x26)
+''',0x55; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x5b; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x15; @ (0x40)
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'[',0x3e; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x0e; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x55; ` (0x60)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+'{',0x3d; { (0x7b)
+'|',0x61; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/default b/usr.sbin/bhyve/kbdlayout/default
new file mode 100644
index 000000000000..8674c280280b
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/default
@@ -0,0 +1,248 @@
+# bhyve ps2kbd keyboard layout file (US - default)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+# for those who create the Keyboard Layout File. ******************************
+# To create the keyboard layout file, first copy this 'default' file into the
+# same dir. with the layout name as the file name.
+# The file name is a character string that can be specified as it is in the
+# -k option of the bhyve command, so a normal language name is desirable.
+# Then, it is necessary to define the difference between the standard US keyboard
+# and the keyboard for each language according to the setting method described
+# in the comment below.
+#
+# Note that lines starting with '#' and blank lines are ignored.
+# In addition, the definition of the standard layout setting (US keyboard)
+# is described as a comment line below for reference.
+# So you usually only need to remove the '#' and fix it to the correct ScanCode
+# only on the lines of the key that you can't type correctly with the standard
+# US keyboard settings.
+
+
+# Alphabet/Number/Sign Keys ---------------------------------------------------
+# Format:
+# 'Chr',ScanCode(Hex); <Comment>
+# or
+# AsciiCode(Hex),ScanCode(Hex); <Comment>
+#
+# If there are ASCII characters that cannot be entered correctly with the
+# standard settings(US Keyboard layout), delete the "#" at the beginning of the
+# relevant line below and set the correct ScanCode.
+#
+# For example, when a Japanese Keyboard is used, the '@' sign cannot be input
+# correctly and the number '2' is input.
+# This is because the US keyboard can input the '@' sign with the Shift + number'2'
+# keys, and the ScanCode of the '@' sign is the number '2' key by default.
+# In this case, remove the '#' at the beginning of the line with the '@' sign
+# below and correct the ScanCode from 0x1e to 0x54 so that you can enter it
+# correctly.
+# ScanCode differs depending on the keyboard of eash language, so check it on
+# the Internet.
+# Note that keys that have no problems with input have the same settings as
+# the US keyboard, so you do not need to set anything below.
+# See the "/usr/share/bhyve/kbdlayout/jp106" file for the specific setting method.
+
+# '!',0x16; ! (0x21)
+# '"',0x52; " (0x22)
+# '#',0x26; # (0x23)
+# '$',0x25; $ (0x24)
+# '%',0x2e; % (0x25)
+# '&',0x3d; & (0x26)
+# ''',0x52; ' (0x27)
+# '(',0x46; ( (0x28)
+# ')',0x45; ) (0x29)
+# '*',0x3e; * (0x2a)
+# '+',0x55; + (0x2b)
+# ',',0x41; , (0x2c)
+# '-',0x4e; - (0x2d)
+# '.',0x49; . (0x2e)
+# '/',0x4a; / (0x2f)
+
+# '0',0x45; 0 (0x30)
+# '1',0x16; 1 (0x31)
+# '2',0x1e; 2 (0x32)
+# '3',0x26; 3 (0x33)
+# '4',0x25; 4 (0x34)
+# '5',0x2e; 5 (0x35)
+# '6',0x36; 6 (0x36)
+# '7',0x3d; 7 (0x37)
+# '8',0x3e; 8 (0x38)
+# '9',0x46; 9 (0x39)
+# ':',0x4c; : (0x3a)
+# ';',0x4c; ; (0x3b)
+# '<',0x41; < (0x3c)
+# '=',0x55; = (0x3d)
+# '>',0x49; > (0x3e)
+# '?',0x4a; ? (0x3f)
+
+# '@',0x1e; @ (0x40)
+# 'A',0x1c; A (0x41)
+# 'B',0x32; B (0x42)
+# 'C',0x21; C (0x43)
+# 'D',0x23; D (0x44)
+# 'E',0x24; E (0x45)
+# 'F',0x2b; F (0x46)
+# 'G',0x34; G (0x47)
+# 'H',0x33; H (0x48)
+# 'I',0x43; I (0x49)
+# 'J',0x3b; J (0x4a)
+# 'K',0x42; K (0x4b)
+# 'L',0x4b; L (0x4c)
+# 'M',0x3a; M (0x4d)
+# 'N',0x31; N (0x4e)
+# 'O',0x44; O (0x4f)
+
+# 'P',0x4d; P (0x50)
+# 'Q',0x15; Q (0x51)
+# 'R',0x2d; R (0x52)
+# 'S',0x1b; S (0x53)
+# 'T',0x2c; T (0x54)
+# 'U',0x3c; U (0x55)
+# 'V',0x2a; V (0x56)
+# 'W',0x1d; W (0x57)
+# 'X',0x22; X (0x58)
+# 'Y',0x35; Y (0x59)
+# 'Z',0x1a; Z (0x5a)
+# '[',0x54; [ (0x5b)
+# '\',0x5d; \ (0x5c)
+# ']',0x5b; ] (0x5d)
+# '^',0x36; ^ (0x5e)
+# '_',0x4e; _ (0x5f)
+
+# '`',0x0e; ` (0x60)
+# 'a',0x1c; a (0x61)
+# 'b',0x32; b (0x62)
+# 'c',0x21; c (0x63)
+# 'd',0x23; d (0x64)
+# 'e',0x24; e (0x65)
+# 'f',0x2b; f (0x66)
+# 'g',0x34; g (0x67)
+# 'h',0x33; h (0x68)
+# 'i',0x43; i (0x69)
+# 'j',0x3b; j (0x6a)
+# 'k',0x42; k (0x6b)
+# 'l',0x4b; l (0x6c)
+# 'm',0x3a; m (0x6d)
+# 'n',0x31; n (0x6e)
+# 'o',0x44; o (0x6f)
+
+# 'p',0x4d; p (0x70)
+# 'q',0x15; q (0x71)
+# 'r',0x2d; r (0x72)
+# 's',0x1b; s (0x73)
+# 't',0x2c; t (0x74)
+# 'u',0x3c; u (0x75)
+# 'v',0x2a; v (0x76)
+# 'w',0x1d; w (0x77)
+# 'x',0x22; x (0x78)
+# 'y',0x35; y (0x79)
+# 'z',0x1a; z (0x7a)
+# '{',0x54; { (0x7b)
+# '|',0x5d; | (0x7c)
+# '}',0x5b; } (0x7d)
+# '~',0x0e; ~ (0x7e)
+
+
+# Functional Keys -------------------------------------------------------------
+# Format:
+# Xorg KeySym(Hex:2Byte),ScanCode(Hex); <Comment>
+# or
+# Xorg KeySym(Hex:2Byte),ScanCode(Hex),Prefix(Hex); <Comment>
+#
+# Key definitions other than alphanumeric characters such as Enter and Escape
+# are set in this section.
+# If there is a key that can not be entered correctly with the standard settings
+# (US Keyboard layout),, delete the '#' at the beginning of the corresponding
+# line and set the correct scan code.
+# The Xorg KeySym Code can be checked by using the 'xev' command from X window
+# on the guest OS.
+# In addition, some keys have ScanCodes that have a Prefix Byte.
+# In this case, define '0xe0' as the third argument.(example Home Key,etc)
+# Note that keys that have no problems with input have the same settings as
+# the US keyboard, so you do not need to set anything below.
+# See the "/usr/share/bhyve/kbdlayout/jp106" file for the specific setting method.
+
+# 0xff08,0x66; Back space
+# 0xff09,0x0d; Tab
+# 0xff0d,0x5a; Return
+# 0xff1b,0x76; Escape
+# 0xff50,0x6c,0xe0; Home
+# 0xff51,0x6b,0xe0; Left arrow
+# 0xff52,0x75,0xe0; Up arrow
+# 0xff53,0x74,0xe0; Right arrow
+# 0xff54,0x72,0xe0; Down arrow
+# 0xff55,0x7d,0xe0; PgUp
+# 0xff56,0x7a,0xe0; PgDown
+# 0xff57,0x69,0xe0; End
+# 0xff63,0x70,0xe0; Ins
+# 0xff8d,0x5a,0xe0; Keypad Enter
+# 0xffe1,0x12; Left shift
+# 0xffe2,0x59; Right shift
+# 0xffe3,0x14; Left control
+# 0xffe4,0x14,0xe0; Right control
+# 0xffe9,0x11; Left alt
+# 0xfe03,0x11,0xe0; AltGr
+# 0xffea,0x11,0xe0; Right alt
+# 0xffeb,0x1f,0xe0; Left Windows
+# 0xffec,0x27,0xe0; Right Windows
+# 0xffbe,0x05; F1
+# 0xffbf,0x06; F2
+# 0xffc0,0x04; F3
+# 0xffc1,0x0c; F4
+# 0xffc2,0x03; F5
+# 0xffc3,0x0b; F6
+# 0xffc4,0x83; F7
+# 0xffc5,0x0a; F8
+# 0xffc6,0x01; F9
+# 0xffc7,0x09; F10
+# 0xffc8,0x78; F11
+# 0xffc9,0x07; F12
+# 0xffff,0x71,0xe0; Del
+# 0xff14,0x7e; ScrollLock
+
+
+# NumLock and Keypads ---------------------------------------------------------
+#
+# The numeric keypad settings are the same as the Functional Key section above.
+
+# 0xff7f,0x77; NumLock
+# 0xffaf,0x4a,0xe0; Keypad slash
+# 0xffaa,0x7c; Keypad asterisk
+# 0xffad,0x7b; Keypad minus
+# 0xffab,0x79; Keypad plus
+# 0xffb7,0x6c; Keypad 7
+# 0xff95,0x6c; Keypad home
+# 0xffb8,0x75; Keypad 8
+# 0xff97,0x75; Keypad up arrow
+# 0xffb9,0x7d; Keypad 9
+# 0xff9a,0x7d; Keypad PgUp
+# 0xffb4,0x6b; Keypad 4
+# 0xff96,0x6b; Keypad left arrow
+# 0xffb5,0x73; Keypad 5
+# 0xff9d,0x73; Keypad empty
+# 0xffb6,0x74; Keypad 6
+# 0xff98,0x74; Keypad right arrow
+# 0xffb1,0x69; Keypad 1
+# 0xff9c,0x69; Keypad end
+# 0xffb2,0x72; Keypad 2
+# 0xff99,0x72; Keypad down arrow
+# 0xffb3,0x7a; Keypad 3
+# 0xff9b,0x7a; Keypad PgDown
+# 0xffb0,0x70; Keypad 0
+# 0xff9e,0x70; Keypad ins
+# 0xffae,0x71; Keypad .
+# 0xff9f,0x71; Keypad del
+
+
+# Language Specific Keys -------------------------------------------------------
+#
+# If a key not exist in the US keyboard is added to the keyboard of each language,
+# it is necessary to add the combination of Xorg KeySym and ScanCode of the
+# corresponding key.
+# The setting format is the same as the Functional Key section above.
+# example:
+# 0xff2a,0x0e; Hankaku/Zenkaku|Kanji (Japanese 106 keyboard original Key)
+
+
diff --git a/usr.sbin/bhyve/kbdlayout/dk b/usr.sbin/bhyve/kbdlayout/dk
new file mode 100644
index 000000000000..5183691bfb78
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/dk
@@ -0,0 +1,32 @@
+# bhyve ps2kbd keyboard layout file
+# (dk : Danish)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x5b; " (0x22)
+'&',0x36; & (0x26)
+''',0x55; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5d; * (0x2a)
+'+',0x4e; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'[',0x3e; [ (0x5b)
+'\',0x61; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x5b; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x55; ` (0x60)
+'{',0x3d; { (0x7b)
+'|',0x55; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/dk_macbook b/usr.sbin/bhyve/kbdlayout/dk_macbook
new file mode 100644
index 000000000000..a9d9c1b7435e
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/dk_macbook
@@ -0,0 +1,35 @@
+# bhyve ps2kbd keyboard layout file
+# (dk_macbook : Danish (macbook))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'$',0x0e; $ (0x24)
+'&',0x36; & (0x26)
+''',0x5d; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5d; * (0x2a)
+'+',0x4e; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x5d; @ (0x40)
+'G',0x7a,0xe0; G (0x47)
+'I',0x6c,0xe0; I (0x49)
+'O',0x69,0xe0; O (0x4f)
+'Q',0x7d,0xe0; Q (0x51)
+'[',0x3e; [ (0x5b)
+'\',0x61; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x5b; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'|',0x43; | (0x7c)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/ee b/usr.sbin/bhyve/kbdlayout/ee
new file mode 100644
index 000000000000..c2ebbdb08116
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/ee
@@ -0,0 +1,31 @@
+# bhyve ps2kbd keyboard layout file
+# (ee : Nordic layout on Asus eeePC Estonian)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x5d; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5d; * (0x2a)
+'+',0x4e; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'[',0x3e; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x52; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x55; ` (0x60)
+'{',0x3d; { (0x7b)
+'|',0x61; | (0x7c)
+'}',0x45; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/es b/usr.sbin/bhyve/kbdlayout/es
new file mode 100644
index 000000000000..54ffb24bfc10
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/es
@@ -0,0 +1,28 @@
+# bhyve ps2kbd keyboard layout file
+# (es : Spanish (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x5b; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'\',0x0e; \ (0x5c)
+'_',0x4a; _ (0x5f)
+'{',0x52; { (0x7b)
+'|',0x16; | (0x7c)
+'}',0x5d; } (0x7d)
+'~',0x25; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/es_acc b/usr.sbin/bhyve/kbdlayout/es_acc
new file mode 100644
index 000000000000..cd091791c055
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/es_acc
@@ -0,0 +1,28 @@
+# bhyve ps2kbd keyboard layout file
+# (es_acc : Spanish (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x5b; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'\',0x0e; \ (0x5c)
+'_',0x4a; _ (0x5f)
+'{',0x52; { (0x7b)
+'|',0x16; | (0x7c)
+'}',0x5d; } (0x7d)
+'~',0x25; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/es_dvorak b/usr.sbin/bhyve/kbdlayout/es_dvorak
new file mode 100644
index 000000000000..b84e95c91354
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/es_dvorak
@@ -0,0 +1,78 @@
+# bhyve ps2kbd keyboard layout file
+# (es_dvorak : Spanish Dvorak)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x5b; + (0x2b)
+',',0x1d; , (0x2c)
+'-',0x1a; - (0x2d)
+'.',0x15; . (0x2e)
+':',0x15; : (0x3a)
+';',0x1d; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'B',0x31; B (0x42)
+'C',0x43; C (0x43)
+'D',0x33; D (0x44)
+'E',0x23; E (0x45)
+'F',0x35; F (0x46)
+'G',0x3c; G (0x47)
+'H',0x44; H (0x48)
+'I',0x34; I (0x49)
+'J',0x21; J (0x4a)
+'K',0x2a; K (0x4b)
+'L',0x4d; L (0x4c)
+'N',0x4b; N (0x4e)
+'O',0x1b; O (0x4f)
+'P',0x2d; P (0x50)
+'Q',0x22; Q (0x51)
+'R',0x3b; R (0x52)
+'S',0x4c; S (0x53)
+'T',0x42; T (0x54)
+'U',0x2b; U (0x55)
+'V',0x49; V (0x56)
+'W',0x41; W (0x57)
+'X',0x32; X (0x58)
+'Y',0x2c; Y (0x59)
+'Z',0x4a; Z (0x5a)
+'\',0x0e; \ (0x5c)
+'_',0x1a; _ (0x5f)
+'b',0x31; b (0x62)
+'c',0x43; c (0x63)
+'d',0x33; d (0x64)
+'e',0x23; e (0x65)
+'f',0x35; f (0x66)
+'g',0x3c; g (0x67)
+'h',0x44; h (0x68)
+'i',0x34; i (0x69)
+'j',0x21; j (0x6a)
+'k',0x2a; k (0x6b)
+'l',0x4d; l (0x6c)
+'n',0x4b; n (0x6e)
+'o',0x1b; o (0x6f)
+'p',0x2d; p (0x70)
+'q',0x22; q (0x71)
+'r',0x3b; r (0x72)
+'s',0x4c; s (0x73)
+'t',0x42; t (0x74)
+'u',0x2b; u (0x75)
+'v',0x49; v (0x76)
+'w',0x41; w (0x77)
+'x',0x32; x (0x78)
+'y',0x2c; y (0x79)
+'z',0x4a; z (0x7a)
+'{',0x52; { (0x7b)
+'|',0x0e; | (0x7c)
+'}',0x5d; } (0x7d)
+'~',0x25; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/fi b/usr.sbin/bhyve/kbdlayout/fi
new file mode 100644
index 000000000000..c4bdea09a617
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/fi
@@ -0,0 +1,32 @@
+# bhyve ps2kbd keyboard layout file
+# (fi : Finnish)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x5d; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5d; * (0x2a)
+'+',0x4e; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'[',0x3e; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x5b; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x55; ` (0x60)
+'{',0x3d; { (0x7b)
+'|',0x4c; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/fr b/usr.sbin/bhyve/kbdlayout/fr
new file mode 100644
index 000000000000..6009090ff090
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/fr
@@ -0,0 +1,46 @@
+# bhyve ps2kbd keyboard layout file
+# (fr : French French Canadian (accent keys) Swiss-French)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x4a; ! (0x21)
+'"',0x26; " (0x22)
+'$',0x5b; $ (0x24)
+'%',0x52; % (0x25)
+'&',0x16; & (0x26)
+''',0x25; ' (0x27)
+'(',0x2e; ( (0x28)
+')',0x4e; ) (0x29)
+'*',0x5d; * (0x2a)
+',',0x3a; , (0x2c)
+'-',0x36; - (0x2d)
+'.',0x41; . (0x2e)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'>',0x61; > (0x3e)
+'?',0x3a; ? (0x3f)
+'@',0x45; @ (0x40)
+'A',0x15; A (0x41)
+'M',0x4c; M (0x4d)
+'Q',0x1c; Q (0x51)
+'W',0x1a; W (0x57)
+'Z',0x1d; Z (0x5a)
+'[',0x2e; [ (0x5b)
+'\',0x3e; \ (0x5c)
+']',0x4e; ] (0x5d)
+'^',0x46; ^ (0x5e)
+'_',0x3e; _ (0x5f)
+'`',0x3d; ` (0x60)
+'a',0x15; a (0x61)
+'m',0x4c; m (0x6d)
+'q',0x1c; q (0x71)
+'w',0x1a; w (0x77)
+'z',0x1d; z (0x7a)
+'{',0x25; { (0x7b)
+'|',0x36; | (0x7c)
+'}',0x55; } (0x7d)
+'~',0x1e; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/fr_acc b/usr.sbin/bhyve/kbdlayout/fr_acc
new file mode 100644
index 000000000000..ef8730f62f46
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/fr_acc
@@ -0,0 +1,46 @@
+# bhyve ps2kbd keyboard layout file
+# (fr_acc : French (accent keys) Swiss-French (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x4a; ! (0x21)
+'"',0x26; " (0x22)
+'$',0x5b; $ (0x24)
+'%',0x52; % (0x25)
+'&',0x16; & (0x26)
+''',0x25; ' (0x27)
+'(',0x2e; ( (0x28)
+')',0x4e; ) (0x29)
+'*',0x5d; * (0x2a)
+',',0x3a; , (0x2c)
+'-',0x36; - (0x2d)
+'.',0x41; . (0x2e)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'>',0x61; > (0x3e)
+'?',0x3a; ? (0x3f)
+'@',0x45; @ (0x40)
+'A',0x15; A (0x41)
+'M',0x4c; M (0x4d)
+'Q',0x1c; Q (0x51)
+'W',0x1a; W (0x57)
+'Z',0x1d; Z (0x5a)
+'[',0x2e; [ (0x5b)
+'\',0x3e; \ (0x5c)
+']',0x4e; ] (0x5d)
+'^',0x46; ^ (0x5e)
+'_',0x3e; _ (0x5f)
+'`',0x3d; ` (0x60)
+'a',0x15; a (0x61)
+'m',0x4c; m (0x6d)
+'q',0x1c; q (0x71)
+'w',0x1a; w (0x77)
+'z',0x1d; z (0x7a)
+'{',0x25; { (0x7b)
+'|',0x36; | (0x7c)
+'}',0x55; } (0x7d)
+'~',0x1e; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/fr_dvorak b/usr.sbin/bhyve/kbdlayout/fr_dvorak
new file mode 100644
index 000000000000..f739c8e15502
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/fr_dvorak
@@ -0,0 +1,87 @@
+# bhyve ps2kbd keyboard layout file
+# (fr_dvorak : French Dvorak-like)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x2c; ! (0x21)
+'"',0x45; " (0x22)
+'#',0x5d; # (0x23)
+'%',0x55; % (0x25)
+'&',0x5b; & (0x26)
+''',0x1d; ' (0x27)
+'(',0x3d; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x61; * (0x2a)
+'+',0x61; + (0x2b)
+',',0x21; , (0x2c)
+'-',0x26; - (0x2d)
+'.',0x2c; . (0x2e)
+'/',0x2e; / (0x2f)
+':',0x15; : (0x3a)
+';',0x1a; ; (0x3b)
+'<',0x1d; < (0x3c)
+'=',0x16; = (0x3d)
+'>',0x24; > (0x3e)
+'?',0x15; ? (0x3f)
+'@',0x1a; @ (0x40)
+'A',0x1b; A (0x41)
+'B',0x34; B (0x42)
+'C',0x43; C (0x43)
+'D',0x4c; D (0x44)
+'E',0x2b; E (0x45)
+'F',0x33; F (0x46)
+'G',0x2d; G (0x47)
+'H',0x35; H (0x48)
+'I',0x2a; I (0x49)
+'J',0x4a; J (0x4a)
+'K',0x4d; K (0x4b)
+'L',0x41; L (0x4c)
+'M',0x44; M (0x4d)
+'N',0x4b; N (0x4e)
+'O',0x1c; O (0x4f)
+'P',0x49; P (0x50)
+'Q',0x22; Q (0x51)
+'R',0x3a; R (0x52)
+'S',0x3b; S (0x53)
+'T',0x42; T (0x54)
+'U',0x23; U (0x55)
+'V',0x3c; V (0x56)
+'W',0x52; W (0x57)
+'X',0x31; X (0x58)
+'Y',0x32; Y (0x59)
+'Z',0x54; Z (0x5a)
+'[',0x4e; [ (0x5b)
+'\',0x21; \ (0x5c)
+']',0x55; ] (0x5d)
+'`',0x3e; ` (0x60)
+'a',0x1b; a (0x61)
+'b',0x34; b (0x62)
+'c',0x43; c (0x63)
+'d',0x4c; d (0x64)
+'e',0x2b; e (0x65)
+'f',0x33; f (0x66)
+'g',0x2d; g (0x67)
+'h',0x35; h (0x68)
+'i',0x2a; i (0x69)
+'j',0x4a; j (0x6a)
+'k',0x4d; k (0x6b)
+'l',0x41; l (0x6c)
+'m',0x44; m (0x6d)
+'n',0x4b; n (0x6e)
+'o',0x1c; o (0x6f)
+'p',0x49; p (0x70)
+'q',0x22; q (0x71)
+'r',0x3a; r (0x72)
+'s',0x3b; s (0x73)
+'t',0x42; t (0x74)
+'u',0x23; u (0x75)
+'v',0x3c; v (0x76)
+'w',0x52; w (0x77)
+'x',0x31; x (0x78)
+'y',0x32; y (0x79)
+'z',0x54; z (0x7a)
+'|',0x4e; | (0x7c)
+'~',0x5d; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/fr_dvorak_acc b/usr.sbin/bhyve/kbdlayout/fr_dvorak_acc
new file mode 100644
index 000000000000..c126572b7e16
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/fr_dvorak_acc
@@ -0,0 +1,86 @@
+# bhyve ps2kbd keyboard layout file
+# (fr_dvorak_acc : French Dvorak-like (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x2c; ! (0x21)
+'"',0x45; " (0x22)
+'#',0x5d; # (0x23)
+'%',0x55; % (0x25)
+'&',0x5b; & (0x26)
+''',0x1d; ' (0x27)
+'(',0x3d; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x0e; * (0x2a)
+'+',0x4e; + (0x2b)
+',',0x21; , (0x2c)
+'-',0x26; - (0x2d)
+'.',0x2c; . (0x2e)
+'/',0x1e; / (0x2f)
+':',0x15; : (0x3a)
+';',0x1a; ; (0x3b)
+'<',0x1d; < (0x3c)
+'=',0x16; = (0x3d)
+'>',0x24; > (0x3e)
+'?',0x15; ? (0x3f)
+'@',0x21; @ (0x40)
+'A',0x1b; A (0x41)
+'B',0x34; B (0x42)
+'C',0x43; C (0x43)
+'D',0x4c; D (0x44)
+'E',0x2b; E (0x45)
+'F',0x33; F (0x46)
+'G',0x2d; G (0x47)
+'H',0x35; H (0x48)
+'I',0x2a; I (0x49)
+'J',0x4a; J (0x4a)
+'K',0x4d; K (0x4b)
+'L',0x41; L (0x4c)
+'M',0x44; M (0x4d)
+'N',0x4b; N (0x4e)
+'O',0x1c; O (0x4f)
+'P',0x49; P (0x50)
+'Q',0x22; Q (0x51)
+'R',0x3a; R (0x52)
+'S',0x3b; S (0x53)
+'T',0x42; T (0x54)
+'U',0x23; U (0x55)
+'V',0x3c; V (0x56)
+'W',0x52; W (0x57)
+'X',0x31; X (0x58)
+'Y',0x32; Y (0x59)
+'Z',0x54; Z (0x5a)
+'[',0x4e; [ (0x5b)
+'\',0x2e; \ (0x5c)
+']',0x55; ] (0x5d)
+'_',0x0e; _ (0x5f)
+'a',0x1b; a (0x61)
+'b',0x34; b (0x62)
+'c',0x43; c (0x63)
+'d',0x4c; d (0x64)
+'e',0x2b; e (0x65)
+'f',0x33; f (0x66)
+'g',0x2d; g (0x67)
+'h',0x35; h (0x68)
+'i',0x2a; i (0x69)
+'j',0x4a; j (0x6a)
+'k',0x4d; k (0x6b)
+'l',0x41; l (0x6c)
+'m',0x44; m (0x6d)
+'n',0x4b; n (0x6e)
+'o',0x1c; o (0x6f)
+'p',0x49; p (0x70)
+'q',0x22; q (0x71)
+'r',0x3a; r (0x72)
+'s',0x3b; s (0x73)
+'t',0x42; t (0x74)
+'u',0x23; u (0x75)
+'v',0x3c; v (0x76)
+'w',0x52; w (0x77)
+'x',0x31; x (0x78)
+'y',0x32; y (0x79)
+'z',0x54; z (0x7a)
+'|',0x1a; | (0x7c)
+
diff --git a/usr.sbin/bhyve/kbdlayout/fr_macbook b/usr.sbin/bhyve/kbdlayout/fr_macbook
new file mode 100644
index 000000000000..ddb756c8a648
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/fr_macbook
@@ -0,0 +1,49 @@
+# bhyve ps2kbd keyboard layout file
+# (fr_macbook : French Macbook/Macbook Pro (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x3e; ! (0x21)
+'"',0x26; " (0x22)
+'#',0x0e; # (0x23)
+'$',0x5b; $ (0x24)
+'%',0x52; % (0x25)
+'&',0x16; & (0x26)
+''',0x25; ' (0x27)
+'(',0x2e; ( (0x28)
+')',0x4e; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x4a; + (0x2b)
+',',0x3a; , (0x2c)
+'-',0x55; - (0x2d)
+'.',0x41; . (0x2e)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x4a; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x3a; ? (0x3f)
+'@',0x0e; @ (0x40)
+'A',0x15; A (0x41)
+'M',0x4c; M (0x4d)
+'Q',0x1c; Q (0x51)
+'W',0x1a; W (0x57)
+'Z',0x1d; Z (0x5a)
+'[',0x2e; [ (0x5b)
+'\',0x3e; \ (0x5c)
+']',0x4e; ] (0x5d)
+'^',0x46; ^ (0x5e)
+'_',0x55; _ (0x5f)
+'`',0x3d; ` (0x60)
+'a',0x15; a (0x61)
+'m',0x4c; m (0x6d)
+'q',0x1c; q (0x71)
+'w',0x1a; w (0x77)
+'z',0x1d; z (0x7a)
+'{',0x25; { (0x7b)
+'|',0x36; | (0x7c)
+'}',0x55; } (0x7d)
+'~',0x1e; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/gr b/usr.sbin/bhyve/kbdlayout/gr
new file mode 100644
index 000000000000..cba917509594
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/gr
@@ -0,0 +1,9 @@
+# bhyve ps2kbd keyboard layout file
+# (gr : Greek (104 keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'*',0xb7; * (0x2a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/gr_101_acc b/usr.sbin/bhyve/kbdlayout/gr_101_acc
new file mode 100644
index 000000000000..1a4ef7657f1d
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/gr_101_acc
@@ -0,0 +1,9 @@
+# bhyve ps2kbd keyboard layout file
+# (gr_101_acc : Greek (101 keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'*',0xb7; * (0x2a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/gr_elot_acc b/usr.sbin/bhyve/kbdlayout/gr_elot_acc
new file mode 100644
index 000000000000..2e84a99633dc
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/gr_elot_acc
@@ -0,0 +1,17 @@
+# bhyve ps2kbd keyboard layout file
+# (gr_elot_acc : Greek ELOT)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'#',0x5d; # (0x23)
+''',0x0e; ' (0x27)
+'*',0xb7; * (0x2a)
+'/',0x52; / (0x2f)
+'@',0x52; @ (0x40)
+'\',0x61; \ (0x5c)
+'|',0x61; | (0x7c)
+'~',0x5d; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/hr b/usr.sbin/bhyve/kbdlayout/hr
new file mode 100644
index 000000000000..8ec2e11dcbd3
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/hr
@@ -0,0 +1,36 @@
+# bhyve ps2kbd keyboard layout file
+# (hr : Croatian)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x55; * (0x2a)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x2a; @ (0x40)
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'[',0x2b; [ (0x5b)
+'\',0x15; \ (0x5c)
+']',0x34; ] (0x5d)
+'^',0x26; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x3d; ` (0x60)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+'{',0x32; { (0x7b)
+'|',0x1d; | (0x7c)
+'}',0x31; } (0x7d)
+'~',0x16; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/hu_101 b/usr.sbin/bhyve/kbdlayout/hu_101
new file mode 100644
index 000000000000..00d4176d1bca
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/hu_101
@@ -0,0 +1,9 @@
+# bhyve ps2kbd keyboard layout file
+# (hu_101 : Hungarian (101 keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'*',0xb7; * (0x2a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/hu_102 b/usr.sbin/bhyve/kbdlayout/hu_102
new file mode 100644
index 000000000000..eb9d0ae4e465
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/hu_102
@@ -0,0 +1,41 @@
+# bhyve ps2kbd keyboard layout file
+# (hu_102 : Hungarian (102 keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x25; ! (0x21)
+'"',0x1e; " (0x22)
+'#',0x22; # (0x23)
+'$',0x4c; $ (0x24)
+'&',0x21; & (0x26)
+''',0x16; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x4a; * (0x2a)
+'+',0x26; + (0x2b)
+'-',0x4a; - (0x2d)
+'0',0x0e; 0 (0x30)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x3a; < (0x3c)
+'=',0x3d; = (0x3d)
+'>',0x1a; > (0x3e)
+'?',0x41; ? (0x3f)
+'@',0x2a; @ (0x40)
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'[',0x2b; [ (0x5b)
+'\',0x15; \ (0x5c)
+']',0x34; ] (0x5d)
+'^',0x26; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x3d; ` (0x60)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+'{',0x32; { (0x7b)
+'|',0x1d; | (0x7c)
+'}',0x31; } (0x7d)
+'~',0x16; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/is b/usr.sbin/bhyve/kbdlayout/is
new file mode 100644
index 000000000000..4cfd793f7326
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/is
@@ -0,0 +1,33 @@
+# bhyve ps2kbd keyboard layout file
+# (is : Icelandic)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x5b; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5d; * (0x2a)
+'+',0x5d; + (0x2b)
+'-',0x55; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x5b; ? (0x3f)
+'@',0x15; @ (0x40)
+'[',0x3e; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x0e; ^ (0x5e)
+'_',0x55; _ (0x5f)
+'`',0x5d; ` (0x60)
+'{',0x3d; { (0x7b)
+'|',0x4c; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/is_acc b/usr.sbin/bhyve/kbdlayout/is_acc
new file mode 100644
index 000000000000..f7391b35298f
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/is_acc
@@ -0,0 +1,32 @@
+# bhyve ps2kbd keyboard layout file
+# (is_acc : Icelandic (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x5b; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5d; * (0x2a)
+'+',0x5d; + (0x2b)
+'-',0x55; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x5b; ? (0x3f)
+'@',0x15; @ (0x40)
+'[',0x3e; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x46; ] (0x5d)
+'_',0x55; _ (0x5f)
+'`',0x5d; ` (0x60)
+'{',0x3d; { (0x7b)
+'|',0x4c; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/it b/usr.sbin/bhyve/kbdlayout/it
new file mode 100644
index 000000000000..a286bf8684fa
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/it
@@ -0,0 +1,34 @@
+# bhyve ps2kbd keyboard layout file
+# (it : Italian)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'#',0x52; # (0x23)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x5b; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x15; @ (0x40)
+'[',0x3e; [ (0x5b)
+'\',0x0e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x55; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x4e; ` (0x60)
+'{',0x3d; { (0x7b)
+'|',0x0e; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x55; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/jp b/usr.sbin/bhyve/kbdlayout/jp
new file mode 100644
index 000000000000..550571ea1dfe
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/jp
@@ -0,0 +1,36 @@
+# bhyve ps2kbd keyboard layout file
+# (jp : Japanese 106)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+# Alphabet/Number/Sign Keys ---------------------------------------------------
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x3d; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x52; * (0x2a)
+'+',0x4c; + (0x2b)
+':',0x52; : (0x3a)
+'=',0x4e; = (0x3d)
+'@',0x54; @ (0x40)
+'[',0x5b; [ (0x5b)
+'\',0x51; \ (0x5c)
+']',0x5d; ] (0x5d)
+'^',0x55; ^ (0x5e)
+'_',0x51; _ (0x5f)
+'`',0x54; ` (0x60)
+'{',0x5b; { (0x7b)
+'|',0x6a; | (0x7c)
+'}',0x5d; } (0x7d)
+'~',0x55; ~ (0x7e)
+
+# Language Specific Keys ------------------------------------------------------
+0xff2a,0x0e; Hankaku/Zenkaku|Kanji
+0xffe5,0x58; CapsLock
+0xff22,0x67; Muhenkan
+0xff23,0x64; Henkan_Mode
+0xff27,0x13; Katakana-Hiragana/RomaJi
+
diff --git a/usr.sbin/bhyve/kbdlayout/jp_capsctrl b/usr.sbin/bhyve/kbdlayout/jp_capsctrl
new file mode 100644
index 000000000000..46fd6e154a38
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/jp_capsctrl
@@ -0,0 +1,37 @@
+# bhyve ps2kbd keyboard layout file
+# (jp.capsctrl : Japanese 106x)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+# Alphabet/Number/Sign Keys ---------------------------------------------------
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x3d; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x52; * (0x2a)
+'+',0x4c; + (0x2b)
+':',0x52; : (0x3a)
+'=',0x4e; = (0x3d)
+'@',0x54; @ (0x40)
+'[',0x5b; [ (0x5b)
+'\',0x51; \ (0x5c)
+']',0x5d; ] (0x5d)
+'^',0x55; ^ (0x5e)
+'_',0x51; _ (0x5f)
+'`',0x54; ` (0x60)
+'{',0x5b; { (0x7b)
+'|',0x6a; | (0x7c)
+'}',0x5d; } (0x7d)
+'~',0x55; ~ (0x7e)
+
+# Language Specific Keys ------------------------------------------------------
+0xff2a,0x0e; Hankaku/Zenkaku|Kanji
+0xffe5,0x58; CapsLock
+0xff22,0x67; Muhenkan
+0xff23,0x64; Henkan_Mode
+0xff27,0x13; Katakana-Hiragana/RomaJi
+0xffe3,0x58; Left control
+
diff --git a/usr.sbin/bhyve/kbdlayout/kz_io b/usr.sbin/bhyve/kbdlayout/kz_io
new file mode 100644
index 000000000000..c158028e0ad5
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/kz_io
@@ -0,0 +1,11 @@
+# bhyve ps2kbd keyboard layout file
+# (kz_io : Kazakh)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x82; " (0x22)
+'(',0xa9; ( (0x28)
+'*',0xb7; * (0x2a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/kz_kst b/usr.sbin/bhyve/kbdlayout/kz_kst
new file mode 100644
index 000000000000..7c1281a7dc4d
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/kz_kst
@@ -0,0 +1,11 @@
+# bhyve ps2kbd keyboard layout file
+# (kz_kst : Kazakh)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x82; " (0x22)
+'(',0xa9; ( (0x28)
+'*',0xb7; * (0x2a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/latinamerican b/usr.sbin/bhyve/kbdlayout/latinamerican
new file mode 100644
index 000000000000..ac2920ab4af7
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/latinamerican
@@ -0,0 +1,33 @@
+# bhyve ps2kbd keyboard layout file
+# (latinamerican : Latin American)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x5b; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x15; @ (0x40)
+'[',0x52; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x5d; ] (0x5d)
+'^',0x52; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x5d; ` (0x60)
+'{',0x52; { (0x7b)
+'|',0x0e; | (0x7c)
+'}',0x5d; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/latinamerican_acc b/usr.sbin/bhyve/kbdlayout/latinamerican_acc
new file mode 100644
index 000000000000..7fd97dc3dba8
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/latinamerican_acc
@@ -0,0 +1,31 @@
+# bhyve ps2kbd keyboard layout file
+# (latinamerican_acc : Latin American (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x5b; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x15; @ (0x40)
+'[',0x52; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x5d; ] (0x5d)
+'_',0x4a; _ (0x5f)
+'{',0x52; { (0x7b)
+'|',0x0e; | (0x7c)
+'}',0x5d; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/lt b/usr.sbin/bhyve/kbdlayout/lt
new file mode 100644
index 000000000000..114d0624dfe2
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/lt
@@ -0,0 +1,10 @@
+# bhyve ps2kbd keyboard layout file
+# (lt : Lithuanian Ukrainian (with Russian) (shift))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'*',0xb7; * (0x2a)
+0xffea,0x61; Right alt
+
diff --git a/usr.sbin/bhyve/kbdlayout/nl b/usr.sbin/bhyve/kbdlayout/nl
new file mode 100644
index 000000000000..f715494337e4
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/nl
@@ -0,0 +1,31 @@
+# bhyve ps2kbd keyboard layout file
+# (nl : Dutch (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x45; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5b; * (0x2a)
+'+',0x4c; + (0x2b)
+'-',0x4a; - (0x2d)
+'/',0x4e; / (0x2f)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x5d; < (0x3c)
+'=',0x4a; = (0x3d)
+'>',0x5d; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x0e; @ (0x40)
+'[',0x61; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x61; ] (0x5d)
+'_',0x3d; _ (0x5f)
+'{',0x3e; { (0x7b)
+'|',0x5b; | (0x7c)
+'}',0x46; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/no b/usr.sbin/bhyve/kbdlayout/no
new file mode 100644
index 000000000000..bd2620631616
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/no
@@ -0,0 +1,32 @@
+# bhyve ps2kbd keyboard layout file
+# (no : Norwegian)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x5d; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5d; * (0x2a)
+'+',0x4e; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'[',0x3e; [ (0x5b)
+'\',0x55; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x5b; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x55; ` (0x60)
+'{',0x3d; { (0x7b)
+'|',0x0e; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/no_dvorak b/usr.sbin/bhyve/kbdlayout/no_dvorak
new file mode 100644
index 000000000000..f4197864590e
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/no_dvorak
@@ -0,0 +1,81 @@
+# bhyve ps2kbd keyboard layout file
+# (no_dvorak : Norwegian dvorak)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x54; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x54; * (0x2a)
+'+',0x4e; + (0x2b)
+',',0x1d; , (0x2c)
+'-',0x52; - (0x2d)
+'.',0x24; . (0x2e)
+':',0x24; : (0x3a)
+';',0x1d; ; (0x3b)
+'<',0x5d; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x5d; > (0x3e)
+'?',0x4e; ? (0x3f)
+'B',0x31; B (0x42)
+'C',0x43; C (0x43)
+'D',0x33; D (0x44)
+'E',0x23; E (0x45)
+'F',0x35; F (0x46)
+'G',0x3c; G (0x47)
+'H',0x3b; H (0x48)
+'I',0x34; I (0x49)
+'J',0x21; J (0x4a)
+'K',0x2a; K (0x4b)
+'L',0x4d; L (0x4c)
+'N',0x4b; N (0x4e)
+'O',0x1b; O (0x4f)
+'P',0x2d; P (0x50)
+'Q',0x22; Q (0x51)
+'R',0x44; R (0x52)
+'S',0x4c; S (0x53)
+'T',0x42; T (0x54)
+'U',0x2b; U (0x55)
+'V',0x49; V (0x56)
+'W',0x41; W (0x57)
+'X',0x32; X (0x58)
+'Y',0x2c; Y (0x59)
+'Z',0x4a; Z (0x5a)
+'[',0x3e; [ (0x5b)
+'\',0x55; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x5b; ^ (0x5e)
+'_',0x52; _ (0x5f)
+'`',0x55; ` (0x60)
+'b',0x31; b (0x62)
+'c',0x43; c (0x63)
+'d',0x33; d (0x64)
+'e',0x23; e (0x65)
+'f',0x35; f (0x66)
+'g',0x3c; g (0x67)
+'h',0x3b; h (0x68)
+'i',0x34; i (0x69)
+'j',0x21; j (0x6a)
+'k',0x2a; k (0x6b)
+'l',0x4d; l (0x6c)
+'n',0x4b; n (0x6e)
+'o',0x1b; o (0x6f)
+'p',0x2d; p (0x70)
+'q',0x22; q (0x71)
+'r',0x44; r (0x72)
+'s',0x4c; s (0x73)
+'t',0x42; t (0x74)
+'u',0x2b; u (0x75)
+'v',0x49; v (0x76)
+'w',0x41; w (0x77)
+'x',0x32; x (0x78)
+'y',0x2c; y (0x79)
+'z',0x4a; z (0x7a)
+'{',0x3d; { (0x7b)
+'|',0x0e; | (0x7c)
+'}',0x45; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/nordic_asus-eee b/usr.sbin/bhyve/kbdlayout/nordic_asus-eee
new file mode 100644
index 000000000000..c0fb79ca4fdd
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/nordic_asus-eee
@@ -0,0 +1,32 @@
+# bhyve ps2kbd keyboard layout file
+# (nordic_asus-eee : Nordic layout on Asus eeePC)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x5d; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5d; * (0x2a)
+'+',0x4e; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'[',0x3e; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x5b; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x55; ` (0x60)
+'{',0x3d; { (0x7b)
+'|',0x4c; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/pl_dvorak b/usr.sbin/bhyve/kbdlayout/pl_dvorak
new file mode 100644
index 000000000000..4162839eb89d
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/pl_dvorak
@@ -0,0 +1,74 @@
+# bhyve ps2kbd keyboard layout file
+# (pl_dvorak : Polish Dvorak)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x15; " (0x22)
+''',0x15; ' (0x27)
+'+',0x5b; + (0x2b)
+',',0x1d; , (0x2c)
+'-',0x52; - (0x2d)
+'.',0x24; . (0x2e)
+'/',0x54; / (0x2f)
+':',0x1a; : (0x3a)
+';',0x1a; ; (0x3b)
+'<',0x1d; < (0x3c)
+'=',0x5b; = (0x3d)
+'>',0x24; > (0x3e)
+'?',0x54; ? (0x3f)
+'B',0x31; B (0x42)
+'C',0x43; C (0x43)
+'D',0x33; D (0x44)
+'E',0x23; E (0x45)
+'F',0x35; F (0x46)
+'G',0x3c; G (0x47)
+'H',0x3b; H (0x48)
+'I',0x34; I (0x49)
+'J',0x21; J (0x4a)
+'K',0x2a; K (0x4b)
+'L',0x4d; L (0x4c)
+'N',0x4b; N (0x4e)
+'O',0x1b; O (0x4f)
+'P',0x2d; P (0x50)
+'Q',0x22; Q (0x51)
+'R',0x44; R (0x52)
+'S',0x4c; S (0x53)
+'T',0x42; T (0x54)
+'U',0x2b; U (0x55)
+'V',0x49; V (0x56)
+'W',0x41; W (0x57)
+'X',0x32; X (0x58)
+'Y',0x2c; Y (0x59)
+'Z',0x4a; Z (0x5a)
+'[',0x4e; [ (0x5b)
+']',0x55; ] (0x5d)
+'_',0x52; _ (0x5f)
+'b',0x31; b (0x62)
+'c',0x43; c (0x63)
+'d',0x33; d (0x64)
+'e',0x23; e (0x65)
+'f',0x35; f (0x66)
+'g',0x3c; g (0x67)
+'h',0x3b; h (0x68)
+'i',0x34; i (0x69)
+'j',0x21; j (0x6a)
+'k',0x2a; k (0x6b)
+'l',0x4d; l (0x6c)
+'n',0x4b; n (0x6e)
+'o',0x1b; o (0x6f)
+'p',0x2d; p (0x70)
+'q',0x22; q (0x71)
+'r',0x44; r (0x72)
+'s',0x4c; s (0x73)
+'t',0x42; t (0x74)
+'u',0x2b; u (0x75)
+'v',0x49; v (0x76)
+'w',0x41; w (0x77)
+'x',0x32; x (0x78)
+'y',0x2c; y (0x79)
+'z',0x4a; z (0x7a)
+'{',0x4e; { (0x7b)
+'}',0x55; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/pt b/usr.sbin/bhyve/kbdlayout/pt
new file mode 100644
index 000000000000..9ca6dc125a6b
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/pt
@@ -0,0 +1,31 @@
+# bhyve ps2kbd keyboard layout file
+# (pt : Portuguese)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x54; * (0x2a)
+'+',0x54; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'[',0x3e; [ (0x5b)
+'\',0x0e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x5d; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x5b; ` (0x60)
+'{',0x3d; { (0x7b)
+'|',0x0e; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x5d; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/pt_acc b/usr.sbin/bhyve/kbdlayout/pt_acc
new file mode 100644
index 000000000000..85ca7485afa9
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/pt_acc
@@ -0,0 +1,28 @@
+# bhyve ps2kbd keyboard layout file
+# (pt_acc : Portuguese (accent keys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x54; * (0x2a)
+'+',0x54; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'[',0x3e; [ (0x5b)
+'\',0x0e; \ (0x5c)
+']',0x46; ] (0x5d)
+'_',0x4a; _ (0x5f)
+'{',0x3d; { (0x7b)
+'|',0x0e; | (0x7c)
+'}',0x45; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/ru b/usr.sbin/bhyve/kbdlayout/ru
new file mode 100644
index 000000000000..32bcf88dcf79
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/ru
@@ -0,0 +1,14 @@
+# bhyve ps2kbd keyboard layout file
+# (ru : Russian)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x82; ! (0x21)
+'"',0x00; " (0x22)
+'(',0x8a; ( (0x28)
+')',0x8b; ) (0x29)
+'*',0x85; * (0x2a)
+':',0x86; : (0x3a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/ru_shift b/usr.sbin/bhyve/kbdlayout/ru_shift
new file mode 100644
index 000000000000..1edc9310d2b0
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/ru_shift
@@ -0,0 +1,9 @@
+# bhyve ps2kbd keyboard layout file
+# (ru_shift : Russian (shift))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'*',0xb7; * (0x2a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/ru_win b/usr.sbin/bhyve/kbdlayout/ru_win
new file mode 100644
index 000000000000..04b2775bf79f
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/ru_win
@@ -0,0 +1,9 @@
+# bhyve ps2kbd keyboard layout file
+# (ru_win : Russian (winkeys))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'*',0xb7; * (0x2a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/se b/usr.sbin/bhyve/kbdlayout/se
new file mode 100644
index 000000000000..afd0aca06cd9
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/se
@@ -0,0 +1,32 @@
+# bhyve ps2kbd keyboard layout file
+# (se : Swedish)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x5d; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x5d; * (0x2a)
+'+',0x4e; + (0x2b)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'[',0x3e; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x5b; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x55; ` (0x60)
+'{',0x3d; { (0x7b)
+'|',0x4c; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/si b/usr.sbin/bhyve/kbdlayout/si
new file mode 100644
index 000000000000..4c3f119e0351
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/si
@@ -0,0 +1,36 @@
+# bhyve ps2kbd keyboard layout file
+# (si : Slovenian)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x4e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x55; * (0x2a)
+'-',0x4a; - (0x2d)
+':',0x49; : (0x3a)
+';',0x41; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x2a; @ (0x40)
+'Y',0x1a; Y (0x59)
+'Z',0x35; Z (0x5a)
+'[',0x2b; [ (0x5b)
+'\',0x15; \ (0x5c)
+']',0x34; ] (0x5d)
+'^',0x26; ^ (0x5e)
+'_',0x4a; _ (0x5f)
+'`',0x3d; ` (0x60)
+'y',0x1a; y (0x79)
+'z',0x35; z (0x7a)
+'{',0x32; { (0x7b)
+'|',0x1d; | (0x7c)
+'}',0x31; } (0x7d)
+'~',0x16; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/tr b/usr.sbin/bhyve/kbdlayout/tr
new file mode 100644
index 000000000000..5c80df6b5067
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/tr
@@ -0,0 +1,36 @@
+# bhyve ps2kbd keyboard layout file
+# (tr : Turkish (Q))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x0e; " (0x22)
+'&',0x36; & (0x26)
+''',0x1e; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x4e; * (0x2a)
+'+',0x25; + (0x2b)
+',',0x5d; , (0x2c)
+'-',0x55; - (0x2d)
+'.',0x4a; . (0x2e)
+':',0x4a; : (0x3a)
+';',0x5d; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x15; @ (0x40)
+'[',0x3e; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x26; ^ (0x5e)
+'_',0x55; _ (0x5f)
+'`',0x5d; ` (0x60)
+'i',0x52; i (0x69)
+'{',0x3d; { (0x7b)
+'|',0x61; | (0x7c)
+'}',0x45; } (0x7d)
+'~',0x5b; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/tr_f b/usr.sbin/bhyve/kbdlayout/tr_f
new file mode 100644
index 000000000000..9f4fe1512b48
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/tr_f
@@ -0,0 +1,81 @@
+# bhyve ps2kbd keyboard layout file
+# (tr_f : Turkish (F))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'&',0x36; & (0x26)
+''',0x3d; ' (0x27)
+'(',0x3e; ( (0x28)
+')',0x46; ) (0x29)
+'*',0x0e; * (0x2a)
+'+',0x0e; + (0x2b)
+',',0x4a; , (0x2c)
+'-',0x55; - (0x2d)
+'/',0x4e; / (0x2f)
+':',0x49; : (0x3a)
+';',0x4a; ; (0x3b)
+'<',0x61; < (0x3c)
+'=',0x45; = (0x3d)
+'>',0x61; > (0x3e)
+'?',0x4e; ? (0x3f)
+'@',0x15; @ (0x40)
+'A',0x2b; A (0x41)
+'B',0x41; B (0x42)
+'C',0x2a; C (0x43)
+'D',0x35; D (0x44)
+'E',0x23; E (0x45)
+'F',0x15; F (0x46)
+'G',0x1d; G (0x47)
+'H',0x44; H (0x48)
+'I',0x2d; I (0x49)
+'J',0x1a; J (0x4a)
+'K',0x3b; K (0x4b)
+'M',0x42; M (0x4d)
+'N',0x43; N (0x4e)
+'O',0x2c; O (0x4f)
+'Q',0x54; Q (0x51)
+'R',0x3c; R (0x52)
+'S',0x3a; S (0x53)
+'T',0x33; T (0x54)
+'U',0x1c; U (0x55)
+'V',0x21; V (0x56)
+'W',0x5b; W (0x57)
+'X',0x5d; X (0x58)
+'Y',0x4c; Y (0x59)
+'Z',0x31; Z (0x5a)
+'[',0x3e; [ (0x5b)
+'\',0x4e; \ (0x5c)
+']',0x46; ] (0x5d)
+'^',0x26; ^ (0x5e)
+'_',0x55; _ (0x5f)
+'a',0x2b; a (0x61)
+'b',0x41; b (0x62)
+'c',0x2a; c (0x63)
+'d',0x35; d (0x64)
+'e',0x23; e (0x65)
+'f',0x15; f (0x66)
+'g',0x1d; g (0x67)
+'h',0x44; h (0x68)
+'i',0x1b; i (0x69)
+'j',0x1a; j (0x6a)
+'k',0x3b; k (0x6b)
+'m',0x42; m (0x6d)
+'n',0x43; n (0x6e)
+'o',0x2c; o (0x6f)
+'q',0x54; q (0x71)
+'r',0x3c; r (0x72)
+'s',0x3a; s (0x73)
+'t',0x33; t (0x74)
+'u',0x1c; u (0x75)
+'v',0x21; v (0x76)
+'w',0x5b; w (0x77)
+'x',0x5d; x (0x78)
+'y',0x4c; y (0x79)
+'z',0x31; z (0x7a)
+'{',0x3d; { (0x7b)
+'|',0x55; | (0x7c)
+'}',0x45; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/ua b/usr.sbin/bhyve/kbdlayout/ua
new file mode 100644
index 000000000000..683b39c5053b
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/ua
@@ -0,0 +1,9 @@
+# bhyve ps2kbd keyboard layout file
+# (ua : Ukrainian)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'*',0xb7; * (0x2a)
+
diff --git a/usr.sbin/bhyve/kbdlayout/ua_shift_alt b/usr.sbin/bhyve/kbdlayout/ua_shift_alt
new file mode 100644
index 000000000000..be5d7041078f
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/ua_shift_alt
@@ -0,0 +1,10 @@
+# bhyve ps2kbd keyboard layout file
+# (ua_shift_alt : Ukrainian (with Russian) (shift))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'*',0xb7; * (0x2a)
+0xffb5,0x71; Keypad 5
+
diff --git a/usr.sbin/bhyve/kbdlayout/uk b/usr.sbin/bhyve/kbdlayout/uk
new file mode 100644
index 000000000000..25289fa6d255
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/uk
@@ -0,0 +1,14 @@
+# bhyve ps2kbd keyboard layout file
+# (uk : United Kingdom)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'#',0x5d; # (0x23)
+'@',0x52; @ (0x40)
+'\',0x61; \ (0x5c)
+'|',0x61; | (0x7c)
+'~',0x5d; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/uk_capsctrl b/usr.sbin/bhyve/kbdlayout/uk_capsctrl
new file mode 100644
index 000000000000..8b869bf88308
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/uk_capsctrl
@@ -0,0 +1,14 @@
+# bhyve ps2kbd keyboard layout file
+# (uk_capsctrl : United Kingdom (Caps Lock acts as Left Ctrl))
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'#',0x5d; # (0x23)
+'@',0x52; @ (0x40)
+'\',0x61; \ (0x5c)
+'|',0x61; | (0x7c)
+'~',0x5d; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/uk_dvorak b/usr.sbin/bhyve/kbdlayout/uk_dvorak
new file mode 100644
index 000000000000..0b365b7ead4d
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/uk_dvorak
@@ -0,0 +1,78 @@
+# bhyve ps2kbd keyboard layout file
+# (uk_dvorak : United Kingdom Dvorak)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x1e; " (0x22)
+'#',0x5d; # (0x23)
+''',0x15; ' (0x27)
+'+',0x5b; + (0x2b)
+',',0x1d; , (0x2c)
+'-',0x52; - (0x2d)
+'.',0x24; . (0x2e)
+'/',0x54; / (0x2f)
+':',0x1a; : (0x3a)
+';',0x1a; ; (0x3b)
+'<',0x1d; < (0x3c)
+'=',0x5b; = (0x3d)
+'>',0x24; > (0x3e)
+'?',0x54; ? (0x3f)
+'@',0x15; @ (0x40)
+'B',0x31; B (0x42)
+'C',0x43; C (0x43)
+'D',0x33; D (0x44)
+'E',0x23; E (0x45)
+'F',0x35; F (0x46)
+'G',0x3c; G (0x47)
+'H',0x3b; H (0x48)
+'I',0x34; I (0x49)
+'J',0x21; J (0x4a)
+'K',0x2a; K (0x4b)
+'L',0x4d; L (0x4c)
+'N',0x4b; N (0x4e)
+'O',0x1b; O (0x4f)
+'P',0x2d; P (0x50)
+'Q',0x22; Q (0x51)
+'R',0x44; R (0x52)
+'S',0x4c; S (0x53)
+'T',0x42; T (0x54)
+'U',0x2b; U (0x55)
+'V',0x49; V (0x56)
+'W',0x41; W (0x57)
+'X',0x32; X (0x58)
+'Y',0x2c; Y (0x59)
+'Z',0x4a; Z (0x5a)
+'[',0x4e; [ (0x5b)
+'\',0x61; \ (0x5c)
+']',0x55; ] (0x5d)
+'_',0x52; _ (0x5f)
+'b',0x31; b (0x62)
+'c',0x43; c (0x63)
+'d',0x33; d (0x64)
+'e',0x23; e (0x65)
+'f',0x35; f (0x66)
+'g',0x3c; g (0x67)
+'h',0x3b; h (0x68)
+'i',0x34; i (0x69)
+'j',0x21; j (0x6a)
+'k',0x2a; k (0x6b)
+'l',0x4d; l (0x6c)
+'n',0x4b; n (0x6e)
+'o',0x1b; o (0x6f)
+'p',0x2d; p (0x70)
+'q',0x22; q (0x71)
+'r',0x44; r (0x72)
+'s',0x4c; s (0x73)
+'t',0x42; t (0x74)
+'u',0x2b; u (0x75)
+'v',0x49; v (0x76)
+'w',0x41; w (0x77)
+'x',0x32; x (0x78)
+'y',0x2c; y (0x79)
+'z',0x4a; z (0x7a)
+'{',0x4e; { (0x7b)
+'|',0x61; | (0x7c)
+'}',0x55; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/uk_macbook b/usr.sbin/bhyve/kbdlayout/uk_macbook
new file mode 100644
index 000000000000..6283842afa5e
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/uk_macbook
@@ -0,0 +1,10 @@
+# bhyve ps2kbd keyboard layout file
+# (uk_macbook : United Kingdom Macbook)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'`',0x61; ` (0x60)
+'~',0x61; ~ (0x7e)
+
diff --git a/usr.sbin/bhyve/kbdlayout/us_dvorak b/usr.sbin/bhyve/kbdlayout/us_dvorak
new file mode 100644
index 000000000000..6fa21a2bca75
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/us_dvorak
@@ -0,0 +1,74 @@
+# bhyve ps2kbd keyboard layout file
+# (us_dvorak : United States of America dvorak)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x15; " (0x22)
+''',0x15; ' (0x27)
+'+',0x5b; + (0x2b)
+',',0x1d; , (0x2c)
+'-',0x52; - (0x2d)
+'.',0x24; . (0x2e)
+'/',0x54; / (0x2f)
+':',0x1a; : (0x3a)
+';',0x1a; ; (0x3b)
+'<',0x1d; < (0x3c)
+'=',0x5b; = (0x3d)
+'>',0x24; > (0x3e)
+'?',0x54; ? (0x3f)
+'B',0x31; B (0x42)
+'C',0x43; C (0x43)
+'D',0x33; D (0x44)
+'E',0x23; E (0x45)
+'F',0x35; F (0x46)
+'G',0x3c; G (0x47)
+'H',0x3b; H (0x48)
+'I',0x34; I (0x49)
+'J',0x21; J (0x4a)
+'K',0x2a; K (0x4b)
+'L',0x4d; L (0x4c)
+'N',0x4b; N (0x4e)
+'O',0x1b; O (0x4f)
+'P',0x2d; P (0x50)
+'Q',0x22; Q (0x51)
+'R',0x44; R (0x52)
+'S',0x4c; S (0x53)
+'T',0x42; T (0x54)
+'U',0x2b; U (0x55)
+'V',0x49; V (0x56)
+'W',0x41; W (0x57)
+'X',0x32; X (0x58)
+'Y',0x2c; Y (0x59)
+'Z',0x4a; Z (0x5a)
+'[',0x4e; [ (0x5b)
+']',0x55; ] (0x5d)
+'_',0x52; _ (0x5f)
+'b',0x31; b (0x62)
+'c',0x43; c (0x63)
+'d',0x33; d (0x64)
+'e',0x23; e (0x65)
+'f',0x35; f (0x66)
+'g',0x3c; g (0x67)
+'h',0x3b; h (0x68)
+'i',0x34; i (0x69)
+'j',0x21; j (0x6a)
+'k',0x2a; k (0x6b)
+'l',0x4d; l (0x6c)
+'n',0x4b; n (0x6e)
+'o',0x1b; o (0x6f)
+'p',0x2d; p (0x70)
+'q',0x22; q (0x71)
+'r',0x44; r (0x72)
+'s',0x4c; s (0x73)
+'t',0x42; t (0x74)
+'u',0x2b; u (0x75)
+'v',0x49; v (0x76)
+'w',0x41; w (0x77)
+'x',0x32; x (0x78)
+'y',0x2c; y (0x79)
+'z',0x4a; z (0x7a)
+'{',0x4e; { (0x7b)
+'}',0x55; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/us_dvorakl b/usr.sbin/bhyve/kbdlayout/us_dvorakl
new file mode 100644
index 000000000000..38e6857f69ab
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/us_dvorakl
@@ -0,0 +1,88 @@
+# bhyve ps2kbd keyboard layout file
+# (us_dvorakl : United States of America lefthand dvorak)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x55; ! (0x21)
+'"',0x1a; " (0x22)
+'#',0x45; # (0x23)
+'$',0x46; $ (0x24)
+'%',0x54; % (0x25)
+'&',0x52; & (0x26)
+''',0x1a; ' (0x27)
+'(',0x4a; ( (0x28)
+')',0x49; ) (0x29)
+'*',0x4c; * (0x2a)
+'+',0x5b; + (0x2b)
+'-',0x1c; - (0x2d)
+'.',0x44; . (0x2e)
+'/',0x26; / (0x2f)
+'0',0x49; 0 (0x30)
+'1',0x55; 1 (0x31)
+'2',0x4e; 2 (0x32)
+'3',0x45; 3 (0x33)
+'4',0x46; 4 (0x34)
+'5',0x54; 5 (0x35)
+'6',0x4d; 6 (0x36)
+'7',0x52; 7 (0x37)
+'8',0x4c; 8 (0x38)
+'9',0x4a; 9 (0x39)
+':',0x15; : (0x3a)
+';',0x15; ; (0x3b)
+'=',0x5b; = (0x3d)
+'>',0x44; > (0x3e)
+'?',0x26; ? (0x3f)
+'@',0x4e; @ (0x40)
+'A',0x42; A (0x41)
+'B',0x24; B (0x42)
+'C',0x23; C (0x43)
+'D',0x2b; D (0x44)
+'E',0x3b; E (0x45)
+'F',0x2e; F (0x46)
+'G',0x21; G (0x47)
+'I',0x3a; I (0x49)
+'J',0x3e; J (0x4a)
+'K',0x1b; K (0x4b)
+'L',0x3d; L (0x4c)
+'M',0x36; M (0x4d)
+'O',0x43; O (0x4f)
+'P',0x25; P (0x50)
+'Q',0x1d; Q (0x51)
+'R',0x3c; R (0x52)
+'S',0x35; S (0x53)
+'T',0x34; T (0x54)
+'U',0x2c; U (0x55)
+'W',0x32; W (0x57)
+'Y',0x2d; Y (0x59)
+'Z',0x4b; Z (0x5a)
+'[',0x16; [ (0x5b)
+']',0x1e; ] (0x5d)
+'^',0x4d; ^ (0x5e)
+'_',0x1c; _ (0x5f)
+'a',0x42; a (0x61)
+'b',0x24; b (0x62)
+'c',0x23; c (0x63)
+'d',0x2b; d (0x64)
+'e',0x3b; e (0x65)
+'f',0x2e; f (0x66)
+'g',0x21; g (0x67)
+'i',0x3a; i (0x69)
+'j',0x3e; j (0x6a)
+'k',0x1b; k (0x6b)
+'l',0x3d; l (0x6c)
+'m',0x36; m (0x6d)
+'o',0x43; o (0x6f)
+'p',0x25; p (0x70)
+'q',0x1d; q (0x71)
+'r',0x3c; r (0x72)
+'s',0x35; s (0x73)
+'t',0x34; t (0x74)
+'u',0x2c; u (0x75)
+'w',0x32; w (0x77)
+'y',0x2d; y (0x79)
+'z',0x4b; z (0x7a)
+'{',0x16; { (0x7b)
+'}',0x1e; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/us_dvorakp b/usr.sbin/bhyve/kbdlayout/us_dvorakp
new file mode 100644
index 000000000000..c66c9d5e4b03
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/us_dvorakp
@@ -0,0 +1,95 @@
+# bhyve ps2kbd keyboard layout file
+# (us_dvorakp : United States of America Programmer Dvorak)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'!',0x4e; ! (0x21)
+'"',0x1a; " (0x22)
+'#',0x55; # (0x23)
+'$',0x0e; $ (0x24)
+'%',0x16; % (0x25)
+'&',0x16; & (0x26)
+''',0x1a; ' (0x27)
+'(',0x2e; ( (0x28)
+')',0x3e; ) (0x29)
+'*',0x3d; * (0x2a)
+'+',0x46; + (0x2b)
+',',0x1d; , (0x2c)
+'-',0x52; - (0x2d)
+'.',0x24; . (0x2e)
+'/',0x54; / (0x2f)
+'0',0x3d; 0 (0x30)
+'1',0x2e; 1 (0x31)
+'2',0x3e; 2 (0x32)
+'3',0x25; 3 (0x33)
+'4',0x46; 4 (0x34)
+'5',0x26; 5 (0x35)
+'6',0x45; 6 (0x36)
+'7',0x1e; 7 (0x37)
+'8',0x4e; 8 (0x38)
+'9',0x36; 9 (0x39)
+':',0x15; : (0x3a)
+';',0x15; ; (0x3b)
+'<',0x1d; < (0x3c)
+'=',0x36; = (0x3d)
+'>',0x24; > (0x3e)
+'?',0x54; ? (0x3f)
+'@',0x5b; @ (0x40)
+'B',0x31; B (0x42)
+'C',0x43; C (0x43)
+'D',0x33; D (0x44)
+'E',0x23; E (0x45)
+'F',0x35; F (0x46)
+'G',0x3c; G (0x47)
+'H',0x3b; H (0x48)
+'I',0x34; I (0x49)
+'J',0x21; J (0x4a)
+'K',0x2a; K (0x4b)
+'L',0x4d; L (0x4c)
+'N',0x4b; N (0x4e)
+'O',0x1b; O (0x4f)
+'P',0x2d; P (0x50)
+'Q',0x22; Q (0x51)
+'R',0x44; R (0x52)
+'S',0x4c; S (0x53)
+'T',0x42; T (0x54)
+'U',0x2b; U (0x55)
+'V',0x49; V (0x56)
+'W',0x41; W (0x57)
+'X',0x32; X (0x58)
+'Y',0x2c; Y (0x59)
+'Z',0x4a; Z (0x5a)
+'[',0x1e; [ (0x5b)
+']',0x45; ] (0x5d)
+'^',0x5b; ^ (0x5e)
+'_',0x52; _ (0x5f)
+'`',0x55; ` (0x60)
+'b',0x31; b (0x62)
+'c',0x43; c (0x63)
+'d',0x33; d (0x64)
+'e',0x23; e (0x65)
+'f',0x35; f (0x66)
+'g',0x3c; g (0x67)
+'h',0x3b; h (0x68)
+'i',0x34; i (0x69)
+'j',0x21; j (0x6a)
+'k',0x2a; k (0x6b)
+'l',0x4d; l (0x6c)
+'n',0x4b; n (0x6e)
+'o',0x1b; o (0x6f)
+'p',0x2d; p (0x70)
+'q',0x22; q (0x71)
+'r',0x44; r (0x72)
+'s',0x4c; s (0x73)
+'t',0x42; t (0x74)
+'u',0x2b; u (0x75)
+'v',0x49; v (0x76)
+'w',0x41; w (0x77)
+'x',0x32; x (0x78)
+'y',0x2c; y (0x79)
+'z',0x4a; z (0x7a)
+'{',0x26; { (0x7b)
+'}',0x25; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/us_dvorakr b/usr.sbin/bhyve/kbdlayout/us_dvorakr
new file mode 100644
index 000000000000..95485730c460
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/us_dvorakr
@@ -0,0 +1,86 @@
+# bhyve ps2kbd keyboard layout file
+# (us_dvorakr : United States of America righthand dvorak)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x4a; " (0x22)
+'%',0x15; % (0x25)
+'&',0x1c; & (0x26)
+''',0x4a; ' (0x27)
+'(',0x1a; ( (0x28)
+')',0x22; ) (0x29)
+'*',0x1b; * (0x2a)
+'+',0x5b; + (0x2b)
+',',0x2a; , (0x2c)
+'-',0x52; - (0x2d)
+'.',0x2d; . (0x2e)
+'/',0x45; / (0x2f)
+'0',0x22; 0 (0x30)
+'5',0x15; 5 (0x35)
+'6',0x1d; 6 (0x36)
+'7',0x1c; 7 (0x37)
+'8',0x1b; 8 (0x38)
+'9',0x1a; 9 (0x39)
+':',0x54; : (0x3a)
+';',0x54; ; (0x3b)
+'<',0x2a; < (0x3c)
+'=',0x5b; = (0x3d)
+'>',0x2d; > (0x3e)
+'?',0x45; ? (0x3f)
+'A',0x2b; A (0x41)
+'B',0x4d; B (0x42)
+'C',0x4b; C (0x43)
+'D',0x42; D (0x44)
+'E',0x34; E (0x45)
+'F',0x3e; F (0x46)
+'G',0x49; G (0x47)
+'I',0x32; I (0x49)
+'J',0x2e; J (0x4a)
+'K',0x4c; K (0x4b)
+'L',0x36; L (0x4c)
+'M',0x3d; M (0x4d)
+'O',0x2c; O (0x4f)
+'P',0x46; P (0x50)
+'Q',0x24; Q (0x51)
+'R',0x35; R (0x52)
+'S',0x3c; S (0x53)
+'T',0x3b; T (0x54)
+'U',0x43; U (0x55)
+'V',0x41; V (0x56)
+'W',0x3a; W (0x57)
+'X',0x21; X (0x58)
+'Y',0x44; Y (0x59)
+'Z',0x23; Z (0x5a)
+'[',0x4e; [ (0x5b)
+']',0x55; ] (0x5d)
+'^',0x1d; ^ (0x5e)
+'_',0x52; _ (0x5f)
+'a',0x2b; a (0x61)
+'b',0x4d; b (0x62)
+'c',0x4b; c (0x63)
+'d',0x42; d (0x64)
+'e',0x34; e (0x65)
+'f',0x3e; f (0x66)
+'g',0x49; g (0x67)
+'i',0x32; i (0x69)
+'j',0x2e; j (0x6a)
+'k',0x4c; k (0x6b)
+'l',0x36; l (0x6c)
+'m',0x3d; m (0x6d)
+'o',0x2c; o (0x6f)
+'p',0x46; p (0x70)
+'q',0x24; q (0x71)
+'r',0x35; r (0x72)
+'s',0x3c; s (0x73)
+'t',0x3b; t (0x74)
+'u',0x43; u (0x75)
+'v',0x41; v (0x76)
+'w',0x3a; w (0x77)
+'x',0x21; x (0x78)
+'y',0x44; y (0x79)
+'z',0x23; z (0x7a)
+'{',0x4e; { (0x7b)
+'}',0x55; } (0x7d)
+
diff --git a/usr.sbin/bhyve/kbdlayout/us_dvorakx b/usr.sbin/bhyve/kbdlayout/us_dvorakx
new file mode 100644
index 000000000000..24195875001a
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/us_dvorakx
@@ -0,0 +1,80 @@
+# bhyve ps2kbd keyboard layout file
+# (us_dvorakx : United States of America dvorakx)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'"',0x15; " (0x22)
+''',0x15; ' (0x27)
+'+',0x5d; + (0x2b)
+',',0x1d; , (0x2c)
+'-',0x52; - (0x2d)
+'.',0x24; . (0x2e)
+'/',0x54; / (0x2f)
+':',0x1a; : (0x3a)
+';',0x1a; ; (0x3b)
+'<',0x1d; < (0x3c)
+'=',0x5d; = (0x3d)
+'>',0x24; > (0x3e)
+'?',0x54; ? (0x3f)
+'B',0x31; B (0x42)
+'C',0x43; C (0x43)
+'D',0x33; D (0x44)
+'E',0x23; E (0x45)
+'F',0x35; F (0x46)
+'G',0x3c; G (0x47)
+'H',0x3b; H (0x48)
+'I',0x34; I (0x49)
+'J',0x21; J (0x4a)
+'K',0x2a; K (0x4b)
+'L',0x4d; L (0x4c)
+'N',0x4b; N (0x4e)
+'O',0x1b; O (0x4f)
+'P',0x2d; P (0x50)
+'Q',0x22; Q (0x51)
+'R',0x44; R (0x52)
+'S',0x4c; S (0x53)
+'T',0x42; T (0x54)
+'U',0x2b; U (0x55)
+'V',0x49; V (0x56)
+'W',0x41; W (0x57)
+'X',0x32; X (0x58)
+'Y',0x2c; Y (0x59)
+'Z',0x4a; Z (0x5a)
+'[',0x4e; [ (0x5b)
+'\',0x5b; \ (0x5c)
+']',0x55; ] (0x5d)
+'_',0x52; _ (0x5f)
+'`',0x76; ` (0x60)
+'b',0x31; b (0x62)
+'c',0x43; c (0x63)
+'d',0x33; d (0x64)
+'e',0x23; e (0x65)
+'f',0x35; f (0x66)
+'g',0x3c; g (0x67)
+'h',0x3b; h (0x68)
+'i',0x34; i (0x69)
+'j',0x21; j (0x6a)
+'k',0x2a; k (0x6b)
+'l',0x4d; l (0x6c)
+'n',0x4b; n (0x6e)
+'o',0x1b; o (0x6f)
+'p',0x2d; p (0x70)
+'q',0x22; q (0x71)
+'r',0x44; r (0x72)
+'s',0x4c; s (0x73)
+'t',0x42; t (0x74)
+'u',0x2b; u (0x75)
+'v',0x49; v (0x76)
+'w',0x41; w (0x77)
+'x',0x32; x (0x78)
+'y',0x2c; y (0x79)
+'z',0x4a; z (0x7a)
+'{',0x4e; { (0x7b)
+'|',0x5b; | (0x7c)
+'}',0x55; } (0x7d)
+'~',0x76; ~ (0x7e)
+0xff1b,0x0e; Escape
+0xffe3,0x58; Left control
+
diff --git a/usr.sbin/bhyve/kbdlayout/us_emacs b/usr.sbin/bhyve/kbdlayout/us_emacs
new file mode 100644
index 000000000000..01b108583fc3
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/us_emacs
@@ -0,0 +1,9 @@
+# bhyve ps2kbd keyboard layout file
+# (us_emacs : United States of America Emacs optimized layout)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+0xffff,0x66; Del
+
diff --git a/usr.sbin/bhyve/kbdlayout/us_unix b/usr.sbin/bhyve/kbdlayout/us_unix
new file mode 100644
index 000000000000..c4b2739ad194
--- /dev/null
+++ b/usr.sbin/bhyve/kbdlayout/us_unix
@@ -0,0 +1,14 @@
+# bhyve ps2kbd keyboard layout file
+# (us_unix : United States of America Traditional Unix Workstation)
+#
+# Created by: Koine Yuusuke(koinec) <koinec@users.osdn.me>
+#
+# $FreeBSD$
+
+'`',0x76; ` (0x60)
+'~',0x76; ~ (0x7e)
+0xff08,0x71; Back space
+0xff1b,0x0e; Escape
+0xffe3,0x58; Left control
+0xffff,0x66; Del
+
diff --git a/usr.sbin/bhyve/ps2kbd.c b/usr.sbin/bhyve/ps2kbd.c
index 012c66160ebe..619bed81c412 100644
--- a/usr.sbin/bhyve/ps2kbd.c
+++ b/usr.sbin/bhyve/ps2kbd.c
@@ -31,6 +31,7 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
+#include <sys/stat.h>
#include <machine/vmm_snapshot.h>
@@ -42,9 +43,13 @@ __FBSDID("$FreeBSD$");
#include <strings.h>
#include <pthread.h>
#include <pthread_np.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "bhyverun.h"
#include "atkbdc.h"
#include "debug.h"
+#include "config.h"
#include "console.h"
/* keyboard device commands */
@@ -62,6 +67,10 @@ __FBSDID("$FreeBSD$");
#define PS2KBD_FIFOSZ 16
+#define PS2KBD_LAYOUT_BASEDIR "/usr/share/bhyve/kbdlayout/"
+
+#define MAX_PATHNAME 256
+
struct fifo {
uint8_t buf[PS2KBD_FIFOSZ];
int rindex; /* index to read from */
@@ -90,7 +99,7 @@ struct extended_translation {
/*
* FIXME: Pause/break and Print Screen/SysRq require special handling.
*/
-static const struct extended_translation extended_translations[] = {
+static struct extended_translation extended_translations[128] = {
{0xff08, 0x66}, /* Back space */
{0xff09, 0x0d}, /* Tab */
{0xff0d, 0x5a}, /* Return */
@@ -162,7 +171,7 @@ static const struct extended_translation extended_translations[] = {
};
/* ASCII to type 2 scancode lookup table */
-static const uint8_t ascii_translations[128] = {
+static uint8_t ascii_translations[128] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -340,7 +349,7 @@ ps2kbd_keysym_queue(struct ps2kbd_softc *sc,
assert(pthread_mutex_isowned_np(&sc->mtx));
int e0_prefix, found;
uint8_t code;
- const struct extended_translation *trans;
+ struct extended_translation *trans;
if (keycode) {
code = keyset1to2_translations[(uint8_t)(keycode & 0x7f)];
@@ -396,11 +405,91 @@ ps2kbd_event(int down, uint32_t keysym, uint32_t keycode, void *arg)
atkbdc_event(sc->atkbdc_sc, 1);
}
+static void
+ps2kbd_update_extended_translation(uint32_t keycode, uint32_t scancode, uint32_t prefix)
+{
+ int i = 0;
+
+ do {
+ if (extended_translations[i].keysym == keycode)
+ break;
+ } while(extended_translations[++i].keysym);
+
+ if (i == (sizeof(extended_translations) / sizeof(struct extended_translation) - 1))
+ return;
+
+ if (!extended_translations[i].keysym) {
+ extended_translations[i].keysym = keycode;
+
+ extended_translations[i+1].keysym = 0;
+ extended_translations[i+1].scancode = 0;
+ extended_translations[i+1].flags = 0;
+ }
+
+ extended_translations[i].scancode = (uint8_t)(scancode & 0xff);
+ extended_translations[i].flags = (prefix ? SCANCODE_E0_PREFIX : 0);
+}
+
+static void
+ps2kbd_setkbdlayout(void)
+{
+ int err;
+ int fd;
+ char path[MAX_PATHNAME];
+ char *buf, *next, *line;
+ struct stat sb;
+ size_t sz;
+ uint8_t ascii;
+ uint32_t keycode, scancode, prefix;
+
+ snprintf(path, MAX_PATHNAME, PS2KBD_LAYOUT_BASEDIR"%s", get_config_value("keyboard.layout") );
+
+ err = stat(path, &sb);
+ if (err)
+ return;
+
+ buf = (char *)malloc(sizeof(char) * sb.st_size);
+ if (buf == NULL)
+ return;
+
+ fd = open(path, O_RDONLY);
+ if (fd == -1)
+ goto out;
+
+ sz = read(fd, buf, sb.st_size );
+
+ close(fd);
+
+ if (sz != sb.st_size )
+ goto out;
+
+ next = buf;
+ while ((line = strsep(&next, "\n")) != NULL) {
+ if (sscanf(line, "'%c',%x;", &ascii, &scancode) == 2) {
+ if (ascii < 0x80)
+ ascii_translations[ascii] = (uint8_t)(scancode & 0xff);
+ } else if (sscanf(line, "%x,%x,%x;", &keycode, &scancode, &prefix) == 3 ) {
+ ps2kbd_update_extended_translation(keycode, scancode, prefix);
+ } else if (sscanf(line, "%x,%x;", &keycode, &scancode) == 2) {
+ if (keycode < 0x80)
+ ascii_translations[(uint8_t)(keycode & 0xff)] = (uint8_t)(scancode & 0xff);
+ else
+ ps2kbd_update_extended_translation(keycode, scancode, 0);
+ }
+ }
+
+out:
+ free(buf);
+}
+
struct ps2kbd_softc *
ps2kbd_init(struct atkbdc_softc *atkbdc_sc)
{
struct ps2kbd_softc *sc;
+ if (get_config_value("keyboard.layout") != NULL)
+ ps2kbd_setkbdlayout();
+
sc = calloc(1, sizeof (struct ps2kbd_softc));
pthread_mutex_init(&sc->mtx, NULL);
fifo_init(sc);