mirror of
https://github.com/memtest86plus/memtest86plus.git
synced 2026-08-26 21:27:15 -05:00
* Initial commit for ARM64 (header.S & startup.S) * Add Aarch64 interrupt handler * Adapt lib/ to Aarch64 * Small ASM addition for AArch64 * Rewrite Aarch64 system/ - cpuid.c/cpuinfo.c for CPU detection (Qualcomm, Apple, Nvidia, etc) - Add ARM Power State Coordination Interface (PSCI) functions - vmem.c for Virtual Memory MAnagement on ARM64 - Various functions placeholders * Add pseudo-TSC correction for Aarch64 * Add pseudo-tsc measurement for Aarch64 * Add Aarch64 if/elif on basic IO/MMIO/MEM RW functions * Add support for Surface 13 / Snapdragon X KB USB Fix an issue with the XHCI.c drivers with packets > 8 bytes * Add MMIO Serial support for ARM64 * Add ARM64 ASM for block_move & mov_inv_fixed. Fix VM start pointer * Add ARM Serial MMIO configuration * Revert previous commit & reintroduce ARM64 cache functions * Add ACPI MCFG Table description & SMP parsing. This requires careful review/testing to avoid BC issues! * Revert previous commmit and reintroduce relocation and heap change for ARM64 * ARM64 does not support CPU PNS. Use DMI type4 parsing instead. Add SMBIOS v3 support (ARM64 does not support v2) * Fix typo in pci.h * Move Aarch64 load-limit computation from main.c to pmem.c * Add .arm64 to version string. Use PMU for clock computation display. Fix D5 Temp NULL not handled * Add Makefile and linker scripts for aarch64. Set cross-compiler from x86 by default * Attempt to add aarch64 to workflow * Remove a remaining internal debug flag * Correct typos * Fix ARM64 SMP freeze assign heap when RAM is one contiguous region, keep it below 3GB for DMA (RPi5), add DSB before SEV to avoid missed barrier wakeups Sync I-cache with D-cache after program relocation to prevent stale instruction fetch * Validate MADT entry lengths to avoid reading past the table (or looping forever) on malformed ACPI tables * aarch64: add NEON kernels for the vector PRSG tests Tests 3 (bus stress) and 5 (moving inversions, random) now dispatch to 128-bit NEON fill/scan instead of scalar. * Fix ARM64 data abort from the per-second DMI check & fix unbounded strstr() * Fix ARM64 data abort when saving results to USB after a relocation * Update README.md with AArch64 (ARM64) support * aarch64: shrink static string tables, harden MCFG/paging Replace pointer-based name tables with inline char arrays (saves ~1.5KB + relocs) alidate MCFG length/bus ranges, and bound pm_map/vm_map fills against overflows * Add NVIDIA & latest Apple ARM SoC to cpuid.c * Fix stale pointers read by the report writer after a program relocation cpu_model gets a static init (creates its reloc record)SPD type becomes an inline char array
115 lines
3.0 KiB
C
115 lines
3.0 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#ifndef STRING_H
|
|
#define STRING_H
|
|
/**
|
|
* \file
|
|
*
|
|
* Provides a subset of the functions normally provided by <string.h>.
|
|
*
|
|
*//*
|
|
* Copyright (C) 2020-2022 Martin Whitaker.
|
|
*/
|
|
|
|
#include <stddef.h>
|
|
|
|
/**
|
|
* Compares the first n bytes of the memory areas pointed to by s1 and s2
|
|
* and returns 0 if all bytes are the same or the numerical difference
|
|
* between the first mismatching byte in s1 (interpreted as an unsigned
|
|
* value) and the corresponding byte in s2.
|
|
*/
|
|
static inline int memcmp(const void *s1, const void *s2, size_t n)
|
|
{
|
|
const unsigned char *src1 = s1, *src2 = s2;
|
|
|
|
for (size_t i = 0; i < n; i++) {
|
|
if (src1[i] != src2[i]) {
|
|
return (int)src1[i] - (int)src2[i];
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Copies n bytes from the memory area pointed to by src to the memory area
|
|
* pointed to by dest and returns a pointer to dest. The memory areas must
|
|
* not overlap.
|
|
* void *memcpy(void *dst, const void *src, size_t n);
|
|
*/
|
|
#if !(defined(DEBUG_GDB) || defined(__loongarch_lp64) || defined(__aarch64__) || defined(__clang__))
|
|
#define memcpy(d, s, n) __builtin_memcpy((d), (s), (n))
|
|
#else
|
|
void *memcpy (void *dest, const void *src, size_t len);
|
|
#endif
|
|
|
|
/**
|
|
* Copies n bytes from the memory area pointed to by src to the memory area
|
|
* pointed to by dest and returns a pointer to dest. The memory areas may
|
|
* overlap.
|
|
*/
|
|
void *memmove(void *dest, const void *src, size_t n);
|
|
|
|
/**
|
|
* Fills the first n bytes of the memory area pointed to by s with the byte
|
|
* value c.
|
|
* void *memset(void *s, int c, size_t n);
|
|
*/
|
|
#if !(defined(DEBUG_GDB) || defined(__loongarch_lp64) || defined(__aarch64__) || defined(__clang__))
|
|
#define memset(s, c, n) __builtin_memset((s), (c), (n))
|
|
#else
|
|
void *memset (void *dest, int val, size_t len);
|
|
#endif
|
|
|
|
/**
|
|
* Returns the string length, excluding the terminating null character.
|
|
*/
|
|
static inline size_t strlen(const char *s)
|
|
{
|
|
size_t len = 0;
|
|
while (*s++) {
|
|
len++;
|
|
}
|
|
return len;
|
|
}
|
|
|
|
/**
|
|
* Compares at most the first n characters in the strings s1 and s2 and
|
|
* returns 0 if all characters are the same or the numerical difference
|
|
* between the first mismatching character in s1 (interpreted as a signed
|
|
* value) and the corresponding character in s2.
|
|
*/
|
|
static inline int strncmp(const char *s1, const char *s2, size_t n)
|
|
{
|
|
for (size_t i = 0; i < n; i++) {
|
|
if (s1[i] != s2[i]) {
|
|
return (int)s1[i] - (int)s2[i];
|
|
}
|
|
if (s1[i] == '\0') {
|
|
return 0;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Finds the first occurrence of the substring needle in the string haystack
|
|
* and returns a pointer to the beginning of the located substring, or NULL
|
|
* if the substring is not found.
|
|
*/
|
|
char *strstr(const char *haystack, const char *needle);
|
|
|
|
/**
|
|
* Convert n to characters in s
|
|
*/
|
|
|
|
char *itoa(int num, char *str);
|
|
|
|
/**
|
|
* Convert a hex string to the corresponding 32-bit uint value.
|
|
* returns 0 if a non-hex char is found (not 0-9/a-f/A-F).
|
|
*/
|
|
|
|
uint32_t hexstr2int(const char *hexstr);
|
|
|
|
#endif // STRING_H
|