Browse Source

[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 <nikize@gmail.com>
Originally-implemented-by: Christian Nilsson <nikize@gmail.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 9 years ago
parent
commit
a25a16d4ad
3 changed files with 76 additions and 0 deletions
  1. 72
    0
      src/arch/x86/core/vram_settings.c
  2. 3
    0
      src/config/config.c
  3. 1
    0
      src/config/settings.h

+ 72
- 0
src/arch/x86/core/vram_settings.c View File

@@ -0,0 +1,72 @@
1
+/*
2
+ * Copyright (C) 2015 Michael Brown <mbrown@fensystems.co.uk>.
3
+ *
4
+ * This program is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU General Public License as
6
+ * published by the Free Software Foundation; either version 2 of the
7
+ * License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful, but
10
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
+ * General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public License
15
+ * along with this program; if not, write to the Free Software
16
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17
+ * 02110-1301, USA.
18
+ *
19
+ * You can also choose to distribute this program under the terms of
20
+ * the Unmodified Binary Distribution Licence (as given in the file
21
+ * COPYING.UBDL), provided that you have satisfied its requirements.
22
+ */
23
+
24
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25
+
26
+#include <ipxe/uaccess.h>
27
+#include <ipxe/settings.h>
28
+
29
+/** @file
30
+ *
31
+ * Video RAM dump
32
+ *
33
+ */
34
+
35
+/** Video RAM base address */
36
+#define VRAM_BASE 0xb8000
37
+
38
+/** Video RAM length */
39
+#define VRAM_LEN \
40
+	( 80 /* columns */ * 25 /* rows */ * 2 /* bytes per character */ )
41
+
42
+/**
43
+ * Fetch video RAM setting
44
+ *
45
+ * @v data		Buffer to fill with setting data
46
+ * @v len		Length of buffer
47
+ * @ret len		Length of setting data, or negative error
48
+ */
49
+static int vram_fetch ( void *data, size_t len ) {
50
+	userptr_t vram = phys_to_user ( VRAM_BASE );
51
+
52
+	/* Copy video RAM */
53
+	if ( len > VRAM_LEN )
54
+		len = VRAM_LEN;
55
+	copy_from_user ( data, vram, 0, len );
56
+
57
+	return VRAM_LEN;
58
+}
59
+
60
+/** Video RAM setting */
61
+const struct setting vram_setting __setting ( SETTING_MISC, vram ) = {
62
+	.name = "vram",
63
+	.description = "Video RAM",
64
+	.type = &setting_type_base64,
65
+	.scope = &builtin_scope,
66
+};
67
+
68
+/** Video RAM built-in setting */
69
+struct builtin_setting vram_builtin_setting __builtin_setting = {
70
+	.setting = &vram_setting,
71
+	.fetch = vram_fetch,
72
+};

+ 3
- 0
src/config/config.c View File

@@ -337,6 +337,9 @@ REQUIRE_OBJECT ( cpuid_settings );
337 337
 #ifdef MEMMAP_SETTINGS
338 338
 REQUIRE_OBJECT ( memmap_settings );
339 339
 #endif
340
+#ifdef VRAM_SETTINGS
341
+REQUIRE_OBJECT ( vram_settings );
342
+#endif
340 343
 
341 344
 /*
342 345
  * Drag in selected keyboard map

+ 1
- 0
src/config/settings.h View File

@@ -13,6 +13,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
13 13
 //#define	CPUID_SETTINGS	/* CPUID settings */
14 14
 //#define	MEMMAP_SETTINGS	/* Memory map settings */
15 15
 //#define	VMWARE_SETTINGS	/* VMware GuestInfo settings */
16
+//#define	VRAM_SETTINGS	/* Video RAM dump settings */
16 17
 
17 18
 #include <config/named.h>
18 19
 #include NAMED_CONFIG(settings.h)

Loading…
Cancel
Save