From bdaac86f84aedc7764ce5a45d757dcc51e666c4b Mon Sep 17 00:00:00 2001 From: Trent Nelson Date: Mon, 13 Dec 2021 08:48:39 -0700 Subject: [PATCH] Revert "Fix more BPF alignment issues on arm64" This reverts commit e5aa5efbac0cb20a5b1418fe5158bafd17bb5ba4. --- programs/bpf_loader/src/serialization.rs | 19 +++++++++++-------- programs/bpf_loader/src/syscalls.rs | 4 ++-- sdk/program/src/entrypoint.rs | 6 +++--- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/programs/bpf_loader/src/serialization.rs b/programs/bpf_loader/src/serialization.rs index 3fae5ba12e..e6b1b513a7 100644 --- a/programs/bpf_loader/src/serialization.rs +++ b/programs/bpf_loader/src/serialization.rs @@ -3,12 +3,15 @@ use solana_rbpf::{aligned_memory::AlignedMemory, ebpf::HOST_ALIGN}; use solana_sdk::{ account::{ReadableAccount, WritableAccount}, bpf_loader_deprecated, - entrypoint::{BPF_ALIGN_OF_U128, MAX_PERMITTED_DATA_INCREASE}, + entrypoint::{MAX_PERMITTED_DATA_INCREASE, PARAMETER_ALIGNMENT}, instruction::InstructionError, keyed_account::KeyedAccount, pubkey::Pubkey, }; -use std::{io::prelude::*, mem::size_of}; +use std::{ + io::prelude::*, + mem::{align_of, size_of}, +}; /// Look for a duplicate account and return its position if found pub fn is_dup(accounts: &[KeyedAccount], keyed_account: &KeyedAccount) -> (bool, usize) { @@ -165,7 +168,7 @@ pub fn get_serialized_account_size_aligned( + size_of::() // data len + data_len + MAX_PERMITTED_DATA_INCREASE - + (data_len as *const u8).align_offset(BPF_ALIGN_OF_U128) + + (data_len as *const u8).align_offset(align_of::()) + size_of::(), // rent epoch ) } @@ -224,7 +227,7 @@ pub fn serialize_parameters_aligned( .map_err(|_| InstructionError::InvalidArgument)?; v.resize( MAX_PERMITTED_DATA_INCREASE - + (v.write_index() as *const u8).align_offset(BPF_ALIGN_OF_U128), + + (v.write_index() as *const u8).align_offset(PARAMETER_ALIGNMENT), 0, ) .map_err(|_| InstructionError::InvalidArgument)?; @@ -274,7 +277,7 @@ pub fn deserialize_parameters_aligned( account.set_data_from_slice(&buffer[start..data_end]); start += pre_len + MAX_PERMITTED_DATA_INCREASE; // data - start += (start as *const u8).align_offset(BPF_ALIGN_OF_U128); + start += (start as *const u8).align_offset(align_of::()); start += size_of::(); // rent_epoch } } @@ -403,7 +406,7 @@ mod tests { assert_eq!(&program_id, de_program_id); assert_eq!(instruction_data, de_instruction_data); assert_eq!( - (&de_instruction_data[0] as *const u8).align_offset(BPF_ALIGN_OF_U128), + (&de_instruction_data[0] as *const u8).align_offset(align_of::()), 0 ); for ((account, account_info), key) in accounts.iter().zip(de_accounts).zip(keys.clone()) { @@ -416,7 +419,7 @@ mod tests { assert_eq!(account.rent_epoch(), account_info.rent_epoch); assert_eq!( - (*account_info.lamports.borrow() as *const u64).align_offset(BPF_ALIGN_OF_U128), + (*account_info.lamports.borrow() as *const u64).align_offset(align_of::()), 0 ); assert_eq!( @@ -424,7 +427,7 @@ mod tests { .data .borrow() .as_ptr() - .align_offset(BPF_ALIGN_OF_U128), + .align_offset(align_of::()), 0 ); } diff --git a/programs/bpf_loader/src/syscalls.rs b/programs/bpf_loader/src/syscalls.rs index 312befd3bf..7448890e08 100644 --- a/programs/bpf_loader/src/syscalls.rs +++ b/programs/bpf_loader/src/syscalls.rs @@ -16,7 +16,7 @@ use solana_sdk::{ bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable::{self, UpgradeableLoaderState}, clock::Clock, - entrypoint::{BPF_ALIGN_OF_U128, MAX_PERMITTED_DATA_INCREASE, SUCCESS}, + entrypoint::{MAX_PERMITTED_DATA_INCREASE, SUCCESS}, epoch_schedule::EpochSchedule, feature_set::{ allow_native_ids, check_seed_length, close_upgradeable_program_accounts, cpi_data_cost, @@ -825,7 +825,7 @@ impl SyscallObject for SyscallAllocFree { result: &mut Result>, ) { let align = if self.aligned { - BPF_ALIGN_OF_U128 + align_of::() } else { align_of::() }; diff --git a/sdk/program/src/entrypoint.rs b/sdk/program/src/entrypoint.rs index 3d56ceb09a..6e8619cfbe 100644 --- a/sdk/program/src/entrypoint.rs +++ b/sdk/program/src/entrypoint.rs @@ -252,8 +252,8 @@ unsafe impl std::alloc::GlobalAlloc for BumpAllocator { /// Maximum number of bytes a program may add to an account during a single realloc pub const MAX_PERMITTED_DATA_INCREASE: usize = 1_024 * 10; -/// `assert_eq(std::mem::align_of::(), 8)` is true for BPF but not for some host machines -pub const BPF_ALIGN_OF_U128: usize = 8; +// Parameters passed to the entrypoint input buffer are aligned on 8-byte boundaries +pub const PARAMETER_ALIGNMENT: usize = 8; /// Deserialize the input arguments /// @@ -312,7 +312,7 @@ pub unsafe fn deserialize<'a>(input: *mut u8) -> (&'a Pubkey, Vec