From a25a16d4adf663abd8f6eaab266b9444157357b6 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Fri, 24 Apr 2015 16:05:59 +0100 Subject: [PATCH] [vram] Add "vram" built-in setting to dump video RAM The "vram" setting returns the (Base64-encoded) contents of video RAM, and can be used to capture a screenshot. For example: after running memtest.0 and encountering an error, the output can be captured and sent to a remote server for later diagnosis: #!ipxe chain -a http://server/memtest.0 && goto ok || goto bad :bad params param errno ${errno} param vram ${vram} chain -a http://server/report.php##params :ok Inspired-by: Christian Nilsson Originally-implemented-by: Christian Nilsson Signed-off-by: Michael Brown --- src/arch/x86/core/vram_settings.c | 72 +++++++++++++++++++++++++++++++ src/config/config.c | 3 ++ src/config/settings.h | 1 + 3 files changed, 76 insertions(+) create mode 100644 src/arch/x86/core/vram_settings.c diff --git a/src/arch/x86/core/vram_settings.c b/src/arch/x86/core/vram_settings.c new file mode 100644 index 0000000000..9c169b40c8 --- /dev/null +++ b/src/arch/x86/core/vram_settings.c @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2015 Michael Brown . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * You can also choose to distribute this program under the terms of + * the Unmodified Binary Distribution Licence (as given in the file + * COPYING.UBDL), provided that you have satisfied its requirements. + */ + +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); + +#include +#include + +/** @file + * + * Video RAM dump + * + */ + +/** Video RAM base address */ +#define VRAM_BASE 0xb8000 + +/** Video RAM length */ +#define VRAM_LEN \ + ( 80 /* columns */ * 25 /* rows */ * 2 /* bytes per character */ ) + +/** + * Fetch video RAM setting + * + * @v data Buffer to fill with setting data + * @v len Length of buffer + * @ret len Length of setting data, or negative error + */ +static int vram_fetch ( void *data, size_t len ) { + userptr_t vram = phys_to_user ( VRAM_BASE ); + + /* Copy video RAM */ + if ( len > VRAM_LEN ) + len = VRAM_LEN; + copy_from_user ( data, vram, 0, len ); + + return VRAM_LEN; +} + +/** Video RAM setting */ +const struct setting vram_setting __setting ( SETTING_MISC, vram ) = { + .name = "vram", + .description = "Video RAM", + .type = &setting_type_base64, + .scope = &builtin_scope, +}; + +/** Video RAM built-in setting */ +struct builtin_setting vram_builtin_setting __builtin_setting = { + .setting = &vram_setting, + .fetch = vram_fetch, +}; diff --git a/src/config/config.c b/src/config/config.c index 470083888e..ae2ec47992 100644 --- a/src/config/config.c +++ b/src/config/config.c @@ -337,6 +337,9 @@ REQUIRE_OBJECT ( cpuid_settings ); #ifdef MEMMAP_SETTINGS REQUIRE_OBJECT ( memmap_settings ); #endif +#ifdef VRAM_SETTINGS +REQUIRE_OBJECT ( vram_settings ); +#endif /* * Drag in selected keyboard map diff --git a/src/config/settings.h b/src/config/settings.h index b3aabbe554..01feaaa87f 100644 --- a/src/config/settings.h +++ b/src/config/settings.h @@ -13,6 +13,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); //#define CPUID_SETTINGS /* CPUID settings */ //#define MEMMAP_SETTINGS /* Memory map settings */ //#define VMWARE_SETTINGS /* VMware GuestInfo settings */ +//#define VRAM_SETTINGS /* Video RAM dump settings */ #include #include NAMED_CONFIG(settings.h)