code:
#!/usr/bin/env bash

# Copyright (C) 2016 Paul Kocialkowski <contact@paulk.fr>
#
# 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 3 of the License, or
# (at your option) 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, see <http://www.gnu.org/licenses/>.

arguments() {
	project_arguments_targets "$project" "$@"
}

usage() {
	project_usage_actions "$project"
	project_usage_arguments "$project" "$@"
}

download() {
	local repository="$project"

	project_download_git "$project" "$repository" 'https://git.seabios.org/seabios.git' "$@" || \
	project_download_git "$project" "$repository" 'https://review.coreboot.org/cgit/seabios.git/' "$@"
}

download_check() {
	local repository="$project"

	project_download_check_git "$project" "$repository" "$@"
}

extract() {
	project_extract "$project" "$@"
}

extract_check() {
	project_extract_check "$project" "$@"
}

update() {
	local repository="$project"

	project_update_git "$project" "$repository" "$@"
}

update_check() {
	local repository="$project"

	project_update_check_git "$project" "$repository" "$@"
}

build() {
	local target="$1"
	local repository="$project"

	project_sources_directory_missing_empty_error "$project" "$repository" "$@"

	if git_project_check "$repository"; then
		git_project_checkout "$project" "$repository" "$@"
	fi

	local project_path="$(project_path "$project")"
	local seabios_config_path="$(project_file_path "$project" "$CONFIGS" 'config' "$@")"
	local sources_path="$(project_sources_path "$project" "$repository" "$@")"
	local build_path="$(project_build_path "$project" "$@")"

	mkdir -p "$build_path"
	cp "$seabios_config_path" "$sources_path/.config"

	make -C "$sources_path" OUT="$build_path/" -j"$TASKS"
	make -C "$sources_path" distclean

	rm -f "$sources_path/.config"
}

build_check() {
	project_build_check "$project" "$@"
}

install() {
	project_install "$project" "$@"
}

install_check() {
	project_install_check "$project" "$@"
}

release() {
	local repository="$project"

	project_release_install_archive "$project" "$IMAGES" "$@"
	project_release_sources_git "$project" "$repository" "$@"
}

release_check() {
	local repository="$project"

	project_release_install_archive_check "$project" "$IMAGES" "$@"
	project_release_check_sources_git "$project" "$repository" "$@"
}

clean() {
	project_clean "$project" "$@"
}

path: projects/seabios/seabios


code:
tests/devkeys/firmware_bmpfv.bin
tests/devkeys-pkc/firmware_bmpfv.bin
tests/futility/data/bios_link_mp.bin
tests/futility/data/bios_mario_mp.bin
tests/futility/data/bios_peppy_mp.bin
tests/futility/data/bios_zgb_mp.bin
tests/futility/data/dingdong.signed
tests/futility/data/dingdong.unsigned
tests/futility/data/fw_gbb.bin
tests/futility/data/fw_vblock.bin
tests/futility/data/hoho.signed
tests/futility/data/hoho.unsigned
tests/futility/data/kern_preamble.bin
tests/futility/data/minimuffin.signed
tests/futility/data/minimuffin.unsigned
tests/futility/data/rec_kernel_part.bin
tests/futility/data/vmlinuz-amd64.bin
tests/futility/data/vmlinuz-arm.bin
tests/futility/data/zinger_mp_image.bin
tests/futility/data/zinger.signed
tests/futility/data/zinger.unsigned
tests/preamble_tests

path: projects/vboot/configs/blobs

license: mit


code:
bdb/sha.c
bdb/bdb_create.c
cgpt/cgpt_wrapper.c
firmware/lib/tpm_lite/include/tlcl_structures.h
firmware/lib/cgptlib/crc32.c
firmware/lib/cryptolib/padding.c
firmware/2lib/2sha512.c
firmware/2lib/2sha256.c
firmware/bdb/secrets.c
futility/cmd_gbb_utility.c
scripts/image_signing/tag_image.sh
scripts/image_signing/strip_boot_from_image.sh
scripts/image_signing/make_dev_ssd.sh
scripts/image_signing/tofactory.sh
scripts/image_signing/sign_official_build.sh
scripts/image_signing/sign_nv_cbootimage.sh
tests/rsa_padding_test.h
tests/bdb_sprw_test.c
tests/crc32_test.c
tests/vb2_api_tests.c
tests/sha_test_vectors.h
tests/gen_preamble_testdata.sh
tests/load_kernel_tests.sh
tests/vb21_host_misc_tests.c
tests/run_vbutil_kernel_arg_tests.sh
tests/cgptlib_test.c
tests/vb2_sha_tests.c
tests/futility/test_file_types.c
tests/futility/test_file_types.sh
tests/futility/test_dump_fmap.sh
tests/testcases/padding_test_vectors.inc
utility/bmpblk_font.c
utility/vbutil_what_keys

path: projects/vboot/configs/blobs-ignore


code:
./3rdparty/vboot/tests/testcases/padding_test_vectors.inc
It's not a blob, see tests/rsa_padding_test.h for explanation.

The text in this file is CC-BY-SA 4.0 or higher. All contributions to it must
be made under the same license.


code:
devices
tools

path: projects/vboot/configs/targets


code:
cgpt/cgpt:cgpt
futility/futility:futility
utility/crossystem:crossystem
utility/tpmc:tpmc
devkeys:devkeys

path: projects/vboot/configs/tools/install


code:
From 0e8e89b19a4e47802ed6ea64a35da77665cc3d3f Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Mon, 10 Aug 2015 20:33:23 +0200
Subject: [PATCH 1/7] firmware: Developer mode timeout delay shortening (down
 to 3 seconds)

A timeout delay of 3 seconds, with no bip, is much more appreciable for users.

Change-Id: If4bc879f350a4a0297395077e4f55e89f4fa764d
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
 firmware/lib/vboot_audio.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/firmware/lib/vboot_audio.c b/firmware/lib/vboot_audio.c
index 8f31171..7e92dc7 100644
--- a/firmware/lib/vboot_audio.c
+++ b/firmware/lib/vboot_audio.c
@@ -30,11 +30,7 @@
 #define MAX_CUSTOM_DELAY      300000

 /* These are visible externally only to make testing easier */
-VbDevMusicNote default_notes_[] = { {20000, 0}, /* 20 seconds */
-                                    {250, 400}, /* two beeps */
-                                    {250, 0},
-                                    {250, 400},
-                                    {9250, 0} }; /* total 30 seconds */
+VbDevMusicNote default_notes_[] = { {3000, 0} }; /* three seconds */
 uint32_t default_count_ = sizeof(default_notes_) / sizeof(VbDevMusicNote);

 VbDevMusicNote short_notes_[] = { {2000, 0} }; /* two seconds */
--
2.10.2


code:
From 5f402b9d365dbc17ea68803aeb9a95da01708b9f Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Mon, 10 Aug 2015 22:44:50 +0200
Subject: [PATCH 2/7] firmware: Text-based screen display in priority

This allows showing text-based screen displays before looking at the GBB bitmaps
since those encourage the use of non-free software (Chrome OS) and don't display
enough information to the user.

Change-Id: I1dc454cd5de1cf096a15957832a8114d4f758eac
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
 firmware/lib/vboot_display.c | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/firmware/lib/vboot_display.c b/firmware/lib/vboot_display.c
index 1abed92..50a2e54 100644
--- a/firmware/lib/vboot_display.c
+++ b/firmware/lib/vboot_display.c
@@ -335,20 +335,18 @@ static VbError_t VbDisplayScreenLegacy(VbCommonParams *cparams, uint32_t screen,
 	/* If the screen is blank, turn off the backlight; else turn it on. */
 	VbExDisplayBacklight(VB_SCREEN_BLANK == screen ? 0 : 1);

-	/* Look in the GBB first */
-	if (VBERROR_SUCCESS == VbDisplayScreenFromGBB(cparams, screen,
-						      vncptr, locale))
+	/* Display default first */
+	if (VBERROR_SUCCESS == VbExDisplayScreen(screen, locale))
 		return VBERROR_SUCCESS;

-	/* If screen wasn't in the GBB bitmaps, fall back to a default */
-	return VbExDisplayScreen(screen, locale);
+	/* If default doesn't have anything to show, fall back to GBB bitmaps */
+	return VbDisplayScreenFromGBB(cparams, screen, vncptr, locale);
 }

 VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen,
 			  int force, VbNvContext *vncptr)
 {
 	uint32_t locale;
-	GoogleBinaryBlockHeader *gbb = cparams->gbb;
 	VbError_t rv;

 	/* If requested screen is the same as the current one, we're done. */
@@ -358,11 +356,8 @@ VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen,
 	/* Read the locale last saved */
 	VbNvGet(vncptr, VBNV_LOCALIZATION_INDEX, &locale);

-	if (gbb->bmpfv_size == 0)
-		rv = VbExDisplayScreen(screen, locale);
-	else
-		rv = VbDisplayScreenLegacy(cparams, screen, force, vncptr,
-					   locale);
+	rv = VbDisplayScreenLegacy(cparams, screen, force, vncptr,
+				   locale);

 	if (rv == VBERROR_SUCCESS)
 		/* Keep track of the currently displayed screen */
--
2.10.2


code:
From 78297c1fa4a158047e7bfa8bf0b3435fe498811d Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Mon, 10 Aug 2015 22:59:50 +0200
Subject: [PATCH 3/7] firmware: Hold key combination in developer mode

This binds the Ctrl + H key combination to hold the developer mode screen.

Change-Id: Ia76080eacd2e5e78b35b83d0f3783bfa5137794a
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
 firmware/lib/vboot_api_kernel.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index e465fc3..2e31f08 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -308,6 +308,7 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
 	uint32_t use_legacy = 0;
 	uint32_t default_boot = 0;
 	uint32_t ctrl_d_pressed = 0;
+	uint32_t hold = 0;

 	VbAudioContext *audio = 0;

@@ -473,6 +474,12 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
 			ctrl_d_pressed = 1;
 			goto fallout;
 			break;
+		case 0x08:
+			/* Ctrl+H = hold */
+			VBDEBUG(("VbBootDeveloper() - "
+				 "hold developer mode screen\n"));
+			hold = 1;
+			break;
 		case 0x0c:
 			VBDEBUG(("VbBootDeveloper() - "
 				 "user pressed Ctrl+L; Try legacy boot\n"));
@@ -523,7 +530,7 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
 			VbCheckDisplayKey(cparams, key, &vnc);
 			break;
 		}
-	} while(VbAudioLooping(audio));
+	} while(hold || VbAudioLooping(audio));

  fallout:

--
2.10.2


code:
From 4560df9f84e342ef51cf071dccd01e3fb5838a37 Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Mon, 10 Aug 2015 23:13:49 +0200
Subject: [PATCH 4/7] firmware: Screen blank and wait at disabled USB boot
 warning

This blanks the screen before showing the disabled USB boot warning.
It also waits for the user to press any key to come back to the developer mode
screen.

Change-Id: Ic23f1e0f8d269242a9b7af6941806951016e6eb4
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
 firmware/lib/vboot_api_kernel.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index 2e31f08..5cf45ec 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -376,6 +376,7 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
 		}
 	}

+developer_mode_screen:
 	/* Show the dev mode warning screen */
 	VbDisplayScreen(cparams, VB_SCREEN_DEVELOPER_WARNING, 0, &vnc);

@@ -498,14 +499,23 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
 			if (!allow_usb) {
 				VBDEBUG(("VbBootDeveloper() - "
 					 "USB booting is disabled\n"));
+
+				VbDisplayScreen(cparams, VB_SCREEN_BLANK, 1,
+						&vnc);
+
 				VbExDisplayDebugInfo(
 					"WARNING: Booting from external media "
 					"(USB/SD) has not been enabled. Refer "
 					"to the developer-mode documentation "
-					"for details.\n");
+					"for details.\n\n"
+					"Press any key to continue.\n\n");
 				VbExBeep(120, 400);
 				VbExSleepMs(120);
 				VbExBeep(120, 400);
+
+				while (!VbExKeyboardRead()) ;
+
+				goto developer_mode_screen;
 			} else {
 				/*
 				 * Clear the screen to show we get the Ctrl+U
--
2.10.2


code:
From 457f2227845335bed16b190499278a887eca3939 Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Mon, 10 Aug 2015 23:53:48 +0200
Subject: [PATCH 5/7] firmware: Separate screen and wait at device information
 screen

This blanks the screen (instead of redrawing it) at device information and
waits for the user to press any key to come back to the developer mode screen.

Change-Id: I16364e69ce5bbaba5689f9f7af29c593ddea8558
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
 firmware/lib/vboot_api_kernel.c | 12 ++++++++++++
 firmware/lib/vboot_display.c    | 13 ++++++++-----
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index 5cf45ec..53ef5c7 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -481,6 +481,18 @@ developer_mode_screen:
 				 "hold developer mode screen\n"));
 			hold = 1;
 			break;
+		case 0x09:
+			/* Ctrl+I = device information */
+			VBDEBUG(("VbBootDeveloper() - "
+				 "device info\n"));
+
+			hold = 1;
+			VbDisplayDebugInfo(cparams, &vnc);
+
+			while (!VbExKeyboardRead()) ;
+
+			goto developer_mode_screen;
+			break;
 		case 0x0c:
 			VBDEBUG(("VbBootDeveloper() - "
 				 "user pressed Ctrl+L; Try legacy boot\n"));
diff --git a/firmware/lib/vboot_display.c b/firmware/lib/vboot_display.c
index 50a2e54..6d8ed92 100644
--- a/firmware/lib/vboot_display.c
+++ b/firmware/lib/vboot_display.c
@@ -544,7 +544,7 @@ const char *RecoveryReasonString(uint8_t code)
 	return "We have no idea what this means";
 }

-#define DEBUG_INFO_SIZE 512
+#define DEBUG_INFO_SIZE 768

 VbError_t VbDisplayDebugInfo(VbCommonParams *cparams, VbNvContext *vncptr)
 {
@@ -559,8 +559,8 @@ VbError_t VbDisplayDebugInfo(VbCommonParams *cparams, VbNvContext *vncptr)
 	VbError_t ret;
 	uint32_t i;

-	/* Redisplay current screen to overwrite any previous debug output */
-	VbDisplayScreen(cparams, disp_current_screen, 1, vncptr);
+	/* Blank screen */
+	VbDisplayScreen(cparams, VB_SCREEN_BLANK, 1, vncptr);

 	/* Add hardware ID */
 	VbRegionReadHWID(cparams, hwid, sizeof(hwid));
@@ -669,8 +669,11 @@ VbError_t VbDisplayDebugInfo(VbCommonParams *cparams, VbNvContext *vncptr)
 		used += StrnAppend(buf + used, sha1sum, DEBUG_INFO_SIZE - used);
 	}

-	/* Make sure we finish with a newline */
-	used += StrnAppend(buf + used, "\n", DEBUG_INFO_SIZE - used);
+	/* Make sure we finish with newlines */
+	used += StrnAppend(buf + used, "\n\n", DEBUG_INFO_SIZE - used);
+
+	used += StrnAppend(buf + used, "Press any key to continue\n\n",
+			   DEBUG_INFO_SIZE - used);

 	/* TODO: add more interesting data:
 	 * - Information on current disks */
--
2.10.2


code:
From 95a6212c5eef956289ab6a70ba0debb89508ce99 Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Tue, 11 Aug 2015 00:07:18 +0200
Subject: [PATCH 6/7] firmware: Localization keys removal

Since we're using a text-based interface, binding the arrow keys to localization
changes has no effect and only makes the screen flicker.

Change-Id: I92dfe63d9d0826217653e29d3f26fb0ab29071f1
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
 firmware/lib/vboot_api_kernel.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index 53ef5c7..e03e042 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -273,7 +273,6 @@ int VbUserConfirms(VbCommonParams *cparams, uint32_t confirm_flags)
 					return 1;
 				}
 			}
-			VbCheckDisplayKey(cparams, key, &vnc);
 		}
 		VbExSleepMs(CONFIRM_KEY_DELAY);
 	}
@@ -549,7 +548,6 @@ developer_mode_screen:
 			break;
 		default:
 			VBDEBUG(("VbBootDeveloper() - pressed key %d\n", key));
-			VbCheckDisplayKey(cparams, key, &vnc);
 			break;
 		}
 	} while(hold || VbAudioLooping(audio));
@@ -613,7 +611,6 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p)
 		VbDisplayScreen(cparams, VB_SCREEN_OS_BROKEN, 0, &vnc);
 		VBDEBUG(("VbBootRecovery() waiting for manual recovery\n"));
 		while (1) {
-			VbCheckDisplayKey(cparams, VbExKeyboardRead(), &vnc);
 			if (VbWantShutdown(cparams->gbb->flags))
 				return VBERROR_SHUTDOWN_REQUESTED;
 			VbExSleepMs(REC_KEY_DELAY);
@@ -711,8 +708,6 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p)
 					i = 4;
 					break;
 				}
-			} else {
-				VbCheckDisplayKey(cparams, key, &vnc);
 			}
 			if (VbWantShutdown(cparams->gbb->flags))
 				return VBERROR_SHUTDOWN_REQUESTED;
--
2.10.2


code:
From aecef39cda6a70c99bf0caff0452e47ad43a68d8 Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Sun, 10 Jul 2016 23:43:16 +0200
Subject: [PATCH 7/7] firmware: Pass VbDisplayInfo information structure to
 VbExDisplayScreen

This provides VbExDisplayScreen with an information structure
(VbDisplayInfo) that contains various context information for display.

Change-Id: Id9e07bb418f64e9286f07da11314cd63f925e301
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
 firmware/include/vboot_api.h         | 12 +++++++++-
 firmware/lib/include/vboot_display.h |  2 +-
 firmware/lib/vboot_api_kernel.c      | 44 ++++++++++++++++++++++++------------
 firmware/lib/vboot_display.c         | 15 ++++++------
 firmware/stub/vboot_api_stub.c       |  3 ++-
 tests/vboot_api_devmode_tests.c      |  3 ++-
 tests/vboot_api_kernel2_tests.c      |  2 +-
 tests/vboot_api_kernel3_tests.c      |  2 +-
 8 files changed, 55 insertions(+), 28 deletions(-)

diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h
index 950c1e2..ba53101 100644
--- a/firmware/include/vboot_api.h
+++ b/firmware/include/vboot_api.h
@@ -697,6 +697,15 @@ enum VbScreenType_t {
 	VB_SCREEN_OS_BROKEN         = 0x208,
 };

+/* Information on display context */
+typedef struct VbDisplayInfo {
+	uint32_t allow_usb;
+	uint32_t allow_legacy;
+	uint32_t use_usb;
+	uint32_t use_legacy;
+	uint32_t signed_only;
+} VbDisplayInfo;
+
 /**
  * Initialize and clear the display.  Set width and height to the screen
  * dimensions in pixels.
@@ -725,7 +734,8 @@ VbError_t VbExDisplaySetDimension(uint32_t width, uint32_t height);
  * to be simple ASCII text such as "NO GOOD" or "INSERT"; these screens should
  * only be seen during development.
  */
-VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale);
+VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
+			    VbDisplayInfo *info);

 /**
  * Write an image to the display, with the upper left corner at the specified
diff --git a/firmware/lib/include/vboot_display.h b/firmware/lib/include/vboot_display.h
index 0ab93f0..0574580 100644
--- a/firmware/lib/include/vboot_display.h
+++ b/firmware/lib/include/vboot_display.h
@@ -15,7 +15,7 @@
 VbError_t VbDisplayScreenFromGBB(VbCommonParams *cparams, uint32_t screen,
                                  VbNvContext *vncptr, uint32_t locale);
 VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen, int force,
-                          VbNvContext *vncptr);
+                          VbNvContext *vncptr, VbDisplayInfo *info);
 VbError_t VbDisplayDebugInfo(VbCommonParams *cparams, VbNvContext *vncptr);
 VbError_t VbCheckDisplayKey(VbCommonParams *cparams, uint32_t key,
                             VbNvContext *vncptr);
diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index e03e042..7dcc754 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -300,11 +300,13 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
 	VbSharedDataHeader *shared =
 		(VbSharedDataHeader *)cparams->shared_data_blob;

+	VbDisplayInfo info;
 	uint32_t allow_usb = 0;
 	uint32_t allow_legacy = 0;
 	uint32_t disable_dev_boot = 0;
 	uint32_t use_usb = 0;
 	uint32_t use_legacy = 0;
+	uint32_t signed_only = 0;
 	uint32_t default_boot = 0;
 	uint32_t ctrl_d_pressed = 0;
 	uint32_t hold = 0;
@@ -350,10 +352,22 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
 		}
 	}

+	VbNvGet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &signed_only);
+
+	if (fwmp.flags & FWMP_DEV_ENABLE_OFFICIAL_ONLY)
+		signed_only = 1;
+
+	info.allow_usb = allow_usb;
+	info.allow_legacy = allow_legacy;
+	info.use_usb = use_usb;
+	info.use_legacy = use_legacy;
+	info.signed_only = signed_only;
+
 	/* If dev mode is disabled, only allow TONORM */
 	while (disable_dev_boot) {
 		VBDEBUG(("%s() - dev_disable_boot is set.\n", __func__));
-		VbDisplayScreen(cparams, VB_SCREEN_DEVELOPER_TO_NORM, 0, &vnc);
+		VbDisplayScreen(cparams, VB_SCREEN_DEVELOPER_TO_NORM, 0, &vnc,
+				NULL);
 		VbExDisplayDebugInfo(dev_disable_msg);

 		/* Ignore space in VbUserConfirms()... */
@@ -363,7 +377,7 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
 			VbNvSet(&vnc, VBNV_DISABLE_DEV_REQUEST, 1);
 			VbDisplayScreen(cparams,
 					VB_SCREEN_TO_NORM_CONFIRMED,
-					0, &vnc);
+					0, &vnc, NULL);
 			VbExSleepMs(5000);
 			return VBERROR_REBOOT_REQUIRED;
 		case -1:
@@ -377,7 +391,7 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)

 developer_mode_screen:
 	/* Show the dev mode warning screen */
-	VbDisplayScreen(cparams, VB_SCREEN_DEVELOPER_WARNING, 0, &vnc);
+	VbDisplayScreen(cparams, VB_SCREEN_DEVELOPER_WARNING, 0, &vnc, &info);

 	/* Get audio/delay context */
 	audio = VbAudioOpen(cparams);
@@ -425,7 +439,7 @@ developer_mode_screen:
 				}
 				VbDisplayScreen(cparams,
 						VB_SCREEN_DEVELOPER_TO_NORM,
-						0, &vnc);
+						0, &vnc, NULL);
 				/* Ignore space in VbUserConfirms()... */
 				switch (VbUserConfirms(cparams, 0)) {
 				case 1:
@@ -436,7 +450,7 @@ developer_mode_screen:
 					VbDisplayScreen(
 						cparams,
 						VB_SCREEN_TO_NORM_CONFIRMED,
-						0, &vnc);
+						0, &vnc, NULL);
 					VbExSleepMs(5000);
 					return VBERROR_REBOOT_REQUIRED;
 				case -1:
@@ -450,7 +464,7 @@ developer_mode_screen:
 					VbDisplayScreen(
 						cparams,
 						VB_SCREEN_DEVELOPER_WARNING,
-						0, &vnc);
+						0, &vnc, &info);
 					/* Start new countdown */
 					audio = VbAudioOpen(cparams);
 				}
@@ -512,7 +526,7 @@ developer_mode_screen:
 					 "USB booting is disabled\n"));

 				VbDisplayScreen(cparams, VB_SCREEN_BLANK, 1,
-						&vnc);
+						&vnc, NULL);

 				VbExDisplayDebugInfo(
 					"WARNING: Booting from external media "
@@ -533,7 +547,7 @@ developer_mode_screen:
 				 * key press.
 				 */
 				VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0,
-						&vnc);
+						&vnc, NULL);
 				if (VBERROR_SUCCESS == VbTryUsb(cparams, p)) {
 					VbAudioClose(audio);
 					return VBERROR_SUCCESS;
@@ -542,7 +556,7 @@ developer_mode_screen:
 					VbDisplayScreen(
 						cparams,
 						VB_SCREEN_DEVELOPER_WARNING,
-						0, &vnc);
+						0, &vnc, &info);
 				}
 			}
 			break;
@@ -608,7 +622,7 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p)
 				shared->recovery_reason));
 		VbSetRecoverySubcode(shared->recovery_reason);
 		VbNvCommit();
-		VbDisplayScreen(cparams, VB_SCREEN_OS_BROKEN, 0, &vnc);
+		VbDisplayScreen(cparams, VB_SCREEN_OS_BROKEN, 0, &vnc, NULL);
 		VBDEBUG(("VbBootRecovery() waiting for manual recovery\n"));
 		while (1) {
 			if (VbWantShutdown(cparams->gbb->flags))
@@ -637,7 +651,7 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p)
 		VbDisplayScreen(cparams, VBERROR_NO_DISK_FOUND == retval ?
 				VB_SCREEN_RECOVERY_INSERT :
 				VB_SCREEN_RECOVERY_NO_GOOD,
-				0, &vnc);
+				0, &vnc, NULL);

 		/*
 		 * Scan keyboard more frequently than media, since x86
@@ -677,7 +691,7 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p)
 				/* Ask the user to confirm entering dev-mode */
 				VbDisplayScreen(cparams,
 						VB_SCREEN_RECOVERY_TO_DEV,
-						0, &vnc);
+						0, &vnc, NULL);
 				/* SPACE means no... */
 				uint32_t vbc_flags =
 					VB_CONFIRM_SPACE_MEANS_NO |
@@ -839,7 +853,7 @@ static VbError_t EcUpdateImage(int devidx, VbCommonParams *cparams,
 			return VBERROR_VGA_OPROM_MISMATCH;
 		}

-		VbDisplayScreen(cparams, VB_SCREEN_WAIT, 0, &vnc);
+		VbDisplayScreen(cparams, VB_SCREEN_WAIT, 0, &vnc, NULL);
 	}

 	rv = VbExEcUpdateImage(devidx, select, expected, expected_size);
@@ -1250,13 +1264,13 @@ VbError_t VbSelectAndLoadKernel(VbCommonParams *cparams,
 		p.boot_flags |= BOOT_FLAG_RECOVERY;
 		retval = VbBootRecovery(cparams, &p);
 		VbExEcEnteringMode(0, VB_EC_RECOVERY);
-		VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc);
+		VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc, NULL);

 	} else if (p.boot_flags & BOOT_FLAG_DEVELOPER) {
 		/* Developer boot */
 		retval = VbBootDeveloper(cparams, &p);
 		VbExEcEnteringMode(0, VB_EC_DEVELOPER);
-		VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc);
+		VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc, NULL);

 	} else {
 		/* Normal boot */
diff --git a/firmware/lib/vboot_display.c b/firmware/lib/vboot_display.c
index 6d8ed92..84b7961 100644
--- a/firmware/lib/vboot_display.c
+++ b/firmware/lib/vboot_display.c
@@ -321,7 +321,7 @@ VbError_t VbDisplayScreenFromGBB(VbCommonParams *cparams, uint32_t screen,
  */
 static VbError_t VbDisplayScreenLegacy(VbCommonParams *cparams, uint32_t screen,
 				       int force, VbNvContext *vncptr,
-				       uint32_t locale)
+				       uint32_t locale, VbDisplayInfo *info)
 {
 	VbError_t retval;

@@ -336,7 +336,7 @@ static VbError_t VbDisplayScreenLegacy(VbCommonParams *cparams, uint32_t screen,
 	VbExDisplayBacklight(VB_SCREEN_BLANK == screen ? 0 : 1);

 	/* Display default first */
-	if (VBERROR_SUCCESS == VbExDisplayScreen(screen, locale))
+	if (VBERROR_SUCCESS == VbExDisplayScreen(screen, locale, info))
 		return VBERROR_SUCCESS;

 	/* If default doesn't have anything to show, fall back to GBB bitmaps */
@@ -344,7 +344,7 @@ static VbError_t VbDisplayScreenLegacy(VbCommonParams *cparams, uint32_t screen,
 }

 VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen,
-			  int force, VbNvContext *vncptr)
+			  int force, VbNvContext *vncptr, VbDisplayInfo *info)
 {
 	uint32_t locale;
 	VbError_t rv;
@@ -357,7 +357,7 @@ VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen,
 	VbNvGet(vncptr, VBNV_LOCALIZATION_INDEX, &locale);

 	rv = VbDisplayScreenLegacy(cparams, screen, force, vncptr,
-				   locale);
+				   locale, info);

 	if (rv == VBERROR_SUCCESS)
 		/* Keep track of the currently displayed screen */
@@ -560,7 +560,7 @@ VbError_t VbDisplayDebugInfo(VbCommonParams *cparams, VbNvContext *vncptr)
 	uint32_t i;

 	/* Blank screen */
-	VbDisplayScreen(cparams, VB_SCREEN_BLANK, 1, vncptr);
+	VbDisplayScreen(cparams, VB_SCREEN_BLANK, 1, vncptr, NULL);

 	/* Add hardware ID */
 	VbRegionReadHWID(cparams, hwid, sizeof(hwid));
@@ -725,13 +725,14 @@ VbError_t VbCheckDisplayKey(VbCommonParams *cparams, uint32_t key,
 #endif

 		/* Force redraw of current screen */
-		return VbDisplayScreen(cparams, disp_current_screen, 1, vncptr);
+		return VbDisplayScreen(cparams, disp_current_screen, 1, vncptr,
+				       NULL);
 	}

 	if (0 == memcmp(MagicBuffer, MAGIC_WORD, MAGIC_WORD_LEN)) {
 		if (VBEASTEREGG)
 			(void)VbDisplayScreen(cparams, disp_current_screen,
-					      1, vncptr);
+					      1, vncptr, NULL);
 	}

   return VBERROR_SUCCESS;
diff --git a/firmware/stub/vboot_api_stub.c b/firmware/stub/vboot_api_stub.c
index 717c0f8..c086195 100644
--- a/firmware/stub/vboot_api_stub.c
+++ b/firmware/stub/vboot_api_stub.c
@@ -41,7 +41,8 @@ VbError_t VbExDisplaySetDimension(uint32_t width, uint32_t height)
 	return VBERROR_SUCCESS;
 }

-VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale)
+VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
+			    VbDisplayInfo *info)
 {
 	return VBERROR_SUCCESS;
 }
diff --git a/tests/vboot_api_devmode_tests.c b/tests/vboot_api_devmode_tests.c
index abd8e85..6e8afbd 100644
--- a/tests/vboot_api_devmode_tests.c
+++ b/tests/vboot_api_devmode_tests.c
@@ -265,7 +265,8 @@ VbError_t VbExBeep(uint32_t msec, uint32_t frequency) {
   return beep_return;
 }

-VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale) {
+VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
+			    VbDisplayInfo *info) {
   switch(screen_type) {
   case VB_SCREEN_BLANK:
     VBDEBUG(("VbExDisplayScreen(BLANK)\n"));
diff --git a/tests/vboot_api_kernel2_tests.c b/tests/vboot_api_kernel2_tests.c
index 433933b..d44fc1e 100644
--- a/tests/vboot_api_kernel2_tests.c
+++ b/tests/vboot_api_kernel2_tests.c
@@ -185,7 +185,7 @@ uint32_t VbTryLoadKernel(VbCommonParams *cparams, LoadKernelParams *p,
 }

 VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen, int force,
-                          VbNvContext *vncptr)
+                          VbNvContext *vncptr, VbDisplayInfo *info)
 {
 	if (screens_count < ARRAY_SIZE(screens_displayed))
 		screens_displayed[screens_count++] = screen;
diff --git a/tests/vboot_api_kernel3_tests.c b/tests/vboot_api_kernel3_tests.c
index 3eddb73..0403c71 100644
--- a/tests/vboot_api_kernel3_tests.c
+++ b/tests/vboot_api_kernel3_tests.c
@@ -195,7 +195,7 @@ VbError_t VbExEcUpdateImage(int devidx, enum VbSelectFirmware_t select,
 }

 VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen, int force,
-                          VbNvContext *vncptr)
+                          VbNvContext *vncptr, VbDisplayInfo *info)
 {
 	if (screens_count < ARRAY_SIZE(screens_displayed))
 		screens_displayed[screens_count++] = screen;
--
2.10.2


code:
#!/usr/bin/env bash

# Copyright (C) 2016 Paul Kocialkowski <contact@paulk.fr>
#
# 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 3 of the License, or
# (at your option) 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, see <http://www.gnu.org/licenses/>.

arguments() {
	project_arguments_targets "$project" "$@"
}

usage() {
	project_usage_actions "$project" "checkout"
	project_usage_arguments "$project" "$@"
}

download() {
	local repository=$project

	project_download_git "$project" "$repository" "https://chromium.googlesource.com/chromiumos/platform/vboot_reference https://review.coreboot.org/vboot.git https://github.com/coreboot/vboot.git" "$@"
}

download_check() {
	project_download_check_git "$project" "$repository" "$@"
}

extract() {
	project_extract "$project" "$@"
}

extract_check() {
	project_extract_check "$project" "$@"
}

update() {
	local repository=$project

	project_update_git "$project" "$repository" "$@"
}

update_check() {
	local repository=$project

	project_update_check_git "$project" "$repository" "$@"
}

checkout() {
	local repository=$project

	if git_project_check "$repository"
	then
		git_project_checkout "$project" "$repository" "$@"
	fi
}

build() {
	local target=$1

	local repository=$project

	project_sources_directory_missing_empty_error "$project" "$repository" "$@"

	if git_project_check "$repository"
	then
		git_project_checkout "$project" "$repository" "$@"
	fi

	if [[ "$target" = "tools" ]]
	then
		local sources_path=$(project_sources_path "$project" "$repository" "$@")
		local build_path=$(project_build_path "$project" "$@")

		mkdir -p "$build_path"

		make -C "$sources_path" BUILD="$build_path" -j$TASKS "host_stuff"
		make -C "$sources_path" BUILD="$build_path" -j$TASKS "host_stuff"

		cp -r "$sources_path/tests/devkeys" "$build_path"
	fi
}

build_check() {
	local target=$1

	if [[ "$target" = "tools" ]]
	then
		project_build_check "$project" "$@"
	fi
}

install() {
	local target=$1

	if [[ "$target" = "tools" ]]
	then
		project_install "$project" "$@"
	fi
}

install_check() {
	local target=$1

	if [[ "$target" = "tools" ]]
	then
		project_install_check "$project" "$@"
	fi
}

release() {
	local target=$1

	local repository=$project

	if [[ "$target" = "tools" ]]
	then
		project_release_install_archive "$project" "$TOOLS" "$@"
	fi

	project_release_sources_git "$project" "$repository" "$@"
}

release_check() {
	local target=$1

	local repository=$project

	if [[ "$target" = "tools" ]]
	then
		project_release_install_archive_check "$project" "$TOOLS" "$@"
	fi

	project_release_check_sources_git "$project" "$repository" "$@"
}

clean() {
	project_clean "$project" "$@"
}

path: projects/vboot/vboot


code:
#!/usr/bin/env bash

# Copyright (C) 2016 Paul Kocialkowski <contact@paulk.fr>
#
# 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 3 of the License, or
# (at your option) 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, see <http://www.gnu.org/licenses/>.

download() {
	local repository=$project

	project_download_git "$project" "$repository" "https://chromium.googlesource.com/chromiumos/platform/vpd" "$@"
}

download_check() {
	local repository=$project

	project_download_check_git "$project" "$repository" "$@"
}

extract() {
	local repository=$project

	project_extract "$project" "$@"
}

extract_check() {
	local repository=$project

	project_extract_check "$project" "$@"
}

update() {
	local repository=$project

	project_update_git "$project" "$repository" "$@"
}

update_check() {
	local repository=$project

	project_update_check_git "$project" "$repository" "$@"
}

build() {
	local repository=$project

	project_sources_directory_missing_empty_error "$project" "$repository" "$@"

	local sources_path=$(project_sources_path "$project" "$repository" "$@")
	local build_path=$(project_build_path "$project" "$@")

	if git_project_check "$repository"
	then
		git_project_checkout "$project" "$repository" "$@"
	fi

	mkdir -p "$build_path"

	make -C "$sources_path" "vpd"

	cp "$sources_path/vpd" "$build_path"

	make -C "$sources_path" "clean"
}

build_check() {
	project_build_check "$project" "$@"
}

install() {
	project_install "$project" "$@"
}

install_check() {
	project_install_check "$project" "$@"
}

release() {
	local repository=$project

	project_release_install_archive "$project" "$TOOLS" "$@"

	project_release_sources_git "$project" "$repository" "$@"
}

release_check() {
	local repository=$project

	project_release_install_archive_check "$project" "$TOOLS" "$@"

	project_release_check_sources_git "$project" "$repository" "$@"
}

clean() {
	project_clean "$project" "$@"
}

path: projects/vpd/vpd


code:
From 63312528ea81207865077ab2c75963e3660859f0 Mon Sep 17 00:00:00 2001
From: Leah Rowe <info@minifree.org>
Date: Sat, 14 Feb 2015 00:56:43 +0000
Subject: [PATCH] Makefile: don't use git

---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 68541e6..b5f43d5 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 CC:=gcc
 OBJ:=bucts.o
-VERSION:=$(shell git describe)
+VERSION:=withoutgit

 ifeq ($(shell uname), FreeBSD)
 	CFLAGS = -I/usr/local/include
--
1.9.1


code:
diff --git a/Makefile b/Makefile
index 68541e6..b8579eb 100644
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@ endif
 all: bucts

 bucts: $(OBJ)
-	$(CC) -o $@ $(OBJ) $(LDFLAGS) -lpci
+	$(CC) -o $@ $(OBJ) $(LDFLAGS) -lpci -lz -static

 %.o: %.c
 	$(CC) $(CFLAGS) -DVERSION='"$(VERSION)"' -c $<


code:
From 52a0b55c77635dc026793e66d516e3aed335706a Mon Sep 17 00:00:00 2001
From: Leah Rowe <info@minifree.org>
Date: Fri, 11 Mar 2016 06:35:03 +0000
Subject: [PATCH 1/1] New laptops whitelisted: ThinkPad R400 and ThinkPad T500

Support for these laptops was merged in coreboot a while ago, so it makes sense
for flashrom to whitelist them.
---
 board_enable.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/board_enable.c b/board_enable.c
index 7b152d1..1d56203 100644
--- a/board_enable.c
+++ b/board_enable.c
@@ -2427,7 +2427,9 @@ const struct board_match board_matches[] = {
 	{0x8086, 0x7190,      0,      0,  0x8086, 0x7110,      0,      0, "^SE440BX-2$", NULL, NULL,          P3, "Intel",       "SE440BX-2",             0,   NT, intel_piix4_gpo27_lower},
 	{0x1022, 0x7468,      0,      0,  0x1022, 0x7460,      0,      0, NULL,         "iwill", "dk8_htx",   P3, "IWILL",       "DK8-HTX",               0,   OK, w83627hf_gpio24_raise_2e},
 	{0x8086, 0x27A0, 0x8086, 0x27a0,  0x8086, 0x27b8, 0x8086, 0x27b8, NULL,        "kontron", "986lcd-m", P3, "Kontron",     "986LCD-M",              0,   OK, board_kontron_986lcd_m},
+    {0x8086, 0x2917, 0x17AA, 0x20F5,  0x8086, 0x2930, 0x17AA, 0x20F9, "^ThinkPad R400", NULL, NULL,      P2, "IBM/Lenovo",  "ThinkPad R400",         0,   OK, p2_whitelist_laptop},
 	{0x8086, 0x2917, 0x17AA, 0x20F5,  0x8086, 0x2930, 0x17AA, 0x20F9, "^ThinkPad T400", NULL, NULL,       P2, "IBM/Lenovo",  "ThinkPad T400",         0,   OK, p2_whitelist_laptop},
+    {0x8086, 0x2917, 0x17AA, 0x20F5,  0x8086, 0x2930, 0x17AA, 0x20F9, "^ThinkPad T500", NULL, NULL,      P2, "IBM/Lenovo",  "ThinkPad T500",         0,   OK, p2_whitelist_laptop},
 	{0x8086, 0x1E22, 0x17AA, 0x21F6,  0x8086, 0x1E55, 0x17AA, 0x21F6, "^ThinkPad T530", NULL, NULL,       P2, "IBM/Lenovo",  "ThinkPad T530",         0,   OK, p2_whitelist_laptop},
 	{0x8086, 0x27a0, 0x17aa, 0x2015,  0x8086, 0x27b9, 0x17aa, 0x2009, "^ThinkPad T60", NULL, NULL,        P2, "IBM/Lenovo",  "ThinkPad T60",          0,   OK, p2_whitelist_laptop},
 	{0x8086, 0x27a0, 0x17aa, 0x2017,  0x8086, 0x27b9, 0x17aa, 0x2009, "^ThinkPad T60", NULL, NULL,        P2, "IBM/Lenovo",  "ThinkPad T60(s)",       0,   OK, p2_whitelist_laptop},
--
1.9.1


code:
From b1828512abf58911cfb829cb6a98d4e8dbefadc2 Mon Sep 17 00:00:00 2001
From: Leah Rowe <info@minifree.org>
Date: Fri, 11 Mar 2016 06:38:39 +0000
Subject: [PATCH 1/1] Add whitelist for Taurinus X200 laptop

---
 board_enable.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/board_enable.c b/board_enable.c
index 1d56203..a71061c 100644
--- a/board_enable.c
+++ b/board_enable.c
@@ -2437,6 +2437,7 @@ const struct board_match board_matches[] = {
 	{0x8086, 0x3B07, 0x17AA, 0x2166,  0x8086, 0x3B30, 0x17AA, 0x2167, "^Lenovo X201", NULL, NULL,         P2, "IBM/Lenovo",  "ThinkPad X201",         0,   OK, p2_whitelist_laptop},
 	{0x8086, 0x1E22, 0x17AA, 0x21FA,  0x8086, 0x1E55, 0x17AA, 0x21FA, "^ThinkPad X230", NULL, NULL,       P2, "IBM/Lenovo",  "ThinkPad X230",         0,   OK, p2_whitelist_laptop},
 	{0x8086, 0x27A0, 0x17AA, 0x2017,  0x8086, 0x27B9, 0x17AA, 0x2009, "^ThinkPad X60", NULL, NULL,        P2, "IBM/Lenovo",  "ThinkPad X60(s)",       0,   OK, p2_whitelist_laptop},
+	{0x8086, 0x2917, 0x17AA, 0x20F5,  0x8086, 0x2930, 0x17AA, 0x20F9, "^Taurinus X200", "Libiquity", "Taurinus X200", P2, "Libiquity", "ThinkPad X200", 0, OK, p2_whitelist_laptop},
 	{0x8086, 0x2411, 0x8086, 0x2411,  0x8086, 0x7125, 0x0e11, 0xb165, NULL,         NULL, NULL,           P3, "Mitac",       "6513WU",                0,   OK, board_mitac_6513wu},
 	{0x8086, 0x8186, 0x8086, 0x8186,  0x8086, 0x8800,      0,      0, "^MSC Vertriebs GmbH$", NULL, NULL, P2, "MSC",         "Q7-TCTC",               0,   OK, p2_not_a_laptop},
 	{0x8086, 0x7190,      0,      0,  0x8086, 0x7110,      0,      0, "^MS-6163 (i440BX)$", NULL, NULL,   P3, "MSI",         "MS-6163 (MS-6163 Pro)", 0,   OK, intel_piix4_gpo14_raise},
--
1.9.1


code:
From 260f0e096b385c9f53e9a28e79293131a11122a6 Mon Sep 17 00:00:00 2001
From: Leah Rowe <info@minifree.org>
Date: Fri, 11 Mar 2016 06:50:50 +0000
Subject: [PATCH 1/1] purged chips

---
 flashchips.c | 303 -----------------------------------------------------------
 1 file changed, 303 deletions(-)

diff --git a/flashchips.c b/flashchips.c
index 0fc1b7a..5c94304 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -7451,80 +7451,6 @@ const struct flashchip flashchips[] = {

 	{
 		.vendor		= "Macronix",
-		.name		= "MX25L1605",
-		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L1605,
-		.total_size	= 2048,
-		.page_size	= 256,
-		.feature_bits	= FEATURE_WRSR_WREN,
-		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
-		.probe_timing	= TIMING_ZERO,
-		.block_erasers	=
-		{
-			{
-				.eraseblocks = { {64 * 1024, 32} },
-				.block_erase = spi_block_erase_20,
-			}, {
-				.eraseblocks = { {64 * 1024, 32} },
-				.block_erase = spi_block_erase_d8,
-			}, {
-				.eraseblocks = { {2 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_60,
-			}, {
-				.eraseblocks = { {2 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_c7,
-			},
-		},
-		.printlock	= spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
-		.unlock		= spi_disable_blockprotect,
-		.write		= spi_chip_write_256,
-		.read		= spi_chip_read, /* Fast read (0x0B) supported */
-		.voltage	= {2700, 3600},
-	},
-
-	{
-		.vendor		= "Macronix",
-		.name		= "MX25L1605A/MX25L1606E/MX25L1608E",
-		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L1605,
-		.total_size	= 2048,
-		.page_size	= 256,
-		/* OTP: 64B total; enter 0xB1, exit 0xC1 (MX25L1606E and MX25L1608E only) */
-		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
-		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
-		.probe_timing	= TIMING_ZERO,
-		.block_erasers	=
-		{
-			{
-				.eraseblocks = { {4 * 1024, 512} },
-				.block_erase = spi_block_erase_20,
-			}, {
-				.eraseblocks = { {64 * 1024, 32} },
-				.block_erase = spi_block_erase_52,
-			}, {
-				.eraseblocks = { {64 * 1024, 32} },
-				.block_erase = spi_block_erase_d8,
-			}, {
-				.eraseblocks = { {2 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_60,
-			}, {
-				.eraseblocks = { {2 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_c7,
-			},
-		},
-		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* MX25L1605A bp2 only */
-		.unlock		= spi_disable_blockprotect_bp3_srwd,
-		.write		= spi_chip_write_256,
-		.read		= spi_chip_read, /* Fast read (0x0B) supported (MX25L1608E supports dual-I/O read) */
-		.voltage	= {2700, 3600},
-	},
-
-	{
-		.vendor		= "Macronix",
 		.name		= "MX25L1605D/MX25L1608D/MX25L1673E",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= MACRONIX_ID,
@@ -7632,41 +7558,6 @@ const struct flashchip flashchips[] = {

 	{
 		.vendor		= "Macronix",
-		.name		= "MX25L3205(A)",
-		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L3205,
-		.total_size	= 4096,
-		.page_size	= 256,
-		.feature_bits	= FEATURE_WRSR_WREN,
-		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
-		.probe_timing	= TIMING_ZERO,
-		.block_erasers	=
-		{
-			{
-				.eraseblocks = { {64 * 1024, 64} },
-				.block_erase = spi_block_erase_20,
-			}, {
-				.eraseblocks = { {64 * 1024, 64} },
-				.block_erase = spi_block_erase_d8,
-			}, {
-				.eraseblocks = { {4 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_60,
-			}, {
-				.eraseblocks = { {4 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_c7,
-			},
-		},
-		.printlock	= spi_prettyprint_status_register_bp2_srwd, /* bit6: error flag */
-		.unlock		= spi_disable_blockprotect,
-		.write		= spi_chip_write_256,
-		.read		= spi_chip_read, /* Fast read (0x0B) supported */
-		.voltage	= {2700, 3600},
-	},
-
-	{
-		.vendor		= "Macronix",
 		.name		= "MX25L3205D/MX25L3208D",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= MACRONIX_ID,
@@ -7703,84 +7594,6 @@ const struct flashchip flashchips[] = {

 	{
 		.vendor		= "Macronix",
-		.name		= "MX25L3206E/MX25L3208E",
-		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L3205,
-		.total_size	= 4096,
-		.page_size	= 256,
-		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
-		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
-		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
-		.probe_timing	= TIMING_ZERO,
-		.block_erasers	=
-		{
-			{
-				.eraseblocks = { {4 * 1024, 1024} },
-				.block_erase = spi_block_erase_20,
-			}, {
-				.eraseblocks = { {64 * 1024, 64} },
-				.block_erase = spi_block_erase_d8,
-			}, {
-				.eraseblocks = { {64 * 1024, 64} },
-				.block_erase = spi_block_erase_52,
-			}, {
-				.eraseblocks = { {4 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_60,
-			}, {
-				.eraseblocks = { {4 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_c7,
-			},
-		},
-		.printlock	= spi_prettyprint_status_register_bp3_srwd,
-		.unlock		= spi_disable_blockprotect_bp3_srwd,
-		.write		= spi_chip_write_256,
-		.read		= spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
-		.voltage	= {2700, 3600},
-	},
-
-	{
-		.vendor		= "Macronix",
-		.name		= "MX25L3273E",
-		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L3205,
-		.total_size	= 4096,
-		.page_size	= 256,
-		/* OTP: 64B total; enter 0xB1, exit 0xC1 */
-		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
-		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
-		.probe_timing	= TIMING_ZERO,
-		.block_erasers	=
-		{
-			{
-				.eraseblocks = { {4 * 1024, 1024} },
-				.block_erase = spi_block_erase_20,
-			}, {
-				.eraseblocks = { {32 * 1024, 128} },
-				.block_erase = spi_block_erase_52,
-			}, {
-				.eraseblocks = { {64 * 1024, 64} },
-				.block_erase = spi_block_erase_d8,
-			}, {
-				.eraseblocks = { {4 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_60,
-			}, {
-				.eraseblocks = { {4 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_c7,
-			},
-		},
-		.printlock	= spi_prettyprint_status_register_bp3_srwd,
-		.unlock		= spi_disable_blockprotect_bp3_srwd,
-		.write		= spi_chip_write_256,
-		.read		= spi_chip_read, /* Fast read (0x0B) and dual I/O supported */
-		.voltage	= {2700, 3600},
-	},
-
-	{
-		.vendor		= "Macronix",
 		.name		= "MX25L3235D",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= MACRONIX_ID,
@@ -7817,42 +7630,6 @@ const struct flashchip flashchips[] = {

 	{
 		.vendor		= "Macronix",
-		.name		= "MX25L6405",
-		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L6405,
-		.total_size	= 8192,
-		.page_size	= 256,
-		/* Has an additional 512B EEPROM sector */
-		.feature_bits	= FEATURE_WRSR_WREN,
-		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
-		.probe_timing	= TIMING_ZERO,
-		.block_erasers	=
-		{
-			{
-				.eraseblocks = { {64 * 1024, 128} },
-				.block_erase = spi_block_erase_20,
-			}, {
-				.eraseblocks = { {64 * 1024, 128} },
-				.block_erase = spi_block_erase_d8,
-			}, {
-				.eraseblocks = { {8 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_60,
-			}, {
-				.eraseblocks = { {8 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_c7,
-			}
-		},
-		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6: error flag */
-		.unlock		= spi_disable_blockprotect_bp3_srwd,
-		.write		= spi_chip_write_256,
-		.read		= spi_chip_read, /* Fast read (0x0B) supported */
-		.voltage	= {2700, 3600},
-	},
-
-	{
-		.vendor		= "Macronix",
 		.name		= "MX25L6405D",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= MACRONIX_ID,
@@ -7889,86 +7666,6 @@ const struct flashchip flashchips[] = {

 	{
 		.vendor		= "Macronix",
-		.name		= "MX25L6406E/MX25L6408E",
-		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L6405,
-		.total_size	= 8192,
-		.page_size	= 256,
-		/* MX25L6406E supports SFDP */
-		/* OTP: 06E 64B total; enter 0xB1, exit 0xC1 */
-		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
-		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
-		.probe_timing	= TIMING_ZERO,
-		.block_erasers	=
-		{
-			{
-				.eraseblocks = { {4 * 1024, 2048} },
-				.block_erase = spi_block_erase_20,
-			}, {
-				.eraseblocks = { {64 * 1024, 128} },
-				.block_erase = spi_block_erase_52,
-			}, {
-				.eraseblocks = { {64 * 1024, 128} },
-				.block_erase = spi_block_erase_d8,
-			}, {
-				.eraseblocks = { {8 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_60,
-			}, {
-				.eraseblocks = { {8 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_c7,
-			}
-		},
-		.printlock	= spi_prettyprint_status_register_bp3_srwd,
-		.unlock		= spi_disable_blockprotect_bp3_srwd,
-		.write		= spi_chip_write_256,
-		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O read supported */
-		.voltage	= {2700, 3600},
-	},
-
-	{
-		.vendor		= "Macronix",
-		.name		= "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E",
-		.bustype	= BUS_SPI,
-		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L6405,
-		.total_size	= 8192,
-		.page_size	= 256,
-		/* supports SFDP */
-		/* OTP: 512B total; enter 0xB1, exit 0xC1 */
-		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
-		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
-		.probe_timing	= TIMING_ZERO,
-		.block_erasers	=
-		{
-			{
-				.eraseblocks = { {4 * 1024, 2048} },
-				.block_erase = spi_block_erase_20,
-			}, {
-				.eraseblocks = { {32 * 1024, 256} },
-				.block_erase = spi_block_erase_52,
-			}, {
-				.eraseblocks = { {64 * 1024, 128} },
-				.block_erase = spi_block_erase_d8,
-			}, {
-				.eraseblocks = { {8 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_60,
-			}, {
-				.eraseblocks = { {8 * 1024 * 1024, 1} },
-				.block_erase = spi_block_erase_c7,
-			}
-		},
-		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
-		.unlock		= spi_disable_blockprotect_bp3_srwd,
-		.write		= spi_chip_write_256,
-		.read		= spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
-		.voltage	= {2700, 3600},
-	},
-
-	{
-		.vendor		= "Macronix",
 		.name		= "MX25L12805D",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= MACRONIX_ID,
--
1.9.1


code:
--- flashchips.c	2014-12-30 01:59:49.846383043 +0000
+++ flashchips.c.i945lenovobios_macronix	2014-12-30 02:05:16.060000647 +0000
@@ -6605,12 +6605,12 @@
 		.name		= "MX25L1605D/MX25L1608D/MX25L1673E",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= MACRONIX_ID,
-		.model_id	= MACRONIX_MX25L1605,
+		.model_id	= 0x14,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_WREN,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+		.probe		= probe_spi_res1,
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -6630,7 +6630,7 @@
 		},
 		.printlock	= spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode */
 		.unlock		= spi_disable_blockprotect,
-		.write		= spi_chip_write_256,
+		.write		= spi_chip_write_1,
 		.read		= spi_chip_read, /* Fast read (0x0B), dual I/O supported */
 		.voltage	= {2700, 3600},
 	},


code:
--- flashchips.c	2014-12-30 01:59:49.846383043 +0000
+++ flashchips.c.i945lenovobios_sst	2014-12-30 02:03:51.367580645 +0000
@@ -10886,12 +10886,12 @@
 		.name		= "SST25VF016B",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= SST_ID,
-		.model_id	= SST_SST25VF016B,
+		.model_id	= 0x41,
 		.total_size	= 2048,
 		.page_size	= 256,
 		.feature_bits	= FEATURE_WRSR_EITHER,
 		.tested		= TEST_OK_PREW,
-		.probe		= probe_spi_rdid,
+		.probe		= probe_spi_res2,
 		.probe_timing	= TIMING_ZERO,
 		.block_erasers	=
 		{
@@ -10914,7 +10914,7 @@
 		},
 		.printlock	= spi_prettyprint_status_register_sst25vf016,
 		.unlock		= spi_disable_blockprotect,
-		.write		= spi_aai_write,
+		.write		= spi_chip_write_1,
 		.read		= spi_chip_read,
 		.voltage	= {2700, 3600},
 	},


code:
Copyright (C) 2014, 2015, 2016 Leah Rowe <info@minifree.org>
Copyright (C) 2015 Klemens Nanni <contact@autoboot.org>

path: resources/grub/config/AUTHORS


code:
set prefix=(memdisk)/boot/grub

insmod nativedisk
insmod ehci
insmod ohci
insmod uhci
insmod usb
insmod usbms
insmod usbserial_pl2303
insmod usbserial_ftdi
insmod usbserial_usbdebug

# Serial and keyboard configuration, very important.
serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1
terminal_input --append  serial
terminal_output --append serial
terminal_input --append at_keyboard
terminal_output --append cbmemc

gfxpayload=keep
terminal_output --append gfxterm

# Default to first option, automatically boot after 1 second
set default="0"
set timeout=1

# This is useful when using 'cat' on long files on GRUB terminal
set pager=1


code:
insmod png

background_image (cbfsdisk)/background.png
loadfont (memdisk)/dejavusansmono.pf2


code:
set prefix=(memdisk)/boot/grub

set root='cbfsdisk'
source (cbfsdisk)/grub.cfg


code:
function try_user_config {
	set root="${1}"
	for dir in boot grub grub2 boot/grub boot/grub2; do
		for name in libreboot_ autoboot_ librecore_ coreboot_ ''; do
			if [ -f /"${dir}"/"${name}"grub.cfg ]; then
                unset superusers
				configfile /"${dir}"/"${name}"grub.cfg
			fi
		done
	done
}
function search_grub {
	for i in 0 1; do
		# raw devices
		try_user_config "(${1}${i})"
		for part in 1 2 3 4 5; do
			# MBR/GPT partitions
			try_user_config "(${1}${i},${part})"
		done
	done
}
function try_isolinux_config {
	set root="${1}"
	for dir in '' /boot; do
		if [ -f "${dir}"/isolinux/isolinux.cfg ]; then
			syslinux_configfile -i "${dir}"/isolinux/isolinux.cfg
		elif [ -f "${dir}"/syslinux/syslinux.cfg ]; then
			syslinux_configfile -s "${dir}"/syslinux/syslinux.cfg
		fi
	done
}
function search_isolinux {
	for i in 0 1; do
		# raw devices
		try_isolinux_config "(${1}${i})"
		for part in 1 2 3 4 5; do
			# MBR/GPT partitions
			try_isolinux_config "(${1}${i},${part})"
		done
	done
}
menuentry 'Load Operating System (incl. fully encrypted disks)  [o]' --hotkey='o' {
# GRUB2 handles (almost) every possible disk setup, but only the location of
# /boot is actually important since GRUB2 only loads the user's config.

# LVM, RAID, filesystems and encryption on both raw devices and partitions in
# all various combinations need to be supported. Since full disk encryption is
# possible with GRUB2 as payload and probably even used by most users, this
# configuration tries to load the operating system in the following way:

# 1. Look for user configuration on unencrypted devices first to avoid
# unnecessary decryption routines in the following order:

#	1) raw devices and MBR/GPT partitions
	search_grub ahci
    search_grub ata
#	2) LVM and RAID which might be used accross multiple devices
	lvm="lvm/matrix-rootvol lvm/matrix-boot"
	raid="md/0 md/1 md/2 md/3 md/4 md/5 md/6 md/7 md/8 md/9"
	for vol in ${lvm} ${raid}; do
		try_user_config "(${vol})"
	done
# 2. In case no configuration could be found, try decrypting devices. Look
# on raw crypto devices as well as inside LVM volumes this time.

#	The user will be prompted for a passphrase if a LUKS header was found.
	for dev usb1 usb0 ahci1 ahci0 ata1 ata0 ${lvm}; do
		cryptomount "(${dev})"
	done
#	3) encrypted devices/partitions
	for i in 1 0; do
		for part in 1 2 3 4 5; do
            for type in usb ahci ata; do
    			cryptomount "(${type}${i},${part})"
            done
		done
	done

#	3) encrypted devices/partitions
	search_grub crypto
#	4) LVM inside LUKS containers
	for vol in ${lvm}; do
		try_user_config "(${vol})"
	done

    # Last resort, if all else fails
    set root=ahci0,1
    for p in / /boot/; do
        if [ -f "${p}vmlinuz" ]; then
            linux ${p}vmlinuz root=/dev/sda1 rw
            if [ -f "${p}initrd.img" ]; then
                initrd ${p}initrd.img
            fi
        fi
    done

    # Last resort (for GA-G41-ES2L which uses IDE emulation mode for SATA)
    set root=ata0,1
    for p in / /boot/; do
        if [ -f "${p}vmlinuz" ]; then
            linux ${p}vmlinuz root=/dev/sda1 rw
            if [ -f "${p}initrd.img" ]; then
                initrd ${p}initrd.img
            fi
        fi
    done
}
menuentry 'Search ISOLINUX menu (AHCI)  [a]' --hotkey='a' {
	search_isolinux ahci
}
menuentry 'Search ISOLINUX menu (USB)  [u]' --hotkey='u' {
	search_isolinux usb
}
menuentry 'Search ISOLINUX menu (CD/DVD)  [d]' --hotkey='d' {
	insmod ata
	for dev in ata0 ata1 ata2 ata3 ahci1; do
		try_isolinux_config "(${dev})"
	done
}
menuentry 'Load test configuration (grubtest.cfg) inside of CBFS  [t]' --hotkey='t' {
	set root='(cbfsdisk)'
	configfile /grubtest.cfg
}
menuentry 'Search for GRUB2 configuration on external media  [s]' --hotkey='s' {
	search_grub usb
}
menuentry 'Poweroff  [p]' --hotkey='p' {
	halt
}
menuentry 'Reboot  [r]' --hotkey='r' {
	reboot
}


code:
menuentry 'Load MemTest86+  [m]' --hotkey='m' {
	set root='memdisk'
	linux16 /memtest.bin
}


code:
abysta at yandex.ru
Adrian Schroeter
Aleksey Chalabyan
Andrey Valentinovich Panov
Ben Laenen
Besarion Gugushvili
Bhikkhu Pesala
Clayborne Arevalo
Dafydd Harries
Danilo Segan
Davide Viti
David Jez
David Lawrence Ramsey
Denis Jacquerye
Dwayne Bailey
Eugeniy Meshcheryakov
Gee Fung Sit
Heikki Lindroos
James Cloos
James Crippen
John Karp
Keenan Pepper
Lars Naesbye Christensen
Lior Halphon
MaEr
Mashrab Kuvatov
Max Berger
Mederic Boquien
Michael Everson
MihailJP
Misu Moldovan
Nguyen Thai Ngoc Duy
Nicolas Mailhot
Norayr Chilingarian
Ognyan Kulev
Ondrej Koala Vacha
Peter Cernak
Remy Oudompheng
Roozbeh Pournader
Rouben Hakobian
Sahak Petrosyan
Sander Vesik
Stepan Roh
Stephen Hartke
Steve Tinney
Tavmjong Bah
Thomas Henlich
Tim May
Valentin Stoykov
Vasek Stodulka
Wesley Transue
Yoshiki Ohshima

$Id: AUTHORS 2495 2011-11-14 22:56:26Z noct_dreamer $


code:
See http://dejavu.sourceforge.net/wiki/index.php/Bugs

$Id: BUGS 80 2004-11-13 13:12:02Z src $