mirror of
https://github.com/linuxboot/heads.git
synced 2024-12-18 20:47:55 +00:00
parent
265424b101
commit
c2ec62bfcd
4
Makefile
4
Makefile
@ -267,7 +267,7 @@ bin_modules-$(CONFIG_FLASHROM) += flashrom
|
||||
bin_modules-$(CONFIG_CRYPTSETUP) += cryptsetup
|
||||
bin_modules-$(CONFIG_GPG) += gpg
|
||||
bin_modules-$(CONFIG_LVM2) += lvm2
|
||||
bin_modules-$(CONFIG_XEN) += xen
|
||||
bin_modules-$(CONFIG_QUBES_VMM_XEN) += qubes-vmm-xen
|
||||
bin_modules-$(CONFIG_DROPBEAR) += dropbear
|
||||
|
||||
$(foreach m, $(bin_modules-y), \
|
||||
@ -279,7 +279,7 @@ $(foreach m, $(modules-y), \
|
||||
$(call map,initrd_lib_add,$(call libs,$m)) \
|
||||
)
|
||||
|
||||
#$(foreach _, $(call outputs,xen), $(eval $(call initrd_bin,$_)))
|
||||
#$(foreach _, $(call outputs,qubes-vmm-xen), $(eval $(call initrd_bin,$_)))
|
||||
|
||||
# hack to install busybox into the initrd
|
||||
initrd.cpio: busybox.intermediate
|
||||
|
@ -12,7 +12,7 @@ CONFIG_PCIUTILS=y
|
||||
CONFIG_POPT=y
|
||||
CONFIG_QRENCODE=y
|
||||
CONFIG_TPMTOTP=y
|
||||
CONFIG_XEN=y
|
||||
CONFIG_QUBES_VMM_XEN=y
|
||||
|
||||
CONFIG_LINUX_USB=y
|
||||
#CONFIG_LINUX_E1000E=y
|
||||
|
@ -14,7 +14,7 @@ CONFIG_POPT=y
|
||||
CONFIG_QRENCODE=y
|
||||
CONFIG_TPMTOTP=y
|
||||
CONFIG_DROPBEAR=y
|
||||
CONFIG_XEN=y
|
||||
CONFIG_QUBES_VMM_XEN=y
|
||||
|
||||
CONFIG_LINUX_USB=y
|
||||
CONFIG_LINUX_E1000=y
|
||||
|
@ -12,7 +12,7 @@ CONFIG_PCIUTILS=y
|
||||
CONFIG_POPT=y
|
||||
CONFIG_QRENCODE=y
|
||||
CONFIG_TPMTOTP=y
|
||||
CONFIG_XEN=y
|
||||
CONFIG_QUBES_VMM_XEN=y
|
||||
CONFIG_DROPBEAR=y
|
||||
|
||||
CONFIG_LINUX_USB=y
|
||||
|
@ -15,7 +15,7 @@ CONFIG_TPMTOTP=y
|
||||
CONFIG_DROPBEAR=y
|
||||
|
||||
# xen is not used on the MOC machines
|
||||
CONFIG_XEN=n
|
||||
CONFIG_QUBES_VMM_XEN=n
|
||||
|
||||
CONFIG_LINUX_USB=y
|
||||
CONFIG_LINUX_E1000E=y
|
||||
|
@ -12,7 +12,7 @@ CONFIG_PCIUTILS=y
|
||||
CONFIG_POPT=y
|
||||
CONFIG_QRENCODE=y
|
||||
CONFIG_TPMTOTP=y
|
||||
CONFIG_XEN=y
|
||||
CONFIG_QUBES_VMM_XEN=y
|
||||
CONFIG_DROPBEAR=y
|
||||
|
||||
CONFIG_LINUX_USB=y
|
||||
|
21
modules/qubes-vmm-xen
Normal file
21
modules/qubes-vmm-xen
Normal file
@ -0,0 +1,21 @@
|
||||
modules-$(CONFIG_QUBES_VMM_XEN) += qubes-vmm-xen
|
||||
|
||||
# We extract the entire Xen tree, but only use the xen/xen hypervisor
|
||||
# portion since Qubes provides the rest of it.
|
||||
xen_version := 4.6.5
|
||||
qubes-vmm-xen_version := $(xen_version)-28
|
||||
qubes-vmm-xen_dir := qubes-vmm-xen-$(qubes-vmm-xen_version)/
|
||||
qubes-vmm-xen_tar := qubes-vmm-xen-$(qubes-vmm-xen_version).tar.gz
|
||||
qubes-vmm-xen_url := https://github.com/QubesOS/qubes-vmm-xen/archive/v$(qubes-vmm-xen_version).tar.gz
|
||||
qubes-vmm-xen_hash := 314b01af6726ed7b09dfd72ff8b224636d822d432790765287abeedc81fd86b2
|
||||
|
||||
qubes-vmm-xen_depends := musl-cross
|
||||
|
||||
qubes-vmm-xen_output := xen-$(xen_version)/xen/xen.gz
|
||||
qubes-vmm-xen_configure :=
|
||||
|
||||
qubes-vmm-xen_target := \
|
||||
$(MAKE_JOBS) \
|
||||
$(CROSS_TOOLS_NOCC) \
|
||||
CC="$(CROSS)gcc -Wno-builtin-macro-redefined -D__FILE__=\\\"__FILE__\\\"" \
|
||||
xen.gz
|
20
modules/xen
20
modules/xen
@ -1,20 +0,0 @@
|
||||
modules-$(CONFIG_XEN) += xen
|
||||
|
||||
# We extract the entire Xen tree, but only use the xen/xen hypervisor
|
||||
# portion since Qubes provides the rest of it.
|
||||
xen_version := 4.6.4
|
||||
xen_dir := xen-$(xen_version)/xen
|
||||
xen_tar := xen-$(xen_version).tar.gz
|
||||
xen_url := http://bits.xensource.com/oss-xen/release/$(xen_version)/$(xen_tar)
|
||||
xen_hash := b795d5631a85fb68295361067195ecd00003656dacede4ec57533fce33ab5109
|
||||
|
||||
xen_depends := musl-cross
|
||||
|
||||
xen_output := xen.gz
|
||||
xen_configure :=
|
||||
|
||||
xen_target := \
|
||||
$(MAKE_JOBS) \
|
||||
$(CROSS_TOOLS_NOCC) \
|
||||
CC="$(CROSS)gcc -Wno-builtin-macro-redefined -D__FILE__=\\\"__FILE__\\\"" \
|
||||
|
1005
patches/qubes-vmm-xen-4.6.5-28.patch
Normal file
1005
patches/qubes-vmm-xen-4.6.5-28.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,942 +0,0 @@
|
||||
diff --recursive -u /home/hudson/build/clean/xen-4.6.3/xen/arch/x86/boot/head.S ./xen/arch/x86/boot/head.S
|
||||
--- /home/hudson/build/clean/xen-4.6.3/xen/arch/x86/boot/head.S 2016-06-20 08:08:22.000000000 -0400
|
||||
+++ xen/arch/x86/boot/head.S 2016-08-03 17:56:37.511121443 -0400
|
||||
@@ -86,6 +86,8 @@
|
||||
cmp $MULTIBOOT_BOOTLOADER_MAGIC,%eax
|
||||
jne not_multiboot
|
||||
|
||||
+#if 0
|
||||
+
|
||||
/* Set up trampoline segment 64k below EBDA */
|
||||
movzwl 0x40e,%eax /* EBDA segment */
|
||||
cmp $0xa000,%eax /* sanity check (high) */
|
||||
@@ -108,6 +110,12 @@
|
||||
shl $10-4,%edx
|
||||
cmp %eax,%edx /* compare with BDA value */
|
||||
cmovb %edx,%eax /* and use the smaller */
|
||||
+#else
|
||||
+ // coreboot does not provide an Extended BIOS Data Area pointer
|
||||
+ // just stash things the Multiboot structure, adjusted to bytes
|
||||
+ mov MB_mem_lower(%ebx),%eax
|
||||
+ shl $10-4,%eax
|
||||
+#endif
|
||||
|
||||
2: /* Reserve 64kb for the trampoline */
|
||||
sub $0x1000,%eax
|
||||
diff --recursive -u /home/hudson/build/clean/xen-4.6.3/xen/arch/x86/boot/mkelf32.c ./xen/arch/x86/boot/mkelf32.c
|
||||
--- /home/hudson/build/clean/xen-4.6.3/xen/arch/x86/boot/mkelf32.c 2016-06-20 08:08:22.000000000 -0400
|
||||
+++ xen/arch/x86/boot/mkelf32.c 2016-08-04 18:02:25.854371605 -0400
|
||||
@@ -231,14 +231,14 @@
|
||||
u32 loadbase, dat_siz, mem_siz;
|
||||
char *inimage, *outimage;
|
||||
int infd, outfd;
|
||||
- char buffer[1024];
|
||||
+ char buffer[1024] = {};
|
||||
int bytes, todo, i;
|
||||
|
||||
- Elf32_Ehdr in32_ehdr;
|
||||
- Elf32_Phdr in32_phdr;
|
||||
+ Elf32_Ehdr in32_ehdr = {};
|
||||
+ Elf32_Phdr in32_phdr = {};
|
||||
|
||||
- Elf64_Ehdr in64_ehdr;
|
||||
- Elf64_Phdr in64_phdr;
|
||||
+ Elf64_Ehdr in64_ehdr = {};
|
||||
+ Elf64_Phdr in64_phdr = {};
|
||||
|
||||
if ( argc != 5 )
|
||||
{
|
||||
diff --recursive -u /home/hudson/build/clean/xen-4.6.3/xen/drivers/video/vga.c ./xen/drivers/video/vga.c
|
||||
--- /home/hudson/build/clean/xen-4.6.3/xen/drivers/video/vga.c 2016-06-20 08:08:22.000000000 -0400
|
||||
+++ xen/drivers/video/vga.c 2016-08-03 18:03:38.241443543 -0400
|
||||
@@ -5,177 +5,691 @@
|
||||
*/
|
||||
|
||||
#include <xen/config.h>
|
||||
+#include <xen/compile.h>
|
||||
#include <xen/init.h>
|
||||
#include <xen/lib.h>
|
||||
#include <xen/mm.h>
|
||||
+#include <xen/errno.h>
|
||||
+#include <xen/event.h>
|
||||
+#include <xen/spinlock.h>
|
||||
+#include <xen/console.h>
|
||||
#include <xen/vga.h>
|
||||
-#include <xen/pci.h>
|
||||
#include <asm/io.h>
|
||||
+#include "font.h"
|
||||
|
||||
/* Filled in by arch boot code. */
|
||||
struct xen_vga_console_info vga_console_info;
|
||||
|
||||
-static int vgacon_keep;
|
||||
-static unsigned int xpos, ypos;
|
||||
-static unsigned char *video;
|
||||
|
||||
-static void vga_text_puts(const char *s);
|
||||
-static void vga_noop_puts(const char *s) {}
|
||||
-void (*video_puts)(const char *) = vga_noop_puts;
|
||||
-
|
||||
-/*
|
||||
- * 'vga=<mode-specifier>[,keep]' where <mode-specifier> is one of:
|
||||
- *
|
||||
- * 'vga=ask':
|
||||
- * display a vga menu of available modes
|
||||
- *
|
||||
- * 'vga=current':
|
||||
- * use the current vga mode without modification
|
||||
- *
|
||||
- * 'vga=text-80x<rows>':
|
||||
- * text mode, where <rows> is one of {25,28,30,34,43,50,60}
|
||||
- *
|
||||
- * 'vga=gfx-<width>x<height>x<depth>':
|
||||
- * graphics mode, e.g., vga=gfx-1024x768x16
|
||||
- *
|
||||
- * 'vga=mode-<mode>:
|
||||
- * specifies a mode as specified in 'vga=ask' menu
|
||||
- * (NB. menu modes are displayed in hex, so mode numbers here must
|
||||
- * be prefixed with '0x' (e.g., 'vga=mode-0x0318'))
|
||||
- *
|
||||
- * The option 'keep' causes Xen to continue to print to the VGA console even
|
||||
- * after domain 0 starts to boot. The default behaviour is to relinquish
|
||||
- * control of the console to domain 0.
|
||||
+/* Some of the code below is taken from SVGAlib. The original,
|
||||
+ unmodified copyright notice for that code is below. */
|
||||
+/* VGAlib version 1.2 - (c) 1993 Tommy Frandsen */
|
||||
+/* */
|
||||
+/* This library is free software; you can redistribute it and/or */
|
||||
+/* modify it without any restrictions. This library is distributed */
|
||||
+/* in the hope that it will be useful, but without any warranty. */
|
||||
+
|
||||
+/* Multi-chipset support Copyright 1993 Harm Hanemaayer */
|
||||
+/* partially copyrighted (C) 1993 by Hartmut Schirmer */
|
||||
+
|
||||
+/* VGA data register ports */
|
||||
+#define VGA_CRT_DC 0x3D5 /* CRT Controller Data Register - color emulation */
|
||||
+#define VGA_CRT_DM 0x3B5 /* CRT Controller Data Register - mono emulation */
|
||||
+#define VGA_ATT_R 0x3C1 /* Attribute Controller Data Read Register */
|
||||
+#define VGA_ATT_W 0x3C0 /* Attribute Controller Data Write Register */
|
||||
+#define VGA_GFX_D 0x3CF /* Graphics Controller Data Register */
|
||||
+#define VGA_SEQ_D 0x3C5 /* Sequencer Data Register */
|
||||
+#define VGA_MIS_R 0x3CC /* Misc Output Read Register */
|
||||
+#define VGA_MIS_W 0x3C2 /* Misc Output Write Register */
|
||||
+#define VGA_FTC_R 0x3CA /* Feature Control Read Register */
|
||||
+#define VGA_IS1_RC 0x3DA /* Input Status Register 1 - color emulation */
|
||||
+#define VGA_IS1_RM 0x3BA /* Input Status Register 1 - mono emulation */
|
||||
+#define VGA_PEL_D 0x3C9 /* PEL Data Register */
|
||||
+#define VGA_PEL_MSK 0x3C6 /* PEL mask register */
|
||||
+
|
||||
+/* EGA-specific registers */
|
||||
+#define EGA_GFX_E0 0x3CC /* Graphics enable processor 0 */
|
||||
+#define EGA_GFX_E1 0x3CA /* Graphics enable processor 1 */
|
||||
+
|
||||
+/* VGA index register ports */
|
||||
+#define VGA_CRT_IC 0x3D4 /* CRT Controller Index - color emulation */
|
||||
+#define VGA_CRT_IM 0x3B4 /* CRT Controller Index - mono emulation */
|
||||
+#define VGA_ATT_IW 0x3C0 /* Attribute Controller Index & Data Write Register */
|
||||
+#define VGA_GFX_I 0x3CE /* Graphics Controller Index */
|
||||
+#define VGA_SEQ_I 0x3C4 /* Sequencer Index */
|
||||
+#define VGA_PEL_IW 0x3C8 /* PEL Write Index */
|
||||
+#define VGA_PEL_IR 0x3C7 /* PEL Read Index */
|
||||
+
|
||||
+/* standard VGA indexes max counts */
|
||||
+#define VGA_CRT_C 0x19 /* Number of CRT Controller Registers */
|
||||
+#define VGA_ATT_C 0x15 /* Number of Attribute Controller Registers */
|
||||
+#define VGA_GFX_C 0x09 /* Number of Graphics Controller Registers */
|
||||
+#define VGA_SEQ_C 0x05 /* Number of Sequencer Registers */
|
||||
+#define VGA_MIS_C 0x01 /* Number of Misc Output Register */
|
||||
+
|
||||
+/* VGA misc register bit masks */
|
||||
+#define VGA_MIS_COLOR 0x01
|
||||
+#define VGA_MIS_ENB_MEM_ACCESS 0x02
|
||||
+#define VGA_MIS_DCLK_28322_720 0x04
|
||||
+#define VGA_MIS_ENB_PLL_LOAD (0x04 | 0x08)
|
||||
+#define VGA_MIS_SEL_HIGH_PAGE 0x20
|
||||
+
|
||||
+/* VGA CRT controller register indices */
|
||||
+#define VGA_CRTC_H_TOTAL 0
|
||||
+#define VGA_CRTC_H_DISP 1
|
||||
+#define VGA_CRTC_H_BLANK_START 2
|
||||
+#define VGA_CRTC_H_BLANK_END 3
|
||||
+#define VGA_CRTC_H_SYNC_START 4
|
||||
+#define VGA_CRTC_H_SYNC_END 5
|
||||
+#define VGA_CRTC_V_TOTAL 6
|
||||
+#define VGA_CRTC_OVERFLOW 7
|
||||
+#define VGA_CRTC_PRESET_ROW 8
|
||||
+#define VGA_CRTC_MAX_SCAN 9
|
||||
+#define VGA_CRTC_CURSOR_START 0x0A
|
||||
+#define VGA_CRTC_CURSOR_END 0x0B
|
||||
+#define VGA_CRTC_START_HI 0x0C
|
||||
+#define VGA_CRTC_START_LO 0x0D
|
||||
+#define VGA_CRTC_CURSOR_HI 0x0E
|
||||
+#define VGA_CRTC_CURSOR_LO 0x0F
|
||||
+#define VGA_CRTC_V_SYNC_START 0x10
|
||||
+#define VGA_CRTC_V_SYNC_END 0x11
|
||||
+#define VGA_CRTC_V_DISP_END 0x12
|
||||
+#define VGA_CRTC_OFFSET 0x13
|
||||
+#define VGA_CRTC_UNDERLINE 0x14
|
||||
+#define VGA_CRTC_V_BLANK_START 0x15
|
||||
+#define VGA_CRTC_V_BLANK_END 0x16
|
||||
+#define VGA_CRTC_MODE 0x17
|
||||
+#define VGA_CRTC_LINE_COMPARE 0x18
|
||||
+#define VGA_CRTC_REGS VGA_CRT_C
|
||||
+
|
||||
+/* VGA CRT controller bit masks */
|
||||
+#define VGA_CR11_LOCK_CR0_CR7 0x80 /* lock writes to CR0 - CR7 */
|
||||
+#define VGA_CR17_H_V_SIGNALS_ENABLED 0x80
|
||||
+
|
||||
+/* VGA attribute controller register indices */
|
||||
+#define VGA_ATC_PALETTE0 0x00
|
||||
+#define VGA_ATC_PALETTE1 0x01
|
||||
+#define VGA_ATC_PALETTE2 0x02
|
||||
+#define VGA_ATC_PALETTE3 0x03
|
||||
+#define VGA_ATC_PALETTE4 0x04
|
||||
+#define VGA_ATC_PALETTE5 0x05
|
||||
+#define VGA_ATC_PALETTE6 0x06
|
||||
+#define VGA_ATC_PALETTE7 0x07
|
||||
+#define VGA_ATC_PALETTE8 0x08
|
||||
+#define VGA_ATC_PALETTE9 0x09
|
||||
+#define VGA_ATC_PALETTEA 0x0A
|
||||
+#define VGA_ATC_PALETTEB 0x0B
|
||||
+#define VGA_ATC_PALETTEC 0x0C
|
||||
+#define VGA_ATC_PALETTED 0x0D
|
||||
+#define VGA_ATC_PALETTEE 0x0E
|
||||
+#define VGA_ATC_PALETTEF 0x0F
|
||||
+#define VGA_ATC_MODE 0x10
|
||||
+#define VGA_ATC_OVERSCAN 0x11
|
||||
+#define VGA_ATC_PLANE_ENABLE 0x12
|
||||
+#define VGA_ATC_PEL 0x13
|
||||
+#define VGA_ATC_COLOR_PAGE 0x14
|
||||
+
|
||||
+#define VGA_AR_ENABLE_DISPLAY 0x20
|
||||
+
|
||||
+/* VGA sequencer register indices */
|
||||
+#define VGA_SEQ_RESET 0x00
|
||||
+#define VGA_SEQ_CLOCK_MODE 0x01
|
||||
+#define VGA_SEQ_PLANE_WRITE 0x02
|
||||
+#define VGA_SEQ_CHARACTER_MAP 0x03
|
||||
+#define VGA_SEQ_MEMORY_MODE 0x04
|
||||
+
|
||||
+/* VGA sequencer register bit masks */
|
||||
+#define VGA_SR01_CHAR_CLK_8DOTS 0x01 /* bit 0: character clocks 8 dots wide are generated */
|
||||
+#define VGA_SR01_SCREEN_OFF 0x20 /* bit 5: Screen is off */
|
||||
+#define VGA_SR02_ALL_PLANES 0x0F /* bits 3-0: enable access to all planes */
|
||||
+#define VGA_SR04_EXT_MEM 0x02 /* bit 1: allows complete mem access to 256K */
|
||||
+#define VGA_SR04_SEQ_MODE 0x04 /* bit 2: directs system to use a sequential addressing mode */
|
||||
+#define VGA_SR04_CHN_4M 0x08 /* bit 3: selects modulo 4 addressing for CPU access to display memory */
|
||||
+
|
||||
+/* VGA graphics controller register indices */
|
||||
+#define VGA_GFX_SR_VALUE 0x00
|
||||
+#define VGA_GFX_SR_ENABLE 0x01
|
||||
+#define VGA_GFX_COMPARE_VALUE 0x02
|
||||
+#define VGA_GFX_DATA_ROTATE 0x03
|
||||
+#define VGA_GFX_PLANE_READ 0x04
|
||||
+#define VGA_GFX_MODE 0x05
|
||||
+#define VGA_GFX_MISC 0x06
|
||||
+#define VGA_GFX_COMPARE_MASK 0x07
|
||||
+#define VGA_GFX_BIT_MASK 0x08
|
||||
+
|
||||
+/* VGA graphics controller bit masks */
|
||||
+#define VGA_GR06_GRAPHICS_MODE 0x01
|
||||
+
|
||||
+/* macro for composing an 8-bit VGA register index and value
|
||||
+ * into a single 16-bit quantity */
|
||||
+#define VGA_OUT16VAL(v, r) (((v) << 8) | (r))
|
||||
+
|
||||
+#define vgabase 0 /* use in/out port-access macros */
|
||||
+#define VGA_OUTW_WRITE /* can use outw instead of 2xoutb */
|
||||
+
|
||||
+/*
|
||||
+ * generic VGA port read/write
|
||||
*/
|
||||
-static char __initdata opt_vga[30] = "";
|
||||
+
|
||||
+static inline uint8_t vga_io_r(uint16_t port)
|
||||
+{
|
||||
+ return inb(port);
|
||||
+}
|
||||
+
|
||||
+static inline void vga_io_w(uint16_t port, uint8_t val)
|
||||
+{
|
||||
+ outb(val, port);
|
||||
+}
|
||||
+
|
||||
+static inline void vga_io_w_fast(uint16_t port, uint8_t reg, uint8_t val)
|
||||
+{
|
||||
+ outw(VGA_OUT16VAL(val, reg), port);
|
||||
+}
|
||||
+
|
||||
+static inline uint8_t vga_mm_r(void __iomem *regbase, uint16_t port)
|
||||
+{
|
||||
+ return readb((char *)regbase + port);
|
||||
+}
|
||||
+
|
||||
+static inline void vga_mm_w(void __iomem *regbase, uint16_t port, uint8_t val)
|
||||
+{
|
||||
+ writeb(val, (char *)regbase + port);
|
||||
+}
|
||||
+
|
||||
+static inline void vga_mm_w_fast(void __iomem *regbase, uint16_t port, uint8_t reg, uint8_t val)
|
||||
+{
|
||||
+ writew(VGA_OUT16VAL(val, reg), (char *)regbase + port);
|
||||
+}
|
||||
+
|
||||
+static inline uint8_t vga_r(void __iomem *regbase, uint16_t port)
|
||||
+{
|
||||
+ if (regbase)
|
||||
+ return vga_mm_r(regbase, port);
|
||||
+ else
|
||||
+ return vga_io_r(port);
|
||||
+}
|
||||
+
|
||||
+static inline void vga_w(void __iomem *regbase, uint16_t port, uint8_t val)
|
||||
+{
|
||||
+ if (regbase)
|
||||
+ vga_mm_w(regbase, port, val);
|
||||
+ else
|
||||
+ vga_io_w(port, val);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static inline void vga_w_fast(void __iomem *regbase, uint16_t port, uint8_t reg, uint8_t val)
|
||||
+{
|
||||
+ if (regbase)
|
||||
+ vga_mm_w_fast(regbase, port, reg, val);
|
||||
+ else
|
||||
+ vga_io_w_fast(port, reg, val);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * VGA CRTC register read/write
|
||||
+ */
|
||||
+
|
||||
+static inline uint8_t vga_rcrt(void __iomem *regbase, uint8_t reg)
|
||||
+{
|
||||
+ vga_w(regbase, VGA_CRT_IC, reg);
|
||||
+ return vga_r(regbase, VGA_CRT_DC);
|
||||
+}
|
||||
+
|
||||
+static inline void vga_wcrt(void __iomem *regbase, uint8_t reg, uint8_t val)
|
||||
+{
|
||||
+#ifdef VGA_OUTW_WRITE
|
||||
+ vga_w_fast(regbase, VGA_CRT_IC, reg, val);
|
||||
+#else
|
||||
+ vga_w(regbase, VGA_CRT_IC, reg);
|
||||
+ vga_w(regbase, VGA_CRT_DC, val);
|
||||
+#endif /* VGA_OUTW_WRITE */
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * VGA sequencer register read/write
|
||||
+ */
|
||||
+
|
||||
+static inline uint8_t vga_rseq(void __iomem *regbase, uint8_t reg)
|
||||
+{
|
||||
+ vga_w(regbase, VGA_SEQ_I, reg);
|
||||
+ return vga_r(regbase, VGA_SEQ_D);
|
||||
+}
|
||||
+
|
||||
+static inline void vga_wseq(void __iomem *regbase, uint8_t reg, uint8_t val)
|
||||
+{
|
||||
+#ifdef VGA_OUTW_WRITE
|
||||
+ vga_w_fast(regbase, VGA_SEQ_I, reg, val);
|
||||
+#else
|
||||
+ vga_w(regbase, VGA_SEQ_I, reg);
|
||||
+ vga_w(regbase, VGA_SEQ_D, val);
|
||||
+#endif /* VGA_OUTW_WRITE */
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * VGA graphics controller register read/write
|
||||
+ */
|
||||
+
|
||||
+static inline uint8_t vga_rgfx(void __iomem *regbase, uint8_t reg)
|
||||
+{
|
||||
+ vga_w(regbase, VGA_GFX_I, reg);
|
||||
+ return vga_r(regbase, VGA_GFX_D);
|
||||
+}
|
||||
+
|
||||
+static inline void vga_wgfx(void __iomem *regbase, uint8_t reg, uint8_t val)
|
||||
+{
|
||||
+#ifdef VGA_OUTW_WRITE
|
||||
+ vga_w_fast(regbase, VGA_GFX_I, reg, val);
|
||||
+#else
|
||||
+ vga_w(regbase, VGA_GFX_I, reg);
|
||||
+ vga_w(regbase, VGA_GFX_D, val);
|
||||
+#endif /* VGA_OUTW_WRITE */
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * VGA attribute controller register read/write
|
||||
+ */
|
||||
+
|
||||
+static inline uint8_t vga_rattr(void __iomem *regbase, uint8_t reg)
|
||||
+{
|
||||
+ vga_w(regbase, VGA_ATT_IW, reg);
|
||||
+ return vga_r(regbase, VGA_ATT_R);
|
||||
+}
|
||||
+
|
||||
+static inline void vga_wattr(void __iomem *regbase, uint8_t reg, uint8_t val)
|
||||
+{
|
||||
+ vga_w(regbase, VGA_ATT_IW, reg);
|
||||
+ vga_w(regbase, VGA_ATT_W, val);
|
||||
+}
|
||||
+
|
||||
+static int detect_video(void *video_base)
|
||||
+{
|
||||
+ volatile u16 *p = (volatile u16 *)video_base;
|
||||
+ u16 saved1 = p[0], saved2 = p[1];
|
||||
+ int video_found = 1;
|
||||
+
|
||||
+ p[0] = 0xAA55;
|
||||
+ p[1] = 0x55AA;
|
||||
+ if ( (p[0] != 0xAA55) || (p[1] != 0x55AA) )
|
||||
+ video_found = 0;
|
||||
+
|
||||
+ p[0] = 0x55AA;
|
||||
+ p[1] = 0xAA55;
|
||||
+ if ( (p[0] != 0x55AA) || (p[1] != 0xAA55) )
|
||||
+ video_found = 0;
|
||||
+
|
||||
+ p[0] = saved1;
|
||||
+ p[1] = saved2;
|
||||
+
|
||||
+ return video_found;
|
||||
+}
|
||||
+
|
||||
+/* This is actually code from vgaHWRestore in an old version of XFree86 :-) */
|
||||
+void *setup_vga(void)
|
||||
+{
|
||||
+ /* The following VGA state was saved from a chip in text mode 3. */
|
||||
+ static unsigned char regs[] = {
|
||||
+ /* Sequencer registers */
|
||||
+ 0x03, 0x00, 0x03, 0x00, 0x02,
|
||||
+ /* CRTC registers */
|
||||
+ 0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f, 0x00, 0x4f, 0x20,
|
||||
+ 0x0e, 0x00, 0x00, 0x01, 0xe0, 0x9c, 0x8e, 0x8f, 0x28, 0x1f, 0x96,
|
||||
+ 0xb9, 0xa3, 0xff,
|
||||
+ /* Graphic registers */
|
||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff,
|
||||
+ /* Attribute registers */
|
||||
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3a,
|
||||
+ 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x0c, 0x00, 0x0f, 0x08, 0x00
|
||||
+ };
|
||||
+
|
||||
+ char *video;
|
||||
+ int i, j;
|
||||
+
|
||||
+ if ( page_is_ram_type(paddr_to_pfn(0xB8000), RAM_TYPE_CONVENTIONAL) )
|
||||
+ goto no_vga;
|
||||
+
|
||||
+ inb(VGA_IS1_RC);
|
||||
+ outb(0x00, VGA_ATT_IW);
|
||||
+
|
||||
+ for ( i = j = 0; i < 5; i++ )
|
||||
+ vga_wseq(vgabase, i, regs[j++]);
|
||||
+
|
||||
+ /* Ensure CRTC registers 0-7 are unlocked by clearing bit 7 of CRTC[17]. */
|
||||
+ vga_wcrt(vgabase, 17, regs[5+17] & 0x7F);
|
||||
+
|
||||
+ for ( i = 0; i < 25; i++ )
|
||||
+ vga_wcrt(vgabase, i, regs[j++]);
|
||||
+
|
||||
+ for ( i = 0; i < 9; i++ )
|
||||
+ vga_wgfx(vgabase, i, regs[j++]);
|
||||
+
|
||||
+ inb(VGA_IS1_RC);
|
||||
+ for ( i = 0; i < 21; i++ )
|
||||
+ vga_wattr(vgabase, i, regs[j++]);
|
||||
+
|
||||
+ inb(VGA_IS1_RC);
|
||||
+ outb(0x20, VGA_ATT_IW);
|
||||
+
|
||||
+ video = ioremap(0xB8000, 0x8000);
|
||||
+
|
||||
+ if ( !detect_video(video) )
|
||||
+ {
|
||||
+ iounmap(video);
|
||||
+ goto no_vga;
|
||||
+ }
|
||||
+
|
||||
+ return video;
|
||||
+
|
||||
+ no_vga:
|
||||
+ printk("No VGA adaptor detected!\n");
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static int vga_set_scanlines(unsigned scanlines)
|
||||
+{
|
||||
+ unsigned vtot, ovr, vss, vbs;
|
||||
+ uint8_t vse, vbe, misc = 0;
|
||||
+
|
||||
+ switch (scanlines) {
|
||||
+ case 43*8:
|
||||
+ vtot = 0x1bf;
|
||||
+ vss = 0x183;
|
||||
+ vse = 0x05;
|
||||
+ vbs = 0x163;
|
||||
+ vbe = 0xba;
|
||||
+ break;
|
||||
+ case 25*16:
|
||||
+ case 28*14:
|
||||
+ vtot = 0x1bf;
|
||||
+ vss = 0x19c;
|
||||
+ vse = 0x0e;
|
||||
+ vbs = 0x196;
|
||||
+ vbe = 0xb9;
|
||||
+ break;
|
||||
+ case 30*16:
|
||||
+ case 34*14:
|
||||
+ vtot = 0x20b;
|
||||
+ vss = 0x1ea;
|
||||
+ vse = 0x0c;
|
||||
+ vbs = 0x1e7;
|
||||
+ vbe = 0x04;
|
||||
+ /* Preserve clock select bits and color bit, set correct sync polarity. */
|
||||
+ misc = (inb(VGA_MIS_R) & 0x0d) | 0xe2;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -ENOSYS;
|
||||
+ }
|
||||
+
|
||||
+ ovr = vga_rcrt(vgabase, VGA_CRTC_OVERFLOW);
|
||||
+ if(vga_rcrt(vgabase, VGA_CRTC_V_DISP_END) + ((ovr & 0x02) << 7) + ((ovr & 0x40) << 3) == scanlines - 1)
|
||||
+ return 0;
|
||||
+
|
||||
+ ovr = (ovr & 0x10)
|
||||
+ | ((vtot >> 8) & 0x01)
|
||||
+ | ((vtot >> 4) & 0x20)
|
||||
+ | (((scanlines - 1) >> 7) & 0x02)
|
||||
+ | (((scanlines - 1) >> 3) & 0x40)
|
||||
+ | ((vss >> 6) & 0x04)
|
||||
+ | ((vss >> 2) & 0x80)
|
||||
+ | ((vbs >> 5) & 0x08);
|
||||
+ vse |= vga_rcrt(vgabase, VGA_CRTC_V_SYNC_END) & 0x70;
|
||||
+
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_V_SYNC_END, vse & 0x7f); /* Vertical sync end (also unlocks CR0-7) */
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_V_TOTAL, (uint8_t)vtot); /* Vertical total */
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_OVERFLOW, (uint8_t)ovr); /* Overflow */
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_V_SYNC_START, (uint8_t)vss); /* Vertical sync start */
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_V_SYNC_END, vse | 0x80); /* Vertical sync end (also locks CR0-7) */
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_V_DISP_END, (uint8_t)(scanlines - 1)); /* Vertical display end */
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_V_BLANK_START, (uint8_t)vbs); /* Vertical blank start */
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_V_BLANK_END, vbe); /* Vertical blank end */
|
||||
+
|
||||
+ if (misc)
|
||||
+ outb(misc, VGA_MIS_W); /* Misc output register */
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#define FONT_COUNT_MAX 256
|
||||
+#define FONT_HEIGHT_MAX 32
|
||||
+#define CHAR_MAP_SIZE (FONT_COUNT_MAX * FONT_HEIGHT_MAX)
|
||||
+
|
||||
+/*
|
||||
+ * We use font slot 0 because ATI cards do not honour changes to the
|
||||
+ * character map select register. The fontslot parameter can be used to
|
||||
+ * choose a non-default slot if the video card supports it and you wish to
|
||||
+ * preserve the BIOS-initialised font data.
|
||||
+ */
|
||||
+static unsigned font_slot = 0;
|
||||
+integer_param("fontslot", font_slot);
|
||||
+
|
||||
+static int vga_load_font(const struct font_desc *font, unsigned rows)
|
||||
+{
|
||||
+ unsigned fontheight = font ? font->height : 16;
|
||||
+ uint8_t fsr = vga_rcrt(vgabase, VGA_CRTC_MAX_SCAN); /* Font size register */
|
||||
+ int ret;
|
||||
+
|
||||
+ if (font_slot > 3 || (!font_slot && !font))
|
||||
+ return -ENOSYS;
|
||||
+
|
||||
+ if (font
|
||||
+ && (font->count > FONT_COUNT_MAX
|
||||
+ || fontheight > FONT_HEIGHT_MAX
|
||||
+ || font->width != 8))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ ret = vga_set_scanlines(rows * fontheight);
|
||||
+ if (ret < 0)
|
||||
+ return ret;
|
||||
+
|
||||
+ if ((fsr & 0x1f) == fontheight - 1)
|
||||
+ return 0;
|
||||
+
|
||||
+ /* First, the Sequencer */
|
||||
+ vga_wseq(vgabase, VGA_SEQ_RESET, 0x1);
|
||||
+ /* CPU writes only to map 2 */
|
||||
+ vga_wseq(vgabase, VGA_SEQ_PLANE_WRITE, 0x04);
|
||||
+ /* Sequential addressing */
|
||||
+ vga_wseq(vgabase, VGA_SEQ_MEMORY_MODE, 0x07);
|
||||
+ /* Clear synchronous reset */
|
||||
+ vga_wseq(vgabase, VGA_SEQ_RESET, 0x03);
|
||||
+
|
||||
+ /* Now, the graphics controller, select map 2 */
|
||||
+ vga_wgfx(vgabase, VGA_GFX_PLANE_READ, 0x02);
|
||||
+ /* disable odd-even addressing */
|
||||
+ vga_wgfx(vgabase, VGA_GFX_MODE, 0x00);
|
||||
+ /* map start at A000:0000 */
|
||||
+ vga_wgfx(vgabase, VGA_GFX_MISC, 0x00);
|
||||
+
|
||||
+ if ( font )
|
||||
+ {
|
||||
+ unsigned i, j;
|
||||
+ const uint8_t *data = font->data;
|
||||
+ uint8_t *map;
|
||||
+
|
||||
+ map = ioremap(0xA0000 + font_slot*2*CHAR_MAP_SIZE, CHAR_MAP_SIZE);
|
||||
+
|
||||
+ for ( i = j = 0; i < CHAR_MAP_SIZE; )
|
||||
+ {
|
||||
+ writeb(j < font->count * fontheight ? data[j++] : 0, map + i++);
|
||||
+ if ( !(j % fontheight) )
|
||||
+ while ( i & (FONT_HEIGHT_MAX - 1) )
|
||||
+ writeb(0, map + i++);
|
||||
+ }
|
||||
+
|
||||
+ iounmap(map);
|
||||
+ }
|
||||
+
|
||||
+ /* First, the sequencer, Synchronous reset */
|
||||
+ vga_wseq(vgabase, VGA_SEQ_RESET, 0x01);
|
||||
+ /* CPU writes to maps 0 and 1 */
|
||||
+ vga_wseq(vgabase, VGA_SEQ_PLANE_WRITE, 0x03);
|
||||
+ /* odd-even addressing */
|
||||
+ vga_wseq(vgabase, VGA_SEQ_MEMORY_MODE, 0x03);
|
||||
+ /* Character Map Select: The default font is kept in slot 0. */
|
||||
+ vga_wseq(vgabase, VGA_SEQ_CHARACTER_MAP,
|
||||
+ font ? font_slot | (font_slot << 2) : 0x00);
|
||||
+ /* clear synchronous reset */
|
||||
+ vga_wseq(vgabase, VGA_SEQ_RESET, 0x03);
|
||||
+
|
||||
+ /* Now, the graphics controller, select map 0 for CPU */
|
||||
+ vga_wgfx(vgabase, VGA_GFX_PLANE_READ, 0x00);
|
||||
+ /* enable even-odd addressing */
|
||||
+ vga_wgfx(vgabase, VGA_GFX_MODE, 0x10);
|
||||
+ /* map starts at b800:0 */
|
||||
+ vga_wgfx(vgabase, VGA_GFX_MISC, 0x0e);
|
||||
+
|
||||
+ /* Font size register */
|
||||
+ fsr = (fsr & 0xe0) + (fontheight - 1);
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_MAX_SCAN, fsr);
|
||||
+
|
||||
+ /* Cursor shape registers */
|
||||
+ fsr = vga_rcrt(vgabase, VGA_CRTC_CURSOR_END) & 0xe0;
|
||||
+ fsr |= fontheight - fontheight / 6;
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_CURSOR_END, fsr);
|
||||
+ fsr = vga_rcrt(vgabase, VGA_CRTC_CURSOR_START) & 0xe0;
|
||||
+ fsr |= (fsr & 0x1f) - 1;
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_CURSOR_START, fsr);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * HIGH-LEVEL INITIALISATION AND TEXT OUTPUT.
|
||||
+ */
|
||||
+
|
||||
+static int vgacon_enabled = 0;
|
||||
+static int vgacon_keep = 0;
|
||||
+static int vgacon_lines = 50;
|
||||
+static const struct font_desc *font;
|
||||
+
|
||||
+static int xpos, ypos;
|
||||
+static unsigned char *video;
|
||||
+
|
||||
+/* vga: comma-separated options. */
|
||||
+static char opt_vga[30] = "";
|
||||
string_param("vga", opt_vga);
|
||||
|
||||
/* VGA text-mode definitions. */
|
||||
-static unsigned int columns, lines;
|
||||
+#define COLUMNS 80
|
||||
+#define LINES vgacon_lines
|
||||
#define ATTRIBUTE 7
|
||||
+#define VIDEO_SIZE (COLUMNS * LINES * 2)
|
||||
|
||||
-#ifdef CONFIG_X86
|
||||
-void vesa_early_init(void);
|
||||
-void vesa_endboot(bool_t keep);
|
||||
-#else
|
||||
-#define vesa_early_init() ((void)0)
|
||||
-#define vesa_endboot(x) ((void)0)
|
||||
-#endif
|
||||
-
|
||||
-void __init video_init(void)
|
||||
+void video_init(void)
|
||||
{
|
||||
char *p;
|
||||
|
||||
- /* Look for 'keep' in comma-separated options. */
|
||||
for ( p = opt_vga; p != NULL; p = strchr(p, ',') )
|
||||
{
|
||||
if ( *p == ',' )
|
||||
p++;
|
||||
if ( strncmp(p, "keep", 4) == 0 )
|
||||
vgacon_keep = 1;
|
||||
+ else if ( strncmp(p, "text-80x", 8) == 0 )
|
||||
+ vgacon_lines = simple_strtoul(p + 8, NULL, 10);
|
||||
}
|
||||
|
||||
- switch ( vga_console_info.video_type )
|
||||
+ video = setup_vga();
|
||||
+ if ( !video )
|
||||
+ return;
|
||||
+
|
||||
+ switch ( vgacon_lines )
|
||||
{
|
||||
- case XEN_VGATYPE_TEXT_MODE_3:
|
||||
- if ( page_is_ram_type(paddr_to_pfn(0xB8000), RAM_TYPE_CONVENTIONAL) ||
|
||||
- ((video = ioremap(0xB8000, 0x8000)) == NULL) )
|
||||
- return;
|
||||
- outw(0x200a, 0x3d4); /* disable cursor */
|
||||
- columns = vga_console_info.u.text_mode_3.columns;
|
||||
- lines = vga_console_info.u.text_mode_3.rows;
|
||||
- memset(video, 0, columns * lines * 2);
|
||||
- video_puts = vga_text_puts;
|
||||
- break;
|
||||
- case XEN_VGATYPE_VESA_LFB:
|
||||
- case XEN_VGATYPE_EFI_LFB:
|
||||
- vesa_early_init();
|
||||
+ case 25:
|
||||
+ case 30:
|
||||
+ font = &font_vga_8x16;
|
||||
break;
|
||||
- default:
|
||||
- memset(&vga_console_info, 0, sizeof(vga_console_info));
|
||||
+ case 28:
|
||||
+ case 34:
|
||||
+ font = &font_vga_8x14;
|
||||
+ break;
|
||||
+ case 43:
|
||||
+ case 50:
|
||||
+ case 60:
|
||||
+ font = &font_vga_8x8;
|
||||
break;
|
||||
}
|
||||
+
|
||||
+ if ( (font == NULL) || (vga_load_font(font, vgacon_lines) < 0) )
|
||||
+ {
|
||||
+ vgacon_lines = 25;
|
||||
+ font = NULL;
|
||||
+ }
|
||||
+
|
||||
+ /* Clear the screen. */
|
||||
+ memset(video, 0, VIDEO_SIZE);
|
||||
+ xpos = ypos = 0;
|
||||
+
|
||||
+ /* Disable cursor. */
|
||||
+ vga_wcrt(vgabase, VGA_CRTC_CURSOR_START, 0x20);
|
||||
+
|
||||
+ vgacon_enabled = 1;
|
||||
}
|
||||
|
||||
-void __init video_endboot(void)
|
||||
+void video_endboot(void)
|
||||
{
|
||||
- if ( video_puts == vga_noop_puts )
|
||||
+ if ( !vgacon_enabled )
|
||||
return;
|
||||
|
||||
+ if ( !vgacon_keep )
|
||||
+ vgacon_enabled = 0;
|
||||
+
|
||||
printk("Xen is %s VGA console.\n",
|
||||
vgacon_keep ? "keeping" : "relinquishing");
|
||||
+}
|
||||
|
||||
- if ( !vgacon_keep )
|
||||
- video_puts = vga_noop_puts;
|
||||
- else
|
||||
- {
|
||||
- int bus, devfn;
|
||||
|
||||
- for ( bus = 0; bus < 256; ++bus )
|
||||
- for ( devfn = 0; devfn < 256; ++devfn )
|
||||
- {
|
||||
- const struct pci_dev *pdev;
|
||||
- u8 b = bus, df = devfn, sb;
|
||||
+static void put_newline(void)
|
||||
+{
|
||||
+ xpos = 0;
|
||||
+ ypos++;
|
||||
|
||||
- spin_lock(&pcidevs_lock);
|
||||
- pdev = pci_get_pdev(0, bus, devfn);
|
||||
- spin_unlock(&pcidevs_lock);
|
||||
-
|
||||
- if ( !pdev ||
|
||||
- pci_conf_read16(0, bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
|
||||
- PCI_CLASS_DEVICE) != 0x0300 ||
|
||||
- !(pci_conf_read16(0, bus, PCI_SLOT(devfn),
|
||||
- PCI_FUNC(devfn), PCI_COMMAND) &
|
||||
- (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) )
|
||||
- continue;
|
||||
-
|
||||
- while ( b )
|
||||
- {
|
||||
- switch ( find_upstream_bridge(0, &b, &df, &sb) )
|
||||
- {
|
||||
- case 0:
|
||||
- b = 0;
|
||||
- break;
|
||||
- case 1:
|
||||
- switch ( pci_conf_read8(0, b, PCI_SLOT(df),
|
||||
- PCI_FUNC(df),
|
||||
- PCI_HEADER_TYPE) )
|
||||
- {
|
||||
- case PCI_HEADER_TYPE_BRIDGE:
|
||||
- case PCI_HEADER_TYPE_CARDBUS:
|
||||
- if ( pci_conf_read16(0, b, PCI_SLOT(df),
|
||||
- PCI_FUNC(df),
|
||||
- PCI_BRIDGE_CONTROL) &
|
||||
- PCI_BRIDGE_CTL_VGA )
|
||||
- continue;
|
||||
- break;
|
||||
- }
|
||||
- break;
|
||||
- }
|
||||
- break;
|
||||
- }
|
||||
- if ( !b )
|
||||
- {
|
||||
- printk(XENLOG_INFO "Boot video device %02x:%02x.%u\n",
|
||||
- bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
|
||||
- pci_hide_device(bus, devfn);
|
||||
- }
|
||||
- }
|
||||
+ if ( ypos >= LINES )
|
||||
+ {
|
||||
+ ypos = LINES-1;
|
||||
+ memmove((char*)video,
|
||||
+ (char*)video + 2*COLUMNS, (LINES-1)*2*COLUMNS);
|
||||
+ memset((char*)video + (LINES-1)*2*COLUMNS, 0, 2*COLUMNS);
|
||||
}
|
||||
+}
|
||||
|
||||
- switch ( vga_console_info.video_type )
|
||||
+void vga_putchar(int c)
|
||||
+{
|
||||
+ if ( !vgacon_enabled )
|
||||
+ return;
|
||||
+
|
||||
+ if ( c == '\n' )
|
||||
{
|
||||
- case XEN_VGATYPE_TEXT_MODE_3:
|
||||
- if ( !vgacon_keep )
|
||||
- memset(video, 0, columns * lines * 2);
|
||||
- break;
|
||||
- case XEN_VGATYPE_VESA_LFB:
|
||||
- case XEN_VGATYPE_EFI_LFB:
|
||||
- vesa_endboot(vgacon_keep);
|
||||
- break;
|
||||
- default:
|
||||
- BUG();
|
||||
+ put_newline();
|
||||
}
|
||||
+ else
|
||||
+ {
|
||||
+ if ( xpos >= COLUMNS )
|
||||
+ put_newline();
|
||||
+ video[(xpos + ypos * COLUMNS) * 2] = c & 0xFF;
|
||||
+ video[(xpos + ypos * COLUMNS) * 2 + 1] = ATTRIBUTE;
|
||||
+ ++xpos;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+
|
||||
+int fill_console_start_info(struct dom0_vga_console_info *ci)
|
||||
+{
|
||||
+ memset(ci, 0, sizeof(*ci));
|
||||
+
|
||||
+ if ( !vgacon_enabled )
|
||||
+ return 0;
|
||||
+
|
||||
+ ci->video_type = XEN_VGATYPE_TEXT_MODE_3;
|
||||
+ ci->u.text_mode_3.rows = LINES;
|
||||
+ ci->u.text_mode_3.columns = COLUMNS;
|
||||
+ ci->u.text_mode_3.cursor_x = 0;
|
||||
+ ci->u.text_mode_3.cursor_y = LINES - 1;
|
||||
+ ci->u.text_mode_3.font_height = font ? font->height : 16;
|
||||
+
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
static void vga_text_puts(const char *s)
|
||||
@@ -184,28 +698,25 @@
|
||||
|
||||
while ( (c = *s++) != '\0' )
|
||||
{
|
||||
- if ( (c == '\n') || (xpos >= columns) )
|
||||
+ if ( (c == '\n') || (xpos >= COLUMNS) )
|
||||
{
|
||||
- if ( ++ypos >= lines )
|
||||
+ if ( ++ypos >= LINES )
|
||||
{
|
||||
- ypos = lines - 1;
|
||||
- memmove(video, video + 2 * columns, ypos * 2 * columns);
|
||||
- memset(video + ypos * 2 * columns, 0, 2 * xpos);
|
||||
+ ypos = LINES - 1;
|
||||
+ memmove(video, video + 2 * COLUMNS, ypos * 2 * COLUMNS);
|
||||
+ memset(video + ypos * 2 * COLUMNS, 0, 2 * xpos);
|
||||
}
|
||||
xpos = 0;
|
||||
}
|
||||
|
||||
if ( c != '\n' )
|
||||
{
|
||||
- video[(xpos + ypos * columns) * 2] = c;
|
||||
- video[(xpos + ypos * columns) * 2 + 1] = ATTRIBUTE;
|
||||
+ video[(xpos + ypos * COLUMNS) * 2] = c;
|
||||
+ video[(xpos + ypos * COLUMNS) * 2 + 1] = ATTRIBUTE;
|
||||
xpos++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-int __init fill_console_start_info(struct dom0_vga_console_info *ci)
|
||||
-{
|
||||
- memcpy(ci, &vga_console_info, sizeof(*ci));
|
||||
- return 1;
|
||||
-}
|
||||
+// hard code it to always go to vga
|
||||
+void (*video_puts)(const char *) = vga_text_puts;
|
||||
diff --recursive -u /home/hudson/build/clean/xen-4.6.3/xen/Makefile ./xen/Makefile
|
||||
--- /home/hudson/build/clean/xen-4.6.3/xen/Makefile 2016-06-20 08:08:22.000000000 -0400
|
||||
+++ xen/Makefile 2016-08-04 17:50:04.888970103 -0400
|
||||
@@ -6,11 +6,17 @@
|
||||
export XEN_FULLVERSION = $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION)
|
||||
-include xen-version
|
||||
|
||||
-export XEN_WHOAMI ?= $(USER)
|
||||
-export XEN_DOMAIN ?= $(shell ([ -x /bin/dnsdomainname ] && /bin/dnsdomainname) || ([ -x /bin/domainname ] && /bin/domainname || echo [unknown]))
|
||||
-export XEN_BUILD_DATE ?= $(shell LC_ALL=C date)
|
||||
-export XEN_BUILD_TIME ?= $(shell LC_ALL=C date +%T)
|
||||
-export XEN_BUILD_HOST ?= $(shell hostname)
|
||||
+#export XEN_WHOAMI ?= $(USER)
|
||||
+#export XEN_DOMAIN ?= $(shell ([ -x /bin/dnsdomainname ] && /bin/dnsdomainname) || ([ -x /bin/domainname ] && /bin/domainname || echo [unknown]))
|
||||
+#export XEN_BUILD_DATE ?= $(shell LC_ALL=C date)
|
||||
+#export XEN_BUILD_TIME ?= $(shell LC_ALL=C date +%T)
|
||||
+#export XEN_BUILD_HOST ?= $(shell hostname)
|
||||
+
|
||||
+export XEN_WHOAMI ?= user
|
||||
+export XEN_DOMAIN ?= domain
|
||||
+export XEN_BUILD_DATE ?= 1970-01-01
|
||||
+export XEN_BUILD_TIME ?= 00:00:00
|
||||
+export XEN_BUILD_HOST ?= xen-buildhost
|
||||
|
||||
export BASEDIR := $(CURDIR)
|
||||
export XEN_ROOT := $(BASEDIR)/..
|
||||
@@ -97,7 +103,7 @@
|
||||
rm -f tags TAGS cscope.files cscope.in.out cscope.out cscope.po.out GTAGS GPATH GRTAGS GSYMS
|
||||
|
||||
$(TARGET).gz: $(TARGET)
|
||||
- gzip -f -9 < $< > $@.new
|
||||
+ gzip -n -f -9 < $< > $@.new
|
||||
mv $@.new $@
|
||||
|
||||
$(TARGET): delete-unfresh-files
|
Loading…
Reference in New Issue
Block a user