summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2021-10-21 20:54:01 +0200
committerEugene Syromyatnikov <evgsyr@gmail.com>2022-08-09 08:32:01 +0200
commit2e94ee40e2f4468318521de5d049b9a4f7c4dbed (patch)
treeb8344c6739d4706359fe29df33e0f0e2ebc0b04b
parent22a68526021b1a5fb3eb202be01af71aaf94b9a8 (diff)
downloadstrace-esyr/fb.tar.gz
Decode FBIO* ioctl commandsesyr/fb
-rw-r--r--src/Makefile.am2
-rw-r--r--src/defs.h2
-rw-r--r--src/fb_ioctl.c333
-rw-r--r--src/fb_mpers_ioctl.c180
-rw-r--r--src/ioctl.c2
-rw-r--r--src/util.c1
-rw-r--r--src/xlat/fb_accel_flags.in1
-rw-r--r--src/xlat/fb_accels.in83
-rw-r--r--src/xlat/fb_activate_flags.in6
-rw-r--r--src/xlat/fb_activate_vals.in4
-rw-r--r--src/xlat/fb_caps.in1
-rw-r--r--src/xlat/fb_ioctl_cmds.in40
-rw-r--r--src/xlat/fb_sync_flags.in6
-rw-r--r--src/xlat/fb_type_aux_text.in11
-rw-r--r--src/xlat/fb_type_aux_vga_planes.in4
-rw-r--r--src/xlat/fb_types.in7
-rw-r--r--src/xlat/fb_vblank_flags.in9
-rw-r--r--src/xlat/fb_visuals.in8
-rw-r--r--src/xlat/fb_vmode_flags.in2
-rw-r--r--src/xlat/fb_vmodes.in4
20 files changed, 706 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 6ee9fb0ac..1a2d1c95b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -103,6 +103,8 @@ libstrace_a_SOURCES = \
fadvise.c \
fallocate.c \
fanotify.c \
+ fb_ioctl.c \
+ fb_mpers_ioctl.c \
fchownat.c \
fcntl.c \
fetch_bpf_fprog.c \
diff --git a/src/defs.h b/src/defs.h
index af2a645cf..d7ebc7a8f 100644
--- a/src/defs.h
+++ b/src/defs.h
@@ -1391,6 +1391,7 @@ name ## _ioctl(struct tcb *, unsigned int request, kernel_ulong_t arg) \
DECL_IOCTL(counter);
DECL_IOCTL(dm);
DECL_IOCTL(evdev);
+DECL_IOCTL(fb);
DECL_IOCTL(fs_0x94);
DECL_IOCTL(fs_f);
DECL_IOCTL(fs_x);
@@ -1722,6 +1723,7 @@ printnum_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt) \
ATTRIBUTE_FORMAT((printf, 3, 0)) \
/* End of DECL_PRINTNUM definition. */
+DECL_PRINTNUM(char);
DECL_PRINTNUM(short);
DECL_PRINTNUM(int);
DECL_PRINTNUM(int64);
diff --git a/src/fb_ioctl.c b/src/fb_ioctl.c
new file mode 100644
index 000000000..fcfbb806d
--- /dev/null
+++ b/src/fb_ioctl.c
@@ -0,0 +1,333 @@
+/*
+ * Copyright (c) 2021 Eugene Syromyatnikov <evgsyr@gmail.com>.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include "defs.h"
+
+#include <linux/ioctl.h>
+#include <linux/fb.h>
+
+#include "xlat/fb_accel_flags.h"
+#include "xlat/fb_activate_flags.h"
+#include "xlat/fb_activate_vals.h"
+#include "xlat/fb_sync_flags.h"
+#include "xlat/fb_vblank_flags.h"
+#include "xlat/fb_vmodes.h"
+#include "xlat/fb_vmode_flags.h"
+
+#define XLAT_MACROS_ONLY
+# include "xlat/fb_ioctl_cmds.h"
+#undef XLAT_MACROS_ONLY
+
+static void
+print_fb_bitfield(struct fb_bitfield *bf)
+{
+ tprint_struct_begin();
+ PRINT_FIELD_U(*bf, offset);
+ tprint_struct_next();
+ PRINT_FIELD_U(*bf, length);
+ tprint_struct_next();
+ PRINT_FIELD_U(*bf, msb_right);
+ tprint_struct_end();
+}
+
+static void
+print_fb_activate(uint32_t val)
+{
+ uint32_t flags = val & ~FB_ACTIVATE_MASK;
+ uint32_t mode = val & FB_ACTIVATE_MASK;
+
+ printflags(fb_activate_flags, flags, NULL);
+ if (flags)
+ tprints("|");
+ printxval(fb_activate_vals, mode, "FB_ACTIVATE_???");
+}
+
+static void
+print_fb_vmode(uint32_t val)
+{
+ uint32_t flags = val & ~FB_VMODE_MASK;
+ uint32_t mode = val & FB_VMODE_MASK;
+
+ printflags(fb_vmode_flags, flags, NULL);
+ if (flags)
+ tprints("|");
+ printflags(fb_vmodes, mode, "FB_VMODE_???");
+}
+
+static int
+fb_vscreeninfo(struct tcb *const tcp, const kernel_ulong_t arg, const bool get)
+{
+ struct fb_var_screeninfo si;
+
+ if (entering(tcp)) {
+ tprint_arg_next();
+ if (get)
+ return 0;
+ } else {
+ if (!get) {
+ if (syserror(tcp))
+ return RVAL_IOCTL_DECODED;
+ else
+ tprint_value_changed();
+ }
+ }
+
+ if (umove_or_printaddr(tcp, arg, &si))
+ return RVAL_IOCTL_DECODED;
+
+ tprint_struct_begin();
+ PRINT_FIELD_U(si, xres);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, yres);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, xres_virtual);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, yres_virtual);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, xoffset);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, yoffset);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, bits_per_pixel);
+ tprint_struct_next();
+ if (si.grayscale > 1)
+ PRINT_FIELD_PIXFMT(si, grayscale, v4l2_pix_fmts);
+ else
+ PRINT_FIELD_U(si, grayscale);
+ tprint_struct_next();
+ PRINT_FIELD_OBJ_PTR(si, red, print_fb_bitfield);
+ tprint_struct_next();
+ PRINT_FIELD_OBJ_PTR(si, green, print_fb_bitfield);
+ tprint_struct_next();
+ PRINT_FIELD_OBJ_PTR(si, blue, print_fb_bitfield);
+ tprint_struct_next();
+ PRINT_FIELD_OBJ_PTR(si, transp, print_fb_bitfield);
+ tprint_struct_next();
+ /*
+ * Unfortunately, despite presence and some usage of FB_NONSTD_*
+ * constants, the encoding of the field is actually varies depending
+ * on driver.
+ */
+ PRINT_FIELD_X(si, nonstd);
+ tprint_struct_next();
+ PRINT_FIELD_OBJ_VAL(si, activate, print_fb_activate);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, height);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, width);
+ tprint_struct_next();
+ PRINT_FIELD_FLAGS(si, accel_flags, fb_accel_flags, "FB_ACCELF_???");
+ tprint_struct_next();
+ PRINT_FIELD_U(si, pixclock);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, left_margin);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, right_margin);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, upper_margin);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, lower_margin);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, hsync_len);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, vsync_len);
+ tprint_struct_next();
+ PRINT_FIELD_FLAGS(si, sync, fb_sync_flags, "FB_SYNC_???");
+ tprint_struct_next();
+ PRINT_FIELD_OBJ_VAL(si, vmode, print_fb_vmode);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, rotate);
+ tprint_struct_next();
+ if (si.colorspace)
+ PRINT_FIELD_PIXFMT(si, colorspace, v4l2_pix_fmts);
+ else
+ PRINT_FIELD_U(si, colorspace);
+ if (!IS_ARRAY_ZERO(si.reserved)) {
+ tprint_struct_next();
+ PRINT_FIELD_X_ARRAY(si, reserved);
+ }
+ tprint_struct_end();
+
+ return entering(tcp) ? 0 : RVAL_IOCTL_DECODED;
+}
+
+static int
+fb_con2fbmap(struct tcb *const tcp, const kernel_ulong_t arg, const bool get)
+{
+ struct fb_con2fbmap cf;
+
+ if (entering(tcp)) {
+ tprint_arg_next();
+ if (get)
+ return 0;
+
+ if (umove_or_printaddr(tcp, arg, &cf))
+ return RVAL_IOCTL_DECODED;
+ } else {
+ if (!get && (syserror(tcp) || umove(tcp, arg, &cf))) {
+ tprint_struct_end();
+ return RVAL_IOCTL_DECODED;
+ }
+ }
+
+ if (get || entering(tcp)) {
+ tprint_struct_begin();
+ PRINT_FIELD_U(cf, console);
+ tprint_struct_next();
+
+ if (!get)
+ return 0;
+ }
+
+ PRINT_FIELD_U(cf, framebuffer);
+ tprint_struct_end();
+
+ return RVAL_IOCTL_DECODED;
+}
+
+static int
+fb_vblank(struct tcb *const tcp, const kernel_ulong_t arg)
+{
+ struct fb_vblank vb;
+
+ if (entering(tcp)) {
+ tprint_arg_next();
+ return 0;
+ }
+
+ if (umove_or_printaddr(tcp, arg, &vb))
+ return RVAL_IOCTL_DECODED;
+
+ tprint_struct_begin();
+ PRINT_FIELD_FLAGS(vb, flags, fb_vblank_flags, "FB_VBLANK_???");
+ tprint_struct_next();
+ PRINT_FIELD_U(vb, count);
+ tprint_struct_next();
+ PRINT_FIELD_U(vb, vcount);
+ tprint_struct_next();
+ PRINT_FIELD_U(vb, hcount);
+ tprint_struct_next();
+ if (!IS_ARRAY_ZERO(vb.reserved)) {
+ tprint_struct_next();
+ PRINT_FIELD_X_ARRAY(vb, reserved);
+ }
+
+ return RVAL_IOCTL_DECODED;
+}
+
+static int
+fb_da8xx_sync(struct tcb *const tcp, const kernel_ulong_t arg)
+{
+ struct lcd_sync_arg {
+ int back_porch;
+ int front_porch;
+ int pulse_width;
+ } sa;
+
+ if (umove_or_printaddr(tcp, arg, &sa))
+ return RVAL_IOCTL_DECODED;
+
+ tprint_struct_begin();
+ PRINT_FIELD_D(sa, back_porch);
+ tprint_struct_next();
+ PRINT_FIELD_D(sa, front_porch);
+ tprint_struct_next();
+ PRINT_FIELD_D(sa, pulse_width);
+ tprint_struct_end();
+
+ return RVAL_IOCTL_DECODED;
+}
+
+int
+fb_ioctl(struct tcb *const tcp, const unsigned int code,
+ const kernel_ulong_t arg)
+{
+ switch (code) {
+ case FBIOGET_VSCREENINFO:
+ case FBIOPUT_VSCREENINFO:
+ case FBIOPAN_DISPLAY:
+ return fb_vscreeninfo(tcp, arg, code == FBIOGET_VSCREENINFO);
+
+ case FBIOGET_CON2FBMAP:
+ case FBIOPUT_CON2FBMAP:
+ return fb_con2fbmap(tcp, arg, code == FBIOGET_CON2FBMAP);
+
+ case FBIOBLANK:
+ tprint_arg_next();
+ PRINT_VAL_D(arg);
+ return RVAL_IOCTL_DECODED;
+
+ case FBIOGET_VBLANK:
+ return fb_vblank(tcp, arg);
+
+ case FBIO_WAITFORVSYNC:
+ tprint_arg_next();
+ printnum_int(tcp, arg, "%u");
+ return RVAL_IOCTL_DECODED;
+
+ /* The following two commands are from da8xx_fb.c */
+ case FBIPUT_HSYNC:
+ case FBIPUT_VSYNC:
+ return fb_da8xx_sync(tcp, arg);
+
+ /* The following two are from arcfb.c */
+ case FBIO_WAITEVENT:
+ return RVAL_IOCTL_DECODED;
+
+ case FBIO_GETCONTROL2:
+ if (entering(tcp)) {
+ tprint_arg_next();
+ return 0;
+ }
+ printnum_char(tcp, arg, "%hhu");
+ return RVAL_IOCTL_DECODED;
+
+ /* The following two are from sstfb.c */
+ case SSTFB_SET_VGAPASS:
+ tprint_arg_next();
+ printnum_int(tcp, arg, "%u");
+ return RVAL_IOCTL_DECODED;
+
+ case SSTFB_GET_VGAPASS:
+ if (entering(tcp)) {
+ tprint_arg_next();
+ return 0;
+ }
+ printnum_int(tcp, arg, "%u");
+ return RVAL_IOCTL_DECODED;
+
+ /* Unsupported */
+ case FBIO_CURSOR:
+ case FBIOGET_MONITORSPEC:
+ case FBIOPUT_MONITORSPEC:
+ case FBIOSWITCH_MONIBIT:
+
+ /* These were implemented by pre-1.7.10 sisfb (v2.6.9-rc1~85^2~1^2~88) */
+ case FBIO_ALLOC:
+ case FBIO_FREE:
+ case FBIOGET_GLYPH:
+ case FBIOGET_HWCINFO:
+ case FBIOPUT_MODEINFO:
+ case FBIOGET_DISPINFO:
+
+ /*
+ * These are declared in include/video/da8xx-fb.h, mentioned only
+ * in da8xx-fb.c, and never have an implementetion (always returned
+ * EINVAL/ENOTTY).
+ */
+ case FBIOGET_CONTRAST:
+ case FBIOPUT_CONTRAST:
+ case FBIGET_BRIGHTNESS:
+ case FBIPUT_BRIGHTNESS:
+ case FBIGET_COLOR:
+ case FBIPUT_COLOR:
+ return RVAL_DECODED;
+ }
+
+ /* FBIOGET_FSCREENINFO, FBIOGETCMAP, FBIOPUTCMAP */
+ return fb_mpers_ioctl(tcp, code, arg);
+}
diff --git a/src/fb_mpers_ioctl.c b/src/fb_mpers_ioctl.c
new file mode 100644
index 000000000..96290a265
--- /dev/null
+++ b/src/fb_mpers_ioctl.c
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2021 Eugene Syromyatnikov <evgsyr@gmail.com>.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include "defs.h"
+
+#include <linux/ioctl.h>
+#include <linux/fb.h>
+
+#include DEF_MPERS_TYPE(struct_fb_cmap)
+#include DEF_MPERS_TYPE(struct_fb_fix_screeninfo)
+
+typedef struct fb_cmap struct_fb_cmap;
+typedef struct fb_fix_screeninfo struct_fb_fix_screeninfo;
+
+#include MPERS_DEFS
+
+#include "xlat/fb_accels.h"
+#include "xlat/fb_caps.h"
+#include "xlat/fb_types.h"
+#include "xlat/fb_type_aux_text.h"
+#include "xlat/fb_type_aux_vga_planes.h"
+#include "xlat/fb_visuals.h"
+
+#define XLAT_MACROS_ONLY
+# include "xlat/fb_ioctl_cmds.h"
+#undef XLAT_MACROS_ONLY
+
+static int
+fb_fscreeninfo(struct tcb *const tcp, const kernel_ulong_t arg)
+{
+ struct_fb_fix_screeninfo si;
+
+ if (entering(tcp)) {
+ tprint_arg_next();
+ return 0;
+ }
+
+ if (umove_or_printaddr(tcp, arg, &si))
+ return RVAL_IOCTL_DECODED;
+
+ tprint_struct_begin();
+ PRINT_FIELD_CSTRING(si, id);
+ tprint_struct_next();
+ PRINT_FIELD_PTR(si, smem_start);
+ tprint_struct_next();
+ PRINT_FIELD_X(si, smem_len);
+ tprint_struct_next();
+ PRINT_FIELD_XVAL(si, type, fb_types, "FB_TYPE_???");
+ tprint_struct_next();
+ switch (si.type) {
+ case FB_TYPE_TEXT:
+ PRINT_FIELD_XVAL(si, type_aux, fb_type_aux_text,
+ "FB_AUX_TEXT_???");
+ break;
+ case FB_TYPE_VGA_PLANES:
+ PRINT_FIELD_XVAL(si, type_aux, fb_type_aux_vga_planes,
+ "FB_AUX_VGA_PLANES_???");
+ break;
+ default:
+ PRINT_FIELD_X(si, type_aux);
+ }
+ tprint_struct_next();
+ PRINT_FIELD_XVAL(si, visual, fb_visuals, "FB_VISUAL_???");
+ tprint_struct_next();
+ PRINT_FIELD_U(si, xpanstep);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, ypanstep);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, ywrapstep);
+ tprint_struct_next();
+ PRINT_FIELD_U(si, line_length);
+ tprint_struct_next();
+ PRINT_FIELD_PTR(si, mmio_start);
+ tprint_struct_next();
+ PRINT_FIELD_X(si, mmio_len);
+ tprint_struct_next();
+ PRINT_FIELD_XVAL(si, accel, fb_accels, "FB_ACCEL_???");
+ tprint_struct_next();
+ PRINT_FIELD_FLAGS(si, capabilities, fb_caps, "FB_CAP_???");
+ if (!IS_ARRAY_ZERO(si.reserved)) {
+ tprint_struct_next();
+ PRINT_FIELD_X_ARRAY(si, reserved);
+ }
+ tprint_struct_end();
+
+ return RVAL_IOCTL_DECODED;
+}
+
+#define PRINT_FIELD_U16_ARR(where_, field_, tcp_, len_, print_func_) \
+ do { \
+ uint16_t elem_; \
+ tprints_field_name(#field_); \
+ print_array((tcp_), (mpers_ptr_t) (where_).field_, \
+ (len_), &elem_, sizeof(elem_), \
+ tfetch_mem, (print_func_), NULL); \
+ } while (0)
+
+static void
+print_fb_cmap(struct tcb *const tcp, const struct_fb_cmap *const cm,
+ const bool print_arrays)
+{
+ tprint_struct_begin();
+ PRINT_FIELD_U(*cm, start);
+ tprint_struct_next();
+ PRINT_FIELD_U(*cm, len);
+ tprint_struct_next();
+ if (print_arrays) {
+ PRINT_FIELD_U16_ARR(*cm, red, tcp, cm->len,
+ print_uint_array_member);
+ tprint_struct_next();
+ PRINT_FIELD_U16_ARR(*cm, green, tcp, cm->len,
+ print_uint_array_member);
+ tprint_struct_next();
+ PRINT_FIELD_U16_ARR(*cm, blue, tcp, cm->len,
+ print_uint_array_member);
+ tprint_struct_next();
+ PRINT_FIELD_U16_ARR(*cm, transp, tcp, cm->len,
+ print_uint_array_member);
+ } else {
+ PRINT_FIELD_PTR(*cm, red);
+ tprint_struct_next();
+ PRINT_FIELD_PTR(*cm, green);
+ tprint_struct_next();
+ PRINT_FIELD_PTR(*cm, blue);
+ tprint_struct_next();
+ PRINT_FIELD_PTR(*cm, transp);
+ }
+ tprint_struct_end();
+}
+
+static int
+fb_cmap(struct tcb *const tcp, const kernel_ulong_t arg, const bool get)
+{
+ struct_fb_cmap cm;
+
+ if (entering(tcp)) {
+ tprint_arg_next();
+ if (get) {
+ if (umove_or_printaddr(tcp, arg, &cm))
+ return RVAL_IOCTL_DECODED;
+
+ print_fb_cmap(tcp, &cm, false);
+ return 0;
+ }
+ }
+
+ if (get) {
+ if (syserror(tcp) || umove(tcp, arg, &cm))
+ return RVAL_IOCTL_DECODED;
+ else
+ tprint_value_changed();
+ } else {
+ if (umove_or_printaddr(tcp, arg, &cm))
+ return RVAL_IOCTL_DECODED;
+ }
+
+ print_fb_cmap(tcp, &cm, true);
+
+ return RVAL_IOCTL_DECODED;
+
+}
+
+MPERS_PRINTER_DECL(int, fb_mpers_ioctl, struct tcb *const tcp,
+ const unsigned int code, const kernel_ulong_t arg)
+{
+ switch (code) {
+ case FBIOGET_FSCREENINFO:
+ return fb_fscreeninfo(tcp, arg);
+
+ case FBIOGETCMAP:
+ case FBIOPUTCMAP:
+ return fb_cmap(tcp, arg, code == FBIOGETCMAP);
+ }
+
+ return RVAL_DECODED;
+}
diff --git a/src/ioctl.c b/src/ioctl.c
index 60dffa7aa..c75a0ddc3 100644
--- a/src/ioctl.c
+++ b/src/ioctl.c
@@ -366,6 +366,8 @@ ioctl_decode(struct tcb *tcp)
return counter_ioctl(tcp, code, arg);
case 'E':
return evdev_ioctl(tcp, code, arg);
+ case 'F':
+ return fb_ioctl(tcp, code, arg);
case 'I':
return inotify_ioctl(tcp, code, arg);
case 'K':
diff --git a/src/util.c b/src/util.c
index c4c4bc0ef..cd491ee44 100644
--- a/src/util.c
+++ b/src/util.c
@@ -454,6 +454,7 @@ DEF_PRINTNUM(int, int)
DEF_PRINTNUM_ADDR(int, unsigned int)
DEF_PRINTPAIR(int, int)
DEF_PRINTNUM(short, short)
+DEF_PRINTNUM(char, char)
DEF_PRINTNUM(int64, uint64_t)
DEF_PRINTNUM_ADDR(int64, uint64_t)
DEF_PRINTPAIR(int64, uint64_t)
diff --git a/src/xlat/fb_accel_flags.in b/src/xlat/fb_accel_flags.in
new file mode 100644
index 000000000..5fb477070
--- /dev/null
+++ b/src/xlat/fb_accel_flags.in
@@ -0,0 +1 @@
+FB_ACCELF_TEXT 1
diff --git a/src/xlat/fb_accels.in b/src/xlat/fb_accels.in
new file mode 100644
index 000000000..6a0639fe4
--- /dev/null
+++ b/src/xlat/fb_accels.in
@@ -0,0 +1,83 @@
+#sorted
+FB_ACCEL_NONE 0
+FB_ACCEL_ATARIBLITT 1
+FB_ACCEL_AMIGABLITT 2
+FB_ACCEL_S3_TRIO64 3
+FB_ACCEL_NCR_77C32BLT 4
+FB_ACCEL_S3_VIRGE 5
+FB_ACCEL_ATI_MACH64GX 6
+FB_ACCEL_DEC_TGA 7
+FB_ACCEL_ATI_MACH64CT 8
+FB_ACCEL_ATI_MACH64VT 9
+FB_ACCEL_ATI_MACH64GT 10
+FB_ACCEL_SUN_CREATOR 11
+FB_ACCEL_SUN_CGSIX 12
+FB_ACCEL_SUN_LEO 13
+FB_ACCEL_IMS_TWINTURBO 14
+FB_ACCEL_3DLABS_PERMEDIA2 15
+FB_ACCEL_MATROX_MGA2064W 16
+FB_ACCEL_MATROX_MGA1064SG 17
+FB_ACCEL_MATROX_MGA2164W 18
+FB_ACCEL_MATROX_MGA2164W_AGP 19
+FB_ACCEL_MATROX_MGAG100 20
+FB_ACCEL_MATROX_MGAG200 21
+FB_ACCEL_SUN_CG14 22
+FB_ACCEL_SUN_BWTWO 23
+FB_ACCEL_SUN_CGTHREE 24
+FB_ACCEL_SUN_TCX 25
+FB_ACCEL_MATROX_MGAG400 26
+FB_ACCEL_NV3 27
+FB_ACCEL_NV4 28
+FB_ACCEL_NV5 29
+FB_ACCEL_CT_6555x 30
+FB_ACCEL_3DFX_BANSHEE 31
+FB_ACCEL_ATI_RAGE128 32
+FB_ACCEL_IGS_CYBER2000 33
+FB_ACCEL_IGS_CYBER2010 34
+FB_ACCEL_IGS_CYBER5000 35
+FB_ACCEL_SIS_GLAMOUR 36
+FB_ACCEL_3DLABS_PERMEDIA3 37
+FB_ACCEL_ATI_RADEON 38
+FB_ACCEL_I810 39
+FB_ACCEL_SIS_GLAMOUR_2 40
+FB_ACCEL_SIS_XABRE 41
+FB_ACCEL_I830 42
+FB_ACCEL_NV_10 43
+FB_ACCEL_NV_20 44
+FB_ACCEL_NV_30 45
+FB_ACCEL_NV_40 46
+FB_ACCEL_XGI_VOLARI_V 47
+FB_ACCEL_XGI_VOLARI_Z 48
+FB_ACCEL_OMAP1610 49
+FB_ACCEL_TRIDENT_TGUI 50
+FB_ACCEL_TRIDENT_3DIMAGE 51
+FB_ACCEL_TRIDENT_BLADE3D 52
+FB_ACCEL_TRIDENT_BLADEXP 53
+FB_ACCEL_NEOMAGIC_NM2070 90
+FB_ACCEL_NEOMAGIC_NM2090 91
+FB_ACCEL_NEOMAGIC_NM2093 92
+FB_ACCEL_NEOMAGIC_NM2097 93
+FB_ACCEL_NEOMAGIC_NM2160 94
+FB_ACCEL_NEOMAGIC_NM2200 95
+FB_ACCEL_NEOMAGIC_NM2230 96
+FB_ACCEL_NEOMAGIC_NM2360 97
+FB_ACCEL_NEOMAGIC_NM2380 98
+FB_ACCEL_PXA3XX 99
+
+FB_ACCEL_SAVAGE4 0x80
+FB_ACCEL_SAVAGE3D 0x81
+FB_ACCEL_SAVAGE3D_MV 0x82
+FB_ACCEL_SAVAGE2000 0x83
+FB_ACCEL_SAVAGE_MX_MV 0x84
+FB_ACCEL_SAVAGE_MX 0x85
+FB_ACCEL_SAVAGE_IX_MV 0x86
+FB_ACCEL_SAVAGE_IX 0x87
+FB_ACCEL_PROSAVAGE_PM 0x88
+FB_ACCEL_PROSAVAGE_KM 0x89
+FB_ACCEL_S3TWISTER_P 0x8a
+FB_ACCEL_S3TWISTER_K 0x8b
+FB_ACCEL_SUPERSAVAGE 0x8c
+FB_ACCEL_PROSAVAGE_DDR 0x8d
+FB_ACCEL_PROSAVAGE_DDRK 0x8e
+
+FB_ACCEL_PUV3_UNIGFX 0xa0
diff --git a/src/xlat/fb_activate_flags.in b/src/xlat/fb_activate_flags.in
new file mode 100644
index 000000000..20eabcde0
--- /dev/null
+++ b/src/xlat/fb_activate_flags.in
@@ -0,0 +1,6 @@
+FB_ACTIVATE_VBL 16
+FB_CHANGE_CMAP_VBL 32
+FB_ACTIVATE_ALL 64
+FB_ACTIVATE_FORCE 128
+FB_ACTIVATE_INV_MODE 256
+FB_ACTIVATE_KD_TEXT 512
diff --git a/src/xlat/fb_activate_vals.in b/src/xlat/fb_activate_vals.in
new file mode 100644
index 000000000..a6e628160
--- /dev/null
+++ b/src/xlat/fb_activate_vals.in
@@ -0,0 +1,4 @@
+#value_indexed
+FB_ACTIVATE_NOW 0
+FB_ACTIVATE_NXTOPEN 1
+FB_ACTIVATE_TEST 2
diff --git a/src/xlat/fb_caps.in b/src/xlat/fb_caps.in
new file mode 100644
index 000000000..e020ce751
--- /dev/null
+++ b/src/xlat/fb_caps.in
@@ -0,0 +1 @@
+FB_CAP_FOURCC 1
diff --git a/src/xlat/fb_ioctl_cmds.in b/src/xlat/fb_ioctl_cmds.in
new file mode 100644
index 000000000..3961a14b4
--- /dev/null
+++ b/src/xlat/fb_ioctl_cmds.in
@@ -0,0 +1,40 @@
+/* include/uapi/linux/fb.h */
+FBIOGET_VSCREENINFO 0x4600
+FBIOPUT_VSCREENINFO 0x4601
+FBIOGET_FSCREENINFO 0x4602
+FBIOGETCMAP 0x4604
+FBIOPUTCMAP 0x4605
+FBIOPAN_DISPLAY 0x4606
+FBIO_CURSOR /* _IOWR('F', 0x08, struct fb_cursor) */
+FBIOGET_MONITORSPEC 0x460C
+FBIOPUT_MONITORSPEC 0x460D
+FBIOSWITCH_MONIBIT 0x460E
+FBIOGET_CON2FBMAP 0x460F
+FBIOPUT_CON2FBMAP 0x4610
+FBIOBLANK 0x4611 /* arg: 0 or vesa level + 1 */
+FBIOGET_VBLANK _IOR('F', 0x12, struct fb_vblank)
+FBIO_ALLOC 0x4613
+FBIO_FREE 0x4614
+FBIOGET_GLYPH 0x4615
+FBIOGET_HWCINFO 0x4616
+FBIOPUT_MODEINFO 0x4617
+FBIOGET_DISPINFO 0x4618
+FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32)
+
+/* include/video/da8xx-fb.h */
+FBIOGET_CONTRAST _IOR('F', 1, int)
+FBIOPUT_CONTRAST _IOW('F', 2, int)
+FBIGET_BRIGHTNESS _IOR('F', 3, int)
+FBIPUT_BRIGHTNESS _IOW('F', 3, int)
+FBIGET_COLOR _IOR('F', 5, int)
+FBIPUT_COLOR _IOW('F', 6, int)
+FBIPUT_HSYNC _IOW('F', 9, int)
+FBIPUT_VSYNC _IOW('F', 10, int)
+
+/* include/uapi/linux/arcfb.h */
+FBIO_WAITEVENT _IO('F', 0x88)
+FBIO_GETCONTROL2 _IOR('F', 0x89, size_t)
+
+/* include/video/sstfb.h */
+SSTFB_SET_VGAPASS _IOW('F', 0xdd, __u32)
+SSTFB_GET_VGAPASS _IOR('F', 0xdd, __u32)
diff --git a/src/xlat/fb_sync_flags.in b/src/xlat/fb_sync_flags.in
new file mode 100644
index 000000000..4848f0347
--- /dev/null
+++ b/src/xlat/fb_sync_flags.in
@@ -0,0 +1,6 @@
+FB_SYNC_HOR_HIGH_ACT 1
+FB_SYNC_VERT_HIGH_ACT 2
+FB_SYNC_EXT 4
+FB_SYNC_COMP_HIGH_ACT 8
+FB_SYNC_BROADCAST 16
+FB_SYNC_ON_GREEN 32
diff --git a/src/xlat/fb_type_aux_text.in b/src/xlat/fb_type_aux_text.in
new file mode 100644
index 000000000..751d330f4
--- /dev/null
+++ b/src/xlat/fb_type_aux_text.in
@@ -0,0 +1,11 @@
+#value_indexed
+FB_AUX_TEXT_MDA 0
+FB_AUX_TEXT_CGA 1
+FB_AUX_TEXT_S3_MMIO 2
+FB_AUX_TEXT_MGA_STEP16 3
+FB_AUX_TEXT_MGA_STEP8 4
+FB_AUX_TEXT_SVGA_STEP2 8
+FB_AUX_TEXT_SVGA_STEP4 9
+FB_AUX_TEXT_SVGA_STEP8 10
+FB_AUX_TEXT_SVGA_STEP16 11
+FB_AUX_TEXT_SVGA_LAST 15
diff --git a/src/xlat/fb_type_aux_vga_planes.in b/src/xlat/fb_type_aux_vga_planes.in
new file mode 100644
index 000000000..3aaf684da
--- /dev/null
+++ b/src/xlat/fb_type_aux_vga_planes.in
@@ -0,0 +1,4 @@
+#value_indexed
+FB_AUX_VGA_PLANES_VGA4 0
+FB_AUX_VGA_PLANES_CFB4 1
+FB_AUX_VGA_PLANES_CFB8 2
diff --git a/src/xlat/fb_types.in b/src/xlat/fb_types.in
new file mode 100644
index 000000000..5ee769a78
--- /dev/null
+++ b/src/xlat/fb_types.in
@@ -0,0 +1,7 @@
+#value_indexed
+FB_TYPE_PACKED_PIXELS 0
+FB_TYPE_PLANES 1
+FB_TYPE_INTERLEAVED_PLANES 2
+FB_TYPE_TEXT 3
+FB_TYPE_VGA_PLANES 4
+FB_TYPE_FOURCC 5
diff --git a/src/xlat/fb_vblank_flags.in b/src/xlat/fb_vblank_flags.in
new file mode 100644
index 000000000..d59790c5e
--- /dev/null
+++ b/src/xlat/fb_vblank_flags.in
@@ -0,0 +1,9 @@
+FB_VBLANK_VBLANKING 0x001
+FB_VBLANK_HBLANKING 0x002
+FB_VBLANK_HAVE_VBLANK 0x004
+FB_VBLANK_HAVE_HBLANK 0x008
+FB_VBLANK_HAVE_COUNT 0x010
+FB_VBLANK_HAVE_VCOUNT 0x020
+FB_VBLANK_HAVE_HCOUNT 0x040
+FB_VBLANK_VSYNCING 0x080
+FB_VBLANK_HAVE_VSYNC 0x100
diff --git a/src/xlat/fb_visuals.in b/src/xlat/fb_visuals.in
new file mode 100644
index 000000000..1d40595b8
--- /dev/null
+++ b/src/xlat/fb_visuals.in
@@ -0,0 +1,8 @@
+#value_indexed
+FB_VISUAL_MONO01 0
+FB_VISUAL_MONO10 1
+FB_VISUAL_TRUECOLOR 2
+FB_VISUAL_PSEUDOCOLOR 3
+FB_VISUAL_DIRECTCOLOR 4
+FB_VISUAL_STATIC_PSEUDOCOLOR 5
+FB_VISUAL_FOURCC 6
diff --git a/src/xlat/fb_vmode_flags.in b/src/xlat/fb_vmode_flags.in
new file mode 100644
index 000000000..5c2bb8ac9
--- /dev/null
+++ b/src/xlat/fb_vmode_flags.in
@@ -0,0 +1,2 @@
+FB_VMODE_YWRAP 256
+FB_VMODE_CONUPDATE 512
diff --git a/src/xlat/fb_vmodes.in b/src/xlat/fb_vmodes.in
new file mode 100644
index 000000000..071f8d6e0
--- /dev/null
+++ b/src/xlat/fb_vmodes.in
@@ -0,0 +1,4 @@
+FB_VMODE_NONINTERLACED 0
+FB_VMODE_INTERLACED 1
+FB_VMODE_DOUBLE 2
+FB_VMODE_ODD_FLD_FIRST 4