Skip to content

Commit be9ade7

Browse files
committed
Move EC tag processing from shell script to Rust program
1 parent f8c1b57 commit be9ade7

File tree

3 files changed

+38
-28
lines changed

3 files changed

+38
-28
lines changed

res/firmware.nsh

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -166,23 +166,6 @@ if "%2" == "ec" then
166166
exit %lasterror%
167167
endif
168168

169-
if "%3" == "tag" then
170-
if exist ec.tag then
171-
rm ec.tag
172-
if exist ec.tag then
173-
echo "failed to remove ec.tag"
174-
exit 1
175-
endif
176-
else
177-
echo > ec.tag
178-
if not exist ec.tag then
179-
echo "failed to create ec.tag"
180-
exit 1
181-
endif
182-
endif
183-
exit 0
184-
endif
185-
186169
echo "ec: unknown subcommand '%3'"
187170
exit 1
188171
endif

src/app/ec.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use core::ops::Try;
12
use ecflash::{Ec, EcFile, EcFlash};
23
use ectool::{
34
Firmware,
@@ -8,12 +9,13 @@ use ectool::{
89
};
910
use std::{
1011
cell::Cell,
12+
ffi::wstr,
1113
fs::{find, load},
1214
str,
1315
};
1416
use uefi::status::{Error, Result};
1517

16-
use super::{ECROM, EC2ROM, FIRMWAREDIR, FIRMWARENSH, shell, Component};
18+
use super::{ECROM, EC2ROM, ECTAG, FIRMWAREDIR, FIRMWARENSH, shell, Component};
1719

1820
pub struct UefiTimeout {
1921
duration: u64,
@@ -385,16 +387,31 @@ impl Component for EcComponent {
385387
};
386388

387389
if requires_reset {
388-
//Create tag file and skip enter when tag file is found
389-
let cmd = format!("{} {} ec tag", FIRMWARENSH, FIRMWAREDIR);
390-
match shell(&cmd) {
391-
Ok(status) => {
392-
if status != 0 {
393-
println!("EC tag exited with error: {}", status);
390+
match find(FIRMWAREDIR) {
391+
Ok((_, firmware_dir)) => {
392+
//Try to create tag file without running shell
393+
let filename = wstr(ECTAG);
394+
let mut file = 0 as *mut uefi::fs::File;
395+
match (firmware_dir.0.Open)(
396+
firmware_dir.0,
397+
&mut file,
398+
filename.as_ptr(),
399+
uefi::fs::FILE_MODE_CREATE | uefi::fs::FILE_MODE_READ | uefi::fs::FILE_MODE_WRITE,
400+
0
401+
).into_result() {
402+
Ok(_) => {
403+
unsafe {
404+
let _ = ((*file).Close)(&mut *file);
405+
}
406+
println!("EC tag: created successfully");
407+
},
408+
Err(err) => {
409+
println!("EC tag: failed to create {}: {:?}", ECTAG, err);
410+
}
394411
}
395412
},
396413
Err(err) => {
397-
println!("EC tag error: {:?}", err);
414+
println!("EC tag: failed to find {}: {:?}", FIRMWAREDIR, err);
398415
}
399416
}
400417

src/app/mod.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use core::{char, ptr};
1+
use core::{char, mem, ptr};
22
use core::ops::Try;
33
use ecflash::EcFlash;
44
use orbclient::{Color, Renderer};
@@ -220,9 +220,19 @@ fn inner() -> Result<()> {
220220
"* No updates were found *"
221221
} else {
222222
let mut setup_menu = false;
223-
let c = if find(ECTAG).is_ok() {
223+
let c = if let Ok((_, ectag)) = find(ECTAG) {
224224
// Attempt to remove EC tag
225-
let _ = shell(&format!("{} {} ec tag", FIRMWARENSH, FIRMWAREDIR));
225+
match (ectag.0.Delete)(ectag.0).into_result() {
226+
Ok(_) => {
227+
println!("EC tag: deleted successfully");
228+
229+
// Have to prevent Close from being called after Delete
230+
mem::forget(ectag);
231+
},
232+
Err(err) => {
233+
println!("EC tag: failed to delete: {:?}", err);
234+
}
235+
}
226236

227237
// Skip enter if system76 ec flashing already occured
228238
components.clear();

0 commit comments

Comments
 (0)