xref: /aosp_15_r20/bootable/libbootloader/gbl/libabr/src/utils.rs (revision 5225e6b173e52d2efc6bcf950c27374fd72adabc)
1*5225e6b1SAndroid Build Coastguard Worker // Copyright 2024, The Android Open Source Project
2*5225e6b1SAndroid Build Coastguard Worker //
3*5225e6b1SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*5225e6b1SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*5225e6b1SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*5225e6b1SAndroid Build Coastguard Worker //
7*5225e6b1SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
8*5225e6b1SAndroid Build Coastguard Worker //
9*5225e6b1SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*5225e6b1SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*5225e6b1SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*5225e6b1SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*5225e6b1SAndroid Build Coastguard Worker // limitations under the License.
14*5225e6b1SAndroid Build Coastguard Worker 
15*5225e6b1SAndroid Build Coastguard Worker use abr::{AbrData, ONE_SHOT_BOOTLOADER, ONE_SHOT_RECOVERY};
16*5225e6b1SAndroid Build Coastguard Worker 
17*5225e6b1SAndroid Build Coastguard Worker /// Converts big endian order to host order.
18*5225e6b1SAndroid Build Coastguard Worker #[no_mangle]
19*5225e6b1SAndroid Build Coastguard Worker #[allow(non_snake_case)]
AbrBigEndianToHost(val: u32) -> u3220*5225e6b1SAndroid Build Coastguard Worker pub extern "C" fn AbrBigEndianToHost(val: u32) -> u32 {
21*5225e6b1SAndroid Build Coastguard Worker     u32::from_be(val)
22*5225e6b1SAndroid Build Coastguard Worker }
23*5225e6b1SAndroid Build Coastguard Worker 
24*5225e6b1SAndroid Build Coastguard Worker /// Converts host order to big endian.
25*5225e6b1SAndroid Build Coastguard Worker #[no_mangle]
26*5225e6b1SAndroid Build Coastguard Worker #[allow(non_snake_case)]
AbrHostToBigEndian(val: u32) -> u3227*5225e6b1SAndroid Build Coastguard Worker pub extern "C" fn AbrHostToBigEndian(val: u32) -> u32 {
28*5225e6b1SAndroid Build Coastguard Worker     val.to_be()
29*5225e6b1SAndroid Build Coastguard Worker }
30*5225e6b1SAndroid Build Coastguard Worker 
31*5225e6b1SAndroid Build Coastguard Worker /// Checks if one-shot recovery boot is set in the given one-shot flags
32*5225e6b1SAndroid Build Coastguard Worker #[no_mangle]
33*5225e6b1SAndroid Build Coastguard Worker #[allow(non_snake_case)]
AbrIsOneShotRecoveryBootSet(flags: u8) -> bool34*5225e6b1SAndroid Build Coastguard Worker pub extern "C" fn AbrIsOneShotRecoveryBootSet(flags: u8) -> bool {
35*5225e6b1SAndroid Build Coastguard Worker     (flags & ONE_SHOT_RECOVERY) != 0
36*5225e6b1SAndroid Build Coastguard Worker }
37*5225e6b1SAndroid Build Coastguard Worker 
38*5225e6b1SAndroid Build Coastguard Worker /// Checks if one-shot recovery boot is set in the given AbrData
39*5225e6b1SAndroid Build Coastguard Worker ///
40*5225e6b1SAndroid Build Coastguard Worker /// # Safety
41*5225e6b1SAndroid Build Coastguard Worker ///
42*5225e6b1SAndroid Build Coastguard Worker /// Caller must make sure to pass a valid pointer for `abr_data`.
43*5225e6b1SAndroid Build Coastguard Worker #[no_mangle]
44*5225e6b1SAndroid Build Coastguard Worker #[allow(non_snake_case)]
AbrIsOneShotRecoveryBoot(abr_data: *const AbrData) -> bool45*5225e6b1SAndroid Build Coastguard Worker pub unsafe extern "C" fn AbrIsOneShotRecoveryBoot(abr_data: *const AbrData) -> bool {
46*5225e6b1SAndroid Build Coastguard Worker     // SAFETY: function safety requires `abr_data` to be a valid pointer.
47*5225e6b1SAndroid Build Coastguard Worker     AbrIsOneShotRecoveryBootSet(unsafe { abr_data.as_ref() }.unwrap().one_shot_flags)
48*5225e6b1SAndroid Build Coastguard Worker }
49*5225e6b1SAndroid Build Coastguard Worker 
50*5225e6b1SAndroid Build Coastguard Worker /// Checks if one-shot bootloader boot is set in the given one-shot flags
51*5225e6b1SAndroid Build Coastguard Worker #[no_mangle]
52*5225e6b1SAndroid Build Coastguard Worker #[allow(non_snake_case)]
AbrIsOneShotBootloaderBootSet(flags: u8) -> bool53*5225e6b1SAndroid Build Coastguard Worker pub extern "C" fn AbrIsOneShotBootloaderBootSet(flags: u8) -> bool {
54*5225e6b1SAndroid Build Coastguard Worker     (flags & ONE_SHOT_BOOTLOADER) != 0
55*5225e6b1SAndroid Build Coastguard Worker }
56*5225e6b1SAndroid Build Coastguard Worker 
57*5225e6b1SAndroid Build Coastguard Worker /// Checks if one-shot bootloader boot is set in the given AbrData
58*5225e6b1SAndroid Build Coastguard Worker ///
59*5225e6b1SAndroid Build Coastguard Worker /// # Safety
60*5225e6b1SAndroid Build Coastguard Worker ///
61*5225e6b1SAndroid Build Coastguard Worker /// Caller must make sure to pass a valid pointer for `abr_data`.
62*5225e6b1SAndroid Build Coastguard Worker #[no_mangle]
63*5225e6b1SAndroid Build Coastguard Worker #[allow(non_snake_case)]
AbrIsOneShotBootloaderBoot(abr_data: *const AbrData) -> bool64*5225e6b1SAndroid Build Coastguard Worker pub unsafe extern "C" fn AbrIsOneShotBootloaderBoot(abr_data: *const AbrData) -> bool {
65*5225e6b1SAndroid Build Coastguard Worker     // SAFETY: function safety requires `abr_data` to be a valid pointer.
66*5225e6b1SAndroid Build Coastguard Worker     AbrIsOneShotBootloaderBootSet(unsafe { abr_data.as_ref() }.unwrap().one_shot_flags)
67*5225e6b1SAndroid Build Coastguard Worker }
68*5225e6b1SAndroid Build Coastguard Worker 
69*5225e6b1SAndroid Build Coastguard Worker /// Sets the one-shot recovery flag in the given AbrData.
70*5225e6b1SAndroid Build Coastguard Worker ///
71*5225e6b1SAndroid Build Coastguard Worker /// # Safety
72*5225e6b1SAndroid Build Coastguard Worker ///
73*5225e6b1SAndroid Build Coastguard Worker /// Caller must make sure to pass a valid pointer for `abr_data`.
74*5225e6b1SAndroid Build Coastguard Worker #[no_mangle]
75*5225e6b1SAndroid Build Coastguard Worker #[allow(non_snake_case)]
AbrSetOneShotRecoveryBoot(abr_data: *mut AbrData, enable: bool)76*5225e6b1SAndroid Build Coastguard Worker pub unsafe extern "C" fn AbrSetOneShotRecoveryBoot(abr_data: *mut AbrData, enable: bool) {
77*5225e6b1SAndroid Build Coastguard Worker     // SAFETY: function safety requires `abr_data` to be a valid pointer.
78*5225e6b1SAndroid Build Coastguard Worker     unsafe { abr_data.as_mut() }.unwrap().set_one_shot_recovery(enable);
79*5225e6b1SAndroid Build Coastguard Worker }
80*5225e6b1SAndroid Build Coastguard Worker 
81*5225e6b1SAndroid Build Coastguard Worker /// Sets the one-shot bootloader flag in the given AbrData.
82*5225e6b1SAndroid Build Coastguard Worker ///
83*5225e6b1SAndroid Build Coastguard Worker /// # Safety
84*5225e6b1SAndroid Build Coastguard Worker ///
85*5225e6b1SAndroid Build Coastguard Worker /// Caller must make sure to pass a valid pointer for `abr_data`.
86*5225e6b1SAndroid Build Coastguard Worker #[no_mangle]
87*5225e6b1SAndroid Build Coastguard Worker #[allow(non_snake_case)]
AbrSetOneShotBootloaderBoot(abr_data: *mut AbrData, enable: bool)88*5225e6b1SAndroid Build Coastguard Worker pub unsafe extern "C" fn AbrSetOneShotBootloaderBoot(abr_data: *mut AbrData, enable: bool) {
89*5225e6b1SAndroid Build Coastguard Worker     // SAFETY: function safety requires `abr_data` to be a valid pointer.
90*5225e6b1SAndroid Build Coastguard Worker     unsafe { abr_data.as_mut() }.unwrap().set_one_shot_bootloader(enable);
91*5225e6b1SAndroid Build Coastguard Worker }
92