blob: f617b5d2f7002cbe1d63f8ba4812d6d22483f5f0 [file]
// Copyright 2024, The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! This file provides one possible implementation of the sysdeps functions for libavb.
//! Global allocator is required.
#![cfg_attr(not(test), no_std)]
// These are implementations of required C functions, see libavb sysdeps for docs.
#![allow(missing_docs)]
use core::ffi::{c_char, c_int, c_void};
use libc::{gbl_free, gbl_malloc, memcmp, memcpy, memset, strcmp, strlen, strncmp};
const AVB_MALLOC_ALIGNMENT: usize = avb_bindgen::AVB_ALIGNMENT_SIZE as usize;
#[no_mangle]
pub extern "C" fn avb_abort() -> ! {
panic!("avb_abort");
}
#[no_mangle]
pub extern "C" fn avb_malloc_(size: usize) -> *mut c_void {
// SAFETY: libavb calls are compatible with libc counterparts, alignment the same as
// avb_free
unsafe { gbl_malloc(size, AVB_MALLOC_ALIGNMENT) }
}
#[no_mangle]
pub extern "C" fn avb_free(ptr: *mut c_void) {
// SAFETY: libavb calls are compatible with libc counterparts, alignment the same as
// avb_malloc_
unsafe { gbl_free(ptr, AVB_MALLOC_ALIGNMENT) }
}
#[no_mangle]
pub extern "C" fn avb_strlen(s: *const c_char) -> usize {
// SAFETY: libavb calls are compatible with libc counterparts
unsafe { strlen(s) }
}
#[no_mangle]
pub extern "C" fn avb_div_by_10(dividend: *mut u64) -> u32 {
// SAFETY: libavb guarantees to pass valid pointer to u64 integer here
let val = unsafe { &mut *dividend };
let rem = *val % 10;
*val /= 10;
rem.try_into().unwrap()
}
#[no_mangle]
pub extern "C" fn avb_memcpy(dest: *mut c_void, src: *const c_void, n: usize) -> *mut c_void {
// SAFETY: libavb calls are compatible with libc counterparts
unsafe { memcpy(dest, src, n) }
}
#[no_mangle]
pub extern "C" fn avb_memcmp(src1: *const c_void, src2: *const c_void, n: usize) -> c_int {
// SAFETY: libavb calls are compatible with libc counterparts
unsafe { memcmp(src1, src2, n) }
}
#[no_mangle]
pub extern "C" fn avb_memset(dest: *mut c_void, c: c_int, n: usize) -> *mut c_void {
// SAFETY: libavb calls are compatible with libc counterparts
unsafe { memset(dest, c, n) }
}
#[no_mangle]
pub extern "C" fn avb_strcmp(s1: *const c_char, s2: *const c_char) -> c_int {
// SAFETY: libavb calls are compatible with libc counterparts
unsafe { strcmp(s1, s2) }
}
#[no_mangle]
pub extern "C" fn avb_strncmp(s1: *const c_char, s2: *const c_char, n: usize) -> c_int {
// SAFETY: libavb calls are compatible with libc counterparts
unsafe { strncmp(s1, s2, n) }
}