aeabi_memcpy.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #![cfg(all(target_arch = "arm",
  2. not(any(target_env = "gnu", target_env = "musl")),
  3. target_os = "linux",
  4. feature = "mem"))]
  5. #![feature(compiler_builtins_lib)]
  6. #![feature(lang_items)]
  7. #![no_std]
  8. extern crate compiler_builtins;
  9. // test runner
  10. extern crate utest_cortex_m_qemu;
  11. // overrides `panic!`
  12. #[macro_use]
  13. extern crate utest_macros;
  14. macro_rules! panic {
  15. ($($tt:tt)*) => {
  16. upanic!($($tt)*);
  17. };
  18. }
  19. extern "C" {
  20. fn __aeabi_memcpy(dest: *mut u8, src: *const u8, n: usize);
  21. fn __aeabi_memcpy4(dest: *mut u8, src: *const u8, n: usize);
  22. }
  23. struct Aligned {
  24. array: [u8; 8],
  25. _alignment: [u32; 0],
  26. }
  27. impl Aligned {
  28. fn new(array: [u8; 8]) -> Self {
  29. Aligned {
  30. array: array,
  31. _alignment: [],
  32. }
  33. }
  34. }
  35. #[test]
  36. fn memcpy() {
  37. let mut dest = [0; 4];
  38. let src = [0xde, 0xad, 0xbe, 0xef];
  39. for n in 0..dest.len() {
  40. dest.copy_from_slice(&[0; 4]);
  41. unsafe { __aeabi_memcpy(dest.as_mut_ptr(), src.as_ptr(), n) }
  42. assert_eq!(&dest[0..n], &src[0..n])
  43. }
  44. }
  45. #[test]
  46. fn memcpy4() {
  47. let mut aligned = Aligned::new([0; 8]);
  48. let dest = &mut aligned.array;
  49. let src = [0xde, 0xad, 0xbe, 0xef, 0xba, 0xad, 0xf0, 0x0d];
  50. for n in 0..dest.len() {
  51. dest.copy_from_slice(&[0; 8]);
  52. unsafe { __aeabi_memcpy4(dest.as_mut_ptr(), src.as_ptr(), n) }
  53. assert_eq!(&dest[0..n], &src[0..n])
  54. }
  55. }