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
parent
54d795480c
commit
70c8678a5f
@ -1,15 +1,27 @@
|
||||
# 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
|
||||
|
||||
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
|
||||
write locked if it was built with `CONFIG_SECURITY=y`. firmware-update must be
|
||||
used to flash from UEFI in this state (see `flash.sh` in firmware-open).
|
||||
write locked if it was built with `CONFIG_SECURITY=y`. The firmware can be
|
||||
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.
|
||||
|
||||
```
|
||||
|
@ -104,10 +104,6 @@ make
|
||||
|
||||
See [flashing firmware](./flashing.md) for details.
|
||||
|
||||
```sh
|
||||
make flash_internal
|
||||
```
|
||||
|
||||
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
|
||||
|
@ -2,5 +2,5 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
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 "$@"
|
||||
|
@ -11,7 +11,7 @@ enum SecurityState security_get(void) {
|
||||
|
||||
bool security_set(enum SecurityState state) {
|
||||
switch (state) {
|
||||
// Allow perpare states to be set
|
||||
// Allow prepare states to be set
|
||||
case SECURITY_STATE_PREPARE_LOCK:
|
||||
case SECURITY_STATE_PREPARE_UNLOCK:
|
||||
security_state = state;
|
||||
|
@ -29,6 +29,8 @@ pub enum Error {
|
||||
/// Encountered a hidapi::Error
|
||||
#[cfg(feature = "hidapi")]
|
||||
Hid(hidapi::HidError),
|
||||
/// Writing to flash is disabled
|
||||
WriteLocked,
|
||||
}
|
||||
|
||||
#[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));
|
||||
}
|
||||
|
||||
if let Ok(security) = ec.security_get() {
|
||||
if security != SecurityState::Unlock {
|
||||
return Err(Error::WriteLocked);
|
||||
}
|
||||
}
|
||||
|
||||
if scratch {
|
||||
// Wait for any key releases
|
||||
eprintln!("Waiting 5 seconds for all keys to be released");
|
||||
@ -378,8 +384,6 @@ struct Args {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
//.subcommand(Command::new("security").arg(Arg::new("state").value_parser(["lock", "unlock"])))
|
||||
|
||||
let args = Args::parse();
|
||||
|
||||
let get_ec = || -> Result<_, Error> {
|
||||
|
Reference in New Issue
Block a user