tool: Add error for write locked
Add a new error for the case of trying to flash when security is enabled and it is still locked and update the related docs. Signed-off-by: Tim Crawford <tcrawford@system76.com>
This commit is contained in:
		
				
					committed by
					
						 Tim Crawford
						Tim Crawford
					
				
			
			
				
	
			
			
			
						parent
						
							54d795480c
						
					
				
				
					commit
					70c8678a5f
				
			| @@ -1,15 +1,27 @@ | |||||||
| # Flashing firmware | # Flashing firmware | ||||||
|  |  | ||||||
|  | ## UEFI application | ||||||
|  |  | ||||||
|  | The `flash.sh` script from the top-level firmware-open project will use | ||||||
|  | firmware-update, the UEFI application which is used for normal system updates. | ||||||
|  |  | ||||||
|  | This will flash both the SBIOS and the EC after building the firmware. To | ||||||
|  | flash just the EC, delete the built `firmware.rom` before running `flash.sh`. | ||||||
|  |  | ||||||
| ## Internal programmer | ## Internal programmer | ||||||
|  |  | ||||||
| Use this method for flashing a system already running System76 EC. | Use this method for flashing a system already running System76 EC. | ||||||
|  |  | ||||||
| This method will only work if the running firmware is not locked. Firmware is | This method will only work if the running firmware is not locked. Firmware is | ||||||
| write locked if it was built with `CONFIG_SECURITY=y`. firmware-update must be | write locked if it was built with `CONFIG_SECURITY=y`. The firmware can be | ||||||
| used to flash from UEFI in this state (see `flash.sh` in firmware-open). | unlocked using ectool for a single boot: | ||||||
|  |  | ||||||
| This will trigger a watchdog reset causing the system to **immediately power | ``` | ||||||
| off**. OS data may be lost or corrupted as a result. Save and close all | ./scripts/ectool.sh security unlock | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | This method will trigger a watchdog reset causing the system to **immediately | ||||||
|  | power off**. OS data may be lost or corrupted as a result. Save and close all | ||||||
| applications before flashing. | applications before flashing. | ||||||
|  |  | ||||||
| ``` | ``` | ||||||
|   | |||||||
| @@ -104,10 +104,6 @@ make | |||||||
|  |  | ||||||
| See [flashing firmware](./flashing.md) for details. | See [flashing firmware](./flashing.md) for details. | ||||||
|  |  | ||||||
| ```sh |  | ||||||
| make flash_internal |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
| Do not use the keyboard or touchpad while it is flashing. | Do not use the keyboard or touchpad while it is flashing. | ||||||
|  |  | ||||||
| The system will power off as part of the flash process. Turn it back on after | The system will power off as part of the flash process. Turn it back on after | ||||||
|   | |||||||
| @@ -2,5 +2,5 @@ | |||||||
| # SPDX-License-Identifier: GPL-3.0-only | # SPDX-License-Identifier: GPL-3.0-only | ||||||
|  |  | ||||||
| set -e | set -e | ||||||
| cargo build --release --manifest-path tool/Cargo.toml | cargo build --release --quiet --manifest-path tool/Cargo.toml | ||||||
| sudo tool/target/release/system76_ectool "$@" | sudo tool/target/release/system76_ectool "$@" | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ enum SecurityState security_get(void) { | |||||||
|  |  | ||||||
| bool security_set(enum SecurityState state) { | bool security_set(enum SecurityState state) { | ||||||
|     switch (state) { |     switch (state) { | ||||||
|     // Allow perpare states to be set |     // Allow prepare states to be set | ||||||
|     case SECURITY_STATE_PREPARE_LOCK: |     case SECURITY_STATE_PREPARE_LOCK: | ||||||
|     case SECURITY_STATE_PREPARE_UNLOCK: |     case SECURITY_STATE_PREPARE_UNLOCK: | ||||||
|         security_state = state; |         security_state = state; | ||||||
|   | |||||||
| @@ -29,6 +29,8 @@ pub enum Error { | |||||||
|     /// Encountered a hidapi::Error |     /// Encountered a hidapi::Error | ||||||
|     #[cfg(feature = "hidapi")] |     #[cfg(feature = "hidapi")] | ||||||
|     Hid(hidapi::HidError), |     Hid(hidapi::HidError), | ||||||
|  |     /// Writing to flash is disabled | ||||||
|  |     WriteLocked, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[cfg(feature = "std")] | #[cfg(feature = "std")] | ||||||
|   | |||||||
| @@ -170,6 +170,12 @@ unsafe fn flash(ec: &mut Ec<Box<dyn Access>>, path: &str, target: SpiTarget) -> | |||||||
|         println!("ec version: {:?}", str::from_utf8(ec_version)); |         println!("ec version: {:?}", str::from_utf8(ec_version)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if let Ok(security) = ec.security_get() { | ||||||
|  |         if security != SecurityState::Unlock { | ||||||
|  |             return Err(Error::WriteLocked); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if scratch { |     if scratch { | ||||||
|         // Wait for any key releases |         // Wait for any key releases | ||||||
|         eprintln!("Waiting 5 seconds for all keys to be released"); |         eprintln!("Waiting 5 seconds for all keys to be released"); | ||||||
| @@ -378,8 +384,6 @@ struct Args { | |||||||
| } | } | ||||||
|  |  | ||||||
| fn main() { | fn main() { | ||||||
|     //.subcommand(Command::new("security").arg(Arg::new("state").value_parser(["lock", "unlock"]))) |  | ||||||
|  |  | ||||||
|     let args = Args::parse(); |     let args = Args::parse(); | ||||||
|  |  | ||||||
|     let get_ec = || -> Result<_, Error> { |     let get_ec = || -> Result<_, Error> { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user