From e4b0416e67a6ea80ce6167a63da28d7d2bc123c6 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 3 Mar 2020 11:04:52 -0700 Subject: [PATCH 1/3] Add support for setting serial using AMIDE if found --- src/app/bios.rs | 38 +++++++++++++++++++++++++++++++++++++- src/app/mod.rs | 2 ++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/app/bios.rs b/src/app/bios.rs index 108c0f4..6c3aebc 100644 --- a/src/app/bios.rs +++ b/src/app/bios.rs @@ -13,7 +13,7 @@ use std::vars::{get_boot_item, get_boot_order, set_boot_item, set_boot_order}; use std::uefi::reset::ResetType; use std::uefi::status::{Error, Result, Status}; -use super::{FIRMWARECAP, FIRMWAREDIR, FIRMWARENSH, FIRMWAREROM, H2OFFT, IFLASHV, UEFIFLASH, shell, Component, pci_mcfg, UefiMapper}; +use super::{AMIDE, FIRMWARECAP, FIRMWAREDIR, FIRMWARENSH, FIRMWAREROM, H2OFFT, IFLASHV, SERIAL, UEFIFLASH, shell, Component, pci_mcfg, UefiMapper}; fn copy_region(region: intelflash::RegionKind, old_data: &[u8], new_data: &mut [u8]) -> core::result::Result { let old_opt = intelflash::Rom::new(old_data)?.get_region_base_limit(region)?; @@ -188,6 +188,23 @@ impl BiosComponent { println!("Failed to locate EC"); } } + + fn set_serial(&self, serial: &str) -> Result<()> { + if find(AMIDE).is_ok() { + let cmd = format!("{} /SS {}", AMIDE, serial); + let status = shell(&cmd)?; + + if status == 0 { + Ok(()) + } else { + println!("{} Set Serial Error: {}", self.name(), status); + Err(Error::DeviceError) + } + } else { + //TODO + Err(Error::NotFound) + } + } } impl Component for BiosComponent { @@ -541,6 +558,25 @@ impl Component for BiosComponent { } } + if let Ok(serial_vec) = load(SERIAL) { + match String::from_utf8(serial_vec) { + Ok(serial_str) => { + let serial = serial_str.trim(); + match self.set_serial(&serial) { + Ok(()) => { + println!("Set serial to '{}'", serial); + }, + Err(err) => { + println!("Failed to set serial to '{}': {:?}", serial, err); + } + } + }, + Err(err) => { + println!("Failed to parse serial: {:?}", err); + } + } + } + Ok(()) } } diff --git a/src/app/mod.rs b/src/app/mod.rs index 429f480..922943f 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -38,6 +38,7 @@ mod ec; mod mapper; mod pci; +static AMIDE: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\amide.efi"); static ECROM: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\ec.rom"); static ECTAG: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\ec.tag"); static EC2ROM: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\ec2.rom"); @@ -50,6 +51,7 @@ static IFLASHV: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\iflashv.efi") static IFLASHVTAG: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\iflashv.tag"); static IPXEEFI: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\ipxe.efi"); static MESETTAG: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\meset.tag"); +static SERIAL: &str = concat!("\\", env!("BASEDIR"), "\\serial"); static SHELLEFI: &str = concat!("\\", env!("BASEDIR"), "\\res\\shell.efi"); static SPLASHBMP: &str = concat!("\\", env!("BASEDIR"), "\\res\\splash.bmp"); static UEFIFLASH: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\uefiflash.efi"); From 8810a3fdb6d31283a56b6d6e9de7cd0c606c8d07 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 3 Mar 2020 12:44:56 -0700 Subject: [PATCH 2/3] Reboot in order to set serial --- res/firmware.nsh | 18 ++++++++++++++++++ src/app/bios.rs | 38 +------------------------------------- src/app/mod.rs | 38 +++++++++++++++++++++++++++++++++++++- 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/res/firmware.nsh b/res/firmware.nsh index 6ba5001..654cd84 100644 --- a/res/firmware.nsh +++ b/res/firmware.nsh @@ -208,5 +208,23 @@ if "%2" == "ec2" then exit 1 endif +if "%2" == "serial" then + if exist amide.efi then + if exist amide.tag then + rm amide.tag + amide.efi /SS "%3" + exit %lasterror% + else + echo > amide.tag + if not exist amide.tag then + echo "failed to create amide.tag" + exit 1 + endif + + reset + endif + endif +endif + echo "unknown command '%2'" exit 1 diff --git a/src/app/bios.rs b/src/app/bios.rs index 6c3aebc..108c0f4 100644 --- a/src/app/bios.rs +++ b/src/app/bios.rs @@ -13,7 +13,7 @@ use std::vars::{get_boot_item, get_boot_order, set_boot_item, set_boot_order}; use std::uefi::reset::ResetType; use std::uefi::status::{Error, Result, Status}; -use super::{AMIDE, FIRMWARECAP, FIRMWAREDIR, FIRMWARENSH, FIRMWAREROM, H2OFFT, IFLASHV, SERIAL, UEFIFLASH, shell, Component, pci_mcfg, UefiMapper}; +use super::{FIRMWARECAP, FIRMWAREDIR, FIRMWARENSH, FIRMWAREROM, H2OFFT, IFLASHV, UEFIFLASH, shell, Component, pci_mcfg, UefiMapper}; fn copy_region(region: intelflash::RegionKind, old_data: &[u8], new_data: &mut [u8]) -> core::result::Result { let old_opt = intelflash::Rom::new(old_data)?.get_region_base_limit(region)?; @@ -188,23 +188,6 @@ impl BiosComponent { println!("Failed to locate EC"); } } - - fn set_serial(&self, serial: &str) -> Result<()> { - if find(AMIDE).is_ok() { - let cmd = format!("{} /SS {}", AMIDE, serial); - let status = shell(&cmd)?; - - if status == 0 { - Ok(()) - } else { - println!("{} Set Serial Error: {}", self.name(), status); - Err(Error::DeviceError) - } - } else { - //TODO - Err(Error::NotFound) - } - } } impl Component for BiosComponent { @@ -558,25 +541,6 @@ impl Component for BiosComponent { } } - if let Ok(serial_vec) = load(SERIAL) { - match String::from_utf8(serial_vec) { - Ok(serial_str) => { - let serial = serial_str.trim(); - match self.set_serial(&serial) { - Ok(()) => { - println!("Set serial to '{}'", serial); - }, - Err(err) => { - println!("Failed to set serial to '{}': {:?}", serial, err); - } - } - }, - Err(err) => { - println!("Failed to parse serial: {:?}", err); - } - } - } - Ok(()) } } diff --git a/src/app/mod.rs b/src/app/mod.rs index 922943f..a725833 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -38,7 +38,7 @@ mod ec; mod mapper; mod pci; -static AMIDE: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\amide.efi"); +static AMIDETAG: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\amide.tag"); static ECROM: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\ec.rom"); static ECTAG: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\ec.tag"); static EC2ROM: &str = concat!("\\", env!("BASEDIR"), "\\firmware\\ec2.rom"); @@ -79,6 +79,18 @@ fn ac_connected() -> bool { } } +fn set_serial(serial: &str) -> Result<()> { + find(FIRMWARENSH)?; + let cmd = format!("{} {} serial {}", FIRMWARENSH, FIRMWAREDIR, serial); + let status = shell(&cmd)?; + if status == 0 { + Ok(()) + } else { + println!("Set Serial Error: {}", status); + Err(Error::DeviceError) + } +} + #[derive(Clone, Copy, Debug, Eq, PartialEq)] enum ValidateKind { Found, @@ -257,6 +269,11 @@ fn inner() -> Result<()> { components.clear(); validations.clear(); '\n' + } else if find(AMIDETAG).is_ok() { + // Skip enter if writing serial + components.clear(); + validations.clear(); + '\n' } else if find(UEFIFLASH).is_ok() { // Skip enter if flashing a meerkat if find(UEFIFLASHTAG).is_ok() { @@ -319,6 +336,25 @@ fn inner() -> Result<()> { } }; + if let Ok(serial_vec) = load(SERIAL) { + match String::from_utf8(serial_vec) { + Ok(serial_str) => { + let serial = serial_str.trim(); + match set_serial(&serial) { + Ok(()) => { + println!("Set serial to '{}'", serial); + }, + Err(err) => { + println!("Failed to set serial to '{}': {:?}", serial, err); + } + } + }, + Err(err) => { + println!("Failed to parse serial: {:?}", err); + } + } + } + remove_override(option)?; println!("{}", message); From 647e9dcdd66ba5bac315b37714e3dbb4800a36ed Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 4 Mar 2020 09:16:22 -0700 Subject: [PATCH 3/3] Set serial before setting os indications --- src/app/mod.rs | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index a725833..18ead57 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -315,6 +315,25 @@ fn inner() -> Result<()> { println!("Failed to reset DMI: {:?}", err); } + if let Ok(serial_vec) = load(SERIAL) { + match String::from_utf8(serial_vec) { + Ok(serial_str) => { + let serial = serial_str.trim(); + match set_serial(&serial) { + Ok(()) => { + println!("Set serial to '{}'", serial); + }, + Err(err) => { + println!("Failed to set serial to '{}': {:?}", serial, err); + } + } + }, + Err(err) => { + println!("Failed to parse serial: {:?}", err); + } + } + } + if setup_menu { let supported = get_os_indications_supported().unwrap_or(0); if supported & 1 == 1 { @@ -336,25 +355,6 @@ fn inner() -> Result<()> { } }; - if let Ok(serial_vec) = load(SERIAL) { - match String::from_utf8(serial_vec) { - Ok(serial_str) => { - let serial = serial_str.trim(); - match set_serial(&serial) { - Ok(()) => { - println!("Set serial to '{}'", serial); - }, - Err(err) => { - println!("Failed to set serial to '{}': {:?}", serial, err); - } - } - }, - Err(err) => { - println!("Failed to parse serial: {:?}", err); - } - } - } - remove_override(option)?; println!("{}", message);