@@ -13,7 +13,7 @@ use std::vars::{get_boot_item, get_boot_order, set_boot_item, set_boot_order};
1313use std:: uefi:: reset:: ResetType ;
1414use std:: uefi:: status:: { Error , Result , Status } ;
1515
16- use super :: { FIRMWARECAP , FIRMWAREDIR , FIRMWARENSH , FIRMWAREROM , H2OFFT , IFLASHV , UEFIFLASH , shell, Component , pci_mcfg, UefiMapper } ;
16+ use super :: { AMIDE , FIRMWARECAP , FIRMWAREDIR , FIRMWARENSH , FIRMWAREROM , H2OFFT , IFLASHV , SERIAL , UEFIFLASH , shell, Component , pci_mcfg, UefiMapper } ;
1717
1818fn copy_region ( region : intelflash:: RegionKind , old_data : & [ u8 ] , new_data : & mut [ u8 ] ) -> core:: result:: Result < bool , String > {
1919 let old_opt = intelflash:: Rom :: new ( old_data) ?. get_region_base_limit ( region) ?;
@@ -188,6 +188,23 @@ impl BiosComponent {
188188 println ! ( "Failed to locate EC" ) ;
189189 }
190190 }
191+
192+ fn set_serial ( & self , serial : & str ) -> Result < ( ) > {
193+ if find ( AMIDE ) . is_ok ( ) {
194+ let cmd = format ! ( "{} /SS {}" , AMIDE , serial) ;
195+ let status = shell ( & cmd) ?;
196+
197+ if status == 0 {
198+ Ok ( ( ) )
199+ } else {
200+ println ! ( "{} Set Serial Error: {}" , self . name( ) , status) ;
201+ Err ( Error :: DeviceError )
202+ }
203+ } else {
204+ //TODO
205+ Err ( Error :: NotFound )
206+ }
207+ }
191208}
192209
193210impl Component for BiosComponent {
@@ -541,6 +558,25 @@ impl Component for BiosComponent {
541558 }
542559 }
543560
561+ if let Ok ( serial_vec) = load ( SERIAL ) {
562+ match String :: from_utf8 ( serial_vec) {
563+ Ok ( serial_str) => {
564+ let serial = serial_str. trim ( ) ;
565+ match self . set_serial ( & serial) {
566+ Ok ( ( ) ) => {
567+ println ! ( "Set serial to '{}'" , serial) ;
568+ } ,
569+ Err ( err) => {
570+ println ! ( "Failed to set serial to '{}': {:?}" , serial, err) ;
571+ }
572+ }
573+ } ,
574+ Err ( err) => {
575+ println ! ( "Failed to parse serial: {:?}" , err) ;
576+ }
577+ }
578+ }
579+
544580 Ok ( ( ) )
545581 }
546582}
0 commit comments