Add a heap allocator.
Bug: 223166344
Test: Ran unprotected VM under crosvm.
Change-Id: Ia004b21604ed6f2d0edc7bc7c317f3de35844dcb
diff --git a/vmbase/example/Android.bp b/vmbase/example/Android.bp
index 4cc4bf3..9c19693 100644
--- a/vmbase/example/Android.bp
+++ b/vmbase/example/Android.bp
@@ -13,6 +13,7 @@
"libcore.rust_sysroot",
],
rustlibs: [
+ "libbuddy_system_allocator",
"libvmbase",
],
enabled: false,
diff --git a/vmbase/example/src/main.rs b/vmbase/example/src/main.rs
index 3a40333..e3b9399 100644
--- a/vmbase/example/src/main.rs
+++ b/vmbase/example/src/main.rs
@@ -16,15 +16,25 @@
#![no_main]
#![no_std]
+#![feature(default_alloc_error_handler)]
mod exceptions;
+extern crate alloc;
+
+use alloc::{vec, vec::Vec};
+use buddy_system_allocator::LockedHeap;
use vmbase::{main, println};
static INITIALISED_DATA: [u32; 4] = [1, 2, 3, 4];
static mut ZEROED_DATA: [u32; 10] = [0; 10];
static mut MUTABLE_DATA: [u32; 4] = [1, 2, 3, 4];
+#[global_allocator]
+static HEAP_ALLOCATOR: LockedHeap<32> = LockedHeap::<32>::new();
+
+static mut HEAP: [u8; 65536] = [0; 65536];
+
main!(main);
/// Entry point for VM bootloader.
@@ -32,6 +42,12 @@
println!("Hello world");
print_addresses();
check_data();
+
+ unsafe {
+ HEAP_ALLOCATOR.lock().init(&mut HEAP as *mut u8 as usize, HEAP.len());
+ }
+
+ check_alloc();
}
fn print_addresses() {
@@ -81,6 +97,7 @@
unsafe {
println!("ZEROED_DATA: {:#010x}", &ZEROED_DATA as *const u32 as usize);
println!("MUTABLE_DATA: {:#010x}", &MUTABLE_DATA as *const u32 as usize);
+ println!("HEAP: {:#010x}", &HEAP as *const u8 as usize);
}
assert_eq!(INITIALISED_DATA[0], 1);
@@ -107,6 +124,18 @@
println!("Data looks good");
}
+fn check_alloc() {
+ println!("Allocating a Vec...");
+ let mut vector: Vec<u32> = vec![1, 2, 3, 4];
+ assert_eq!(vector[0], 1);
+ assert_eq!(vector[1], 2);
+ assert_eq!(vector[2], 3);
+ assert_eq!(vector[3], 4);
+ vector[2] = 42;
+ assert_eq!(vector[2], 42);
+ println!("Vec seems to work.");
+}
+
extern "C" {
static dtb_begin: u8;
static dtb_end: u8;