From 4861bd0d96baec42c1c38fedcd8abb7a93262bdf Mon Sep 17 00:00:00 2001 From: KazushiM <85604869+KazushiMe@users.noreply.github.com> Date: Mon, 25 Oct 2021 22:53:44 +0800 Subject: [PATCH] MemTesterNX: A userspace utility for testing memory faults and stability based on [memtester](https://pyropus.ca/software/memtester/) --- README.md | 1 + SdOut/switch/MemTesterNX.nro | Bin 0 -> 293061 bytes Source/MemTesterNX/.gitignore | 5 + Source/MemTesterNX/LICENSE | 339 +++++++++++++++++ Source/MemTesterNX/Makefile | 222 +++++++++++ Source/MemTesterNX/source/main.c | 275 ++++++++++++++ Source/MemTesterNX/source/memtester.h | 22 ++ Source/MemTesterNX/source/sizes.h | 38 ++ Source/MemTesterNX/source/tests.c | 513 ++++++++++++++++++++++++++ Source/MemTesterNX/source/tests.h | 39 ++ Source/MemTesterNX/source/types.h | 26 ++ 11 files changed, 1480 insertions(+) create mode 100644 SdOut/switch/MemTesterNX.nro create mode 100644 Source/MemTesterNX/.gitignore create mode 100644 Source/MemTesterNX/LICENSE create mode 100644 Source/MemTesterNX/Makefile create mode 100644 Source/MemTesterNX/source/main.c create mode 100755 Source/MemTesterNX/source/memtester.h create mode 100755 Source/MemTesterNX/source/sizes.h create mode 100755 Source/MemTesterNX/source/tests.c create mode 100755 Source/MemTesterNX/source/tests.h create mode 100755 Source/MemTesterNX/source/types.h diff --git a/README.md b/README.md index 7a442ff7..846ddc3e 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ Overclocking suite for Switch **(Mariko Only)** running on Atmosphere CFW. Suppo - Option to change the threshold for chargers providing enough power - Remove copyright watermark in screenshots/recordings, courtesy of [HookedBehemoth](https://github.com/HookedBehemoth/exefs_patches) - **TinyMemBenchNX**: DRAM throughput and latency test based on [tinymembench](https://github.com/ssvb/tinymembench) +- **MemTesterNX**: A userspace utility for testing memory faults and stability based on [memtester](https://pyropus.ca/software/memtester/) #### Details diff --git a/SdOut/switch/MemTesterNX.nro b/SdOut/switch/MemTesterNX.nro new file mode 100644 index 0000000000000000000000000000000000000000..a43efbd69d68fca26e228feb41c78a04d0faee6c GIT binary patch literal 293061 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

E^hd0R@|=lk`p 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 + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/Source/MemTesterNX/Makefile b/Source/MemTesterNX/Makefile new file mode 100644 index 00000000..8534105f --- /dev/null +++ b/Source/MemTesterNX/Makefile @@ -0,0 +1,222 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITPRO)/libnx/switch_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) +# +# NO_ICON: if set to anything, do not use icon. +# NO_NACP: if set to anything, no .nacp file is generated. +# APP_TITLE is the name of the app stored in the .nacp file (Optional) +# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) +# APP_VERSION is the version of the app stored in the .nacp file (Optional) +# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) +# ICON is the filename of the icon (.jpg), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .jpg +# - icon.jpg +# - /default_icon.jpg +# +# CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .json +# - config.json +# If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead +# of a homebrew executable (.nro). This is intended to be used for sysmodules. +# NACP building is skipped as well. +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := source +DATA := data +INCLUDES := include +#ROMFS := romfs + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE -fPIC + +CFLAGS := -g -Wall -O2 -ffunction-sections \ + $(ARCH) $(DEFINES) + +CFLAGS += $(INCLUDE) -D__SWITCH__ + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lnx + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) $(LIBNX) + + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES_BIN := $(addsuffix .o,$(BINFILES)) +export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) +export OFILES := $(OFILES_BIN) $(OFILES_SRC) +export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +ifeq ($(strip $(CONFIG_JSON)),) + jsons := $(wildcard *.json) + ifneq (,$(findstring $(TARGET).json,$(jsons))) + export APP_JSON := $(TOPDIR)/$(TARGET).json + else + ifneq (,$(findstring config.json,$(jsons))) + export APP_JSON := $(TOPDIR)/config.json + endif + endif +else + export APP_JSON := $(TOPDIR)/$(CONFIG_JSON) +endif + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.jpg) + ifneq (,$(findstring $(TARGET).jpg,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).jpg + else + ifneq (,$(findstring icon.jpg,$(icons))) + export APP_ICON := $(TOPDIR)/icon.jpg + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +ifeq ($(strip $(NO_ICON)),) + export NROFLAGS += --icon=$(APP_ICON) +endif + +ifeq ($(strip $(NO_NACP)),) + export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp +endif + +ifneq ($(APP_TITLEID),) + export NACPFLAGS += --titleid=$(APP_TITLEID) +endif + +ifneq ($(ROMFS),) + export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) +endif + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... +ifeq ($(strip $(APP_JSON)),) + @rm -fr $(BUILD) $(TARGET).nro $(TARGET).nacp $(TARGET).elf +else + @rm -fr $(BUILD) $(TARGET).nsp $(TARGET).nso $(TARGET).npdm $(TARGET).elf +endif + + +#--------------------------------------------------------------------------------- +else +.PHONY: all + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +ifeq ($(strip $(APP_JSON)),) + +all : $(OUTPUT).nro + +ifeq ($(strip $(NO_NACP)),) +$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp +else +$(OUTPUT).nro : $(OUTPUT).elf +endif + +else + +all : $(OUTPUT).nsp + +$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm + +$(OUTPUT).nso : $(OUTPUT).elf + +endif + +$(OUTPUT).elf : $(OFILES) + +$(OFILES_SRC) : $(HFILES_BIN) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o %_bin.h : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/Source/MemTesterNX/source/main.c b/Source/MemTesterNX/source/main.c new file mode 100644 index 00000000..c7267b5c --- /dev/null +++ b/Source/MemTesterNX/source/main.c @@ -0,0 +1,275 @@ +/* + * memtester version 4 + * + * Very simple but very effective user-space memory tester. + * Originally by Simon Kirby + * Version 2 by Charles Cazabon + * Version 3 not publicly released. + * Version 4 rewrite: + * Copyright (C) 2004-2020 Charles Cazabon + * Licensed under the terms of the GNU General Public License version 2 (only). + * See the file COPYING for details. + * + */ + +#define __version__ "4.5.1-full" + +// Include the most common headers from the C standard library +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "types.h" +#include "sizes.h" +#include "tests.h" +#include + +PadState pad; +unsigned short dividend; + +void waitForAnyKey() { + while (appletMainLoop()) + { + padUpdate(&pad); + + u64 kDown = padGetButtonsDown(&pad); + + if (kDown) + break; + + consoleUpdate(NULL); + } +} + +void ShowErr(const char* err, const char* details, Result rc) { + AppletStorage errStor; + LibAppletArgs args; + AppletHolder currentApplet; + + appletCreateLibraryApplet(¤tApplet, AppletId_LibraryAppletError, LibAppletMode_AllForeground); + libappletArgsCreate(&args, 1); + libappletArgsPush(&args, ¤tApplet); + appletCreateStorage(&errStor, 0x1018); + u8 argBuf[0x1018] = {0}; + argBuf[0] = 1; + + *(u64*)&argBuf[8] = (((rc & 0x1ffu) + 2000) | (((rc >> 9) & 0x1fff & 0x1fffll) << 32)); + strcpy((char*) &argBuf[24], err); + strcpy((char*) &argBuf[0x818], details); + appletStorageWrite(&errStor, 0, argBuf, 0x1018); + appletHolderPushInData(¤tApplet, &errStor); + + appletHolderStart(¤tApplet); + appletHolderJoin(¤tApplet); + appletHolderClose(¤tApplet); + appletHolderRequestExit(¤tApplet); +} + +struct test tests[] = { + { "Random Value", test_random_value }, + { "Compare XOR", test_xor_comparison }, + { "Compare SUB", test_sub_comparison }, + { "Compare MUL", test_mul_comparison }, + { "Compare DIV",test_div_comparison }, + { "Compare OR", test_or_comparison }, + { "Compare AND", test_and_comparison }, + { "Sequential Increment", test_seqinc_comparison }, + { "Solid Bits", test_solidbits_comparison }, + { "Block Sequential", test_blockseq_comparison }, + { "Checkerboard", test_checkerboard_comparison }, + { "Bit Spread", test_bitspread_comparison }, + { "Bit Flip", test_bitflip_comparison }, + { "Walking Ones", test_walkbits1_comparison }, + { "Walking Zeroes", test_walkbits0_comparison }, +#ifdef TEST_NARROW_WRITES + { "8-bit Writes", test_8bit_wide_random }, + { "16-bit Writes", test_16bit_wide_random }, +#endif + { NULL, NULL } +}; + +int memtester_pagesize(void) { + printf("using pagesize of 4096\n"); + return 4096; +} + +/* Global vars - so tests have access to this information */ +int use_phys = 0; +off_t physaddrbase = 0; + +// Main program entrypoint +int main(int argc, char* argv[]) +{ + if(appletGetAppletType() != AppletType_Application) { + ShowErr("Running in applet mode\nMemTesterNX requires full memory mode.\nPlease launch hbmenu by holding R on an APP (e.g. a game) NOT an applet (e.g. Gallery)", "", 0); + return 0; + } + + appletReportUserIsActive(); + + consoleInit(NULL); + + padConfigureInput(1, HidNpadStyleSet_NpadStandard); + + padInitializeDefault(&pad); + + ul loop, i; + unsigned short div, maxdiv = 0; + size_t pagesize, wantraw, wantbytes[4], wantbytes_orig, bufsize[4], halflen, count; + ptrdiff_t pagesizemask; + void volatile *buf[4], *aligned[4]; + ulv *bufa, *bufb; + int memshift; + ul testmask = 0; + ull totalmem = 0; + + printf("MemTesterNX version " __version__ " (%d-bit)\n", UL_LEN); + printf("Based on memtester. Copyright (C) 2001-2020 Charles Cazabon.\n"); + printf("Licensed under the GNU General Public License version 2 (only).\n\n"); + printf("4.5.1-full supports full RAM test (up to 8GB for devkit).\n"); + printf("It will looping forever until an error shows up or you manually exit to HOME screen.\n\n"); + printf("Press A: long test\nPress B: fast test\nPress any other key: exit\n\n"); + + while (appletMainLoop()) + { + padUpdate(&pad); + + u64 kDown = padGetButtonsDown(&pad); + + if (kDown & HidNpadButton_A) + { + dividend = 1; + break; + } + else if (kDown & HidNpadButton_B) + { + dividend = 4; + break; + } + else if (kDown) + { + consoleExit(NULL); + exit(0); + } + + consoleUpdate(NULL); + } + + pagesize = memtester_pagesize(); + pagesizemask = (ptrdiff_t) ~(pagesize - 1); + printf("pagesizemask is 0x%tx\n", pagesizemask); + consoleUpdate(NULL); + + memshift = 20; /* megabytes */ + wantraw = 2048; + + wantbytes_orig = ((size_t) wantraw << memshift); + + // Allocate as much RAM as possible. + for(div = 0; div <= 3; div++) + { + + buf[div] = NULL; + wantbytes[div] = wantbytes_orig; + + while (!buf[div] && wantbytes[div]) { + buf[div] = (void volatile *) malloc(wantbytes[div]); + if (!buf[div]) + wantbytes[div] -= pagesize; + } + + bufsize[div] = wantbytes[div]; + printf("Alloc %d: got %lluMB (%llu bytes)\n", div+1, (ull) wantbytes[div] >> 20, (ull) wantbytes[div]); + consoleUpdate(NULL); + + /* Do alighnment here as well, as some cases won't trigger above if you + define out the use of mlock() (cough HP/UX 10 cough). */ + if ((size_t) buf[div] % pagesize) { + /* printf("aligning to page -- was 0x%tx\n", buf); */ + aligned[div] = (void volatile *) ((size_t) buf[div] & pagesizemask) + pagesize; + /* printf(" now 0x%tx -- lost %d bytes\n", aligned, + * (size_t) aligned - (size_t) buf); + */ + bufsize[div] -= ((size_t) aligned[div] - (size_t) buf[div]); + } else { + aligned[div] = buf[div]; + } + + totalmem += wantbytes[div]; + + if((wantbytes[div] >> 20) < 2047) + { + maxdiv = div; + break; + } + } + + printf("\nTotal RAM allocated: %lldMB\n\n", totalmem >> 20); + consoleUpdate(NULL); + + for(loop=1;;loop++) + { + printf("Loop %lu:\n", loop); + + for(div=0; div<=maxdiv; div++) + { + printf("Alloc %d:\n", div+1); + printf(" %-20s: ", "Stuck Address"); + consoleUpdate(NULL); + + halflen = bufsize[div] / 2; + count = halflen / sizeof(ul); + bufa = (ulv *) aligned[div]; + bufb = (ulv *) ((size_t) aligned[div] + halflen); + + if (!test_stuck_address(aligned[div], bufsize[div] / sizeof(ul))) { + printf("ok\n"); + } + else + { + printf("Alloc %d: Error!\nPress any key to exit.\n", div+1); + waitForAnyKey(); + consoleExit(NULL); + return 0; + } + consoleUpdate(NULL); + for (i=0;;i++) { + if (!tests[i].name) break; + /* If using a custom testmask, only run this test if the + bit corresponding to this test was set by the user. + */ + if (testmask && (!((1 << i) & testmask))) { + continue; + } + printf(" %-20s: ", tests[i].name); + if (!tests[i].fp(bufa, bufb, count)) { + printf("ok\n"); + } + else + { + printf("Alloc %d: Error!\nPress any key to exit.\n", div+1); + waitForAnyKey(); + consoleExit(NULL); + return 0; + } + consoleUpdate(NULL); + /* clear buffer */ + memset((void *) buf[div], 255, wantbytes[div]); + } + printf("\n"); + consoleUpdate(NULL); + } + } + + // Deinitialize and clean up resources used by the console (important!) + consoleExit(NULL); + return 0; +} \ No newline at end of file diff --git a/Source/MemTesterNX/source/memtester.h b/Source/MemTesterNX/source/memtester.h new file mode 100755 index 00000000..2116eb86 --- /dev/null +++ b/Source/MemTesterNX/source/memtester.h @@ -0,0 +1,22 @@ +/* + * Very simple (yet, for some reason, very effective) memory tester. + * Originally by Simon Kirby + * Version 2 by Charles Cazabon + * Version 3 not publicly released. + * Version 4 rewrite: + * Copyright (C) 2004-2020 Charles Cazabon + * Licensed under the terms of the GNU General Public License version 2 (only). + * See the file COPYING for details. + * + * This file contains the declarations for external variables from the main file. + * See other comments in that file. + * + */ + +#include + +/* extern declarations. */ + +extern int use_phys; +extern off_t physaddrbase; + diff --git a/Source/MemTesterNX/source/sizes.h b/Source/MemTesterNX/source/sizes.h new file mode 100755 index 00000000..cd1c3adc --- /dev/null +++ b/Source/MemTesterNX/source/sizes.h @@ -0,0 +1,38 @@ +/* + * Very simple but very effective user-space memory tester. + * Originally by Simon Kirby + * Version 2 by Charles Cazabon + * Version 3 not publicly released. + * Version 4 rewrite: + * Copyright (C) 2004-2012 Charles Cazabon + * Licensed under the terms of the GNU General Public License version 2 (only). + * See the file COPYING for details. + * + * This file contains some macro definitions for handling 32/64 bit platforms. + * + */ + +#include + +#define rand32() ((unsigned int) rand() | ( (unsigned int) rand() << 16)) + +#if (ULONG_MAX == 4294967295UL) + #define rand_ul() rand32() + #define UL_ONEBITS 0xffffffff + #define UL_LEN 32 + #define CHECKERBOARD1 0x55555555 + #define CHECKERBOARD2 0xaaaaaaaa + #define UL_BYTE(x) ((x | x << 8 | x << 16 | x << 24)) +#elif (ULONG_MAX == 18446744073709551615ULL) + #define rand64() (((ul) rand32()) << 32 | ((ul) rand32())) + #define rand_ul() rand64() + #define UL_ONEBITS 0xffffffffffffffffUL + #define UL_LEN 64 + #define CHECKERBOARD1 0x5555555555555555 + #define CHECKERBOARD2 0xaaaaaaaaaaaaaaaa + #define UL_BYTE(x) (((ul)x | (ul)x<<8 | (ul)x<<16 | (ul)x<<24 | (ul)x<<32 | (ul)x<<40 | (ul)x<<48 | (ul)x<<56)) +#else + #error long on this platform is not 32 or 64 bits +#endif + + diff --git a/Source/MemTesterNX/source/tests.c b/Source/MemTesterNX/source/tests.c new file mode 100755 index 00000000..30a5cf19 --- /dev/null +++ b/Source/MemTesterNX/source/tests.c @@ -0,0 +1,513 @@ +/* + * Very simple but very effective user-space memory tester. + * Originally by Simon Kirby + * Version 2 by Charles Cazabon + * Version 3 not publicly released. + * Version 4 rewrite: + * Copyright (C) 2004-2020 Charles Cazabon + * Licensed under the terms of the GNU General Public License version 2 (only). + * See the file COPYING for details. + * + * This file contains the functions for the actual tests, called from the + * main routine in memtester.c. See other comments in that file. + * + */ + +#include +#include +#include +#include + +#include "tests.h" +#include "types.h" +#include "sizes.h" +#include "memtester.h" +#include + +extern unsigned short dividend; + +char progress[] = "-\\|/"; +#define PROGRESSLEN 4 +#define PROGRESSOFTEN 2000000 +#define ONE 0x00000001L + +union { + unsigned char bytes[UL_LEN/8]; + ul val; +} mword8; + +union { + unsigned short u16s[UL_LEN/16]; + ul val; +} mword16; + +/* Function definitions. */ + +int compare_regions(ulv *bufa, ulv *bufb, size_t count) { + int r = 0; + size_t i; + ulv *p1 = bufa; + ulv *p2 = bufb; + off_t physaddr; + + for (i = 0; i < count; i++, p1++, p2++) { + if (*p1 != *p2) { + if (use_phys) { + physaddr = physaddrbase + (i * sizeof(ul)); + printf("FAILURE: 0x%08lx != 0x%08lx at physical address 0x%08lx.\n", (ul) *p1, (ul) *p2, physaddr); + } else { + printf("FAILURE: 0x%08lx != 0x%08lx at offset 0x%08lx.\n", (ul) *p1, (ul) *p2, (ul) (i * sizeof(ul))); + } + consoleUpdate(NULL); + /* printf("Skipping to next test..."); */ + r = -1; + } + } + return r; +} + +int test_stuck_address(ulv *bufa, size_t count) { + ulv *p1 = bufa; + unsigned int j; + size_t i; + off_t physaddr; + + printf(" "); + for (j = 0; j < (16 / dividend) ; j++) { + printf("\b\b\b\b\b\b\b\b\b\b\b"); + p1 = (ulv *) bufa; + printf("setting %3u", j); + consoleUpdate(NULL); + for (i = 0; i < count; i++) { + *p1 = ((j + i) % 2) == 0 ? (ul) p1 : ~((ul) p1); + *p1++; + } + printf("\b\b\b\b\b\b\b\b\b\b\b"); + printf("testing %3u", j); + consoleUpdate(NULL); + p1 = (ulv *) bufa; + for (i = 0; i < count; i++, p1++) { + if (*p1 != (((j + i) % 2) == 0 ? (ul) p1 : ~((ul) p1))) { + if (use_phys) { + physaddr = physaddrbase + (i * sizeof(ul)); + printf("FAILURE: possible bad address line at physical address 0x%08lx.\n", physaddr); + } else { + printf("FAILURE: possible bad address line at offset 0x%08lx.\n", (ul) (i * sizeof(ul))); + } + printf("Skipping to next test...\n"); + consoleUpdate(NULL); + return -1; + } + } + } + printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); + return 0; +} + +int test_random_value(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + ul j = 0; + size_t i; + + putchar(' '); + for (i = 0; i < count; i++) { + *p1++ = *p2++ = rand_ul(); + if (!(i % PROGRESSOFTEN)) { + putchar('\b'); + putchar(progress[++j % PROGRESSLEN]); + consoleUpdate(NULL); + } + } + printf("\b \b"); + consoleUpdate(NULL); + return compare_regions(bufa, bufb, count); +} + +int test_xor_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + size_t i; + ul q = rand_ul(); + + for (i = 0; i < count; i++) { + *p1++ ^= q; + *p2++ ^= q; + } + return compare_regions(bufa, bufb, count); +} + +int test_sub_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + size_t i; + ul q = rand_ul(); + + for (i = 0; i < count; i++) { + *p1++ -= q; + *p2++ -= q; + } + return compare_regions(bufa, bufb, count); +} + +int test_mul_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + size_t i; + ul q = rand_ul(); + + for (i = 0; i < count; i++) { + *p1++ *= q; + *p2++ *= q; + } + return compare_regions(bufa, bufb, count); +} + +int test_div_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + size_t i; + ul q = rand_ul(); + + for (i = 0; i < count; i++) { + if (!q) { + q++; + } + *p1++ /= q; + *p2++ /= q; + } + return compare_regions(bufa, bufb, count); +} + +int test_or_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + size_t i; + ul q = rand_ul(); + + for (i = 0; i < count; i++) { + *p1++ |= q; + *p2++ |= q; + } + return compare_regions(bufa, bufb, count); +} + +int test_and_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + size_t i; + ul q = rand_ul(); + + for (i = 0; i < count; i++) { + *p1++ &= q; + *p2++ &= q; + } + return compare_regions(bufa, bufb, count); +} + +int test_seqinc_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + size_t i; + ul q = rand_ul(); + + for (i = 0; i < count; i++) { + *p1++ = *p2++ = (i + q); + } + return compare_regions(bufa, bufb, count); +} + +int test_solidbits_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + unsigned int j; + ul q; + size_t i; + + printf(" "); + for (j = 0; j < (64 / dividend / dividend); j++) { + printf("\b\b\b\b\b\b\b\b\b\b\b"); + q = (j % 2) == 0 ? UL_ONEBITS : 0; + printf("setting %3u", j); + consoleUpdate(NULL); + p1 = (ulv *) bufa; + p2 = (ulv *) bufb; + for (i = 0; i < count; i++) { + *p1++ = *p2++ = (i % 2) == 0 ? q : ~q; + } + printf("\b\b\b\b\b\b\b\b\b\b\b"); + printf("testing %3u", j); + consoleUpdate(NULL); + if (compare_regions(bufa, bufb, count)) { + return -1; + } + } + printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); + consoleUpdate(NULL); + return 0; +} + +int test_checkerboard_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + unsigned int j; + ul q; + size_t i; + + printf(" "); + for (j = 0; j < (64 / dividend / dividend); j++) { + printf("\b\b\b\b\b\b\b\b\b\b\b"); + q = (j % 2) == 0 ? CHECKERBOARD1 : CHECKERBOARD2; + printf("setting %3u", j); + consoleUpdate(NULL); + p1 = (ulv *) bufa; + p2 = (ulv *) bufb; + for (i = 0; i < count; i++) { + *p1++ = *p2++ = (i % 2) == 0 ? q : ~q; + } + printf("\b\b\b\b\b\b\b\b\b\b\b"); + printf("testing %3u", j); + consoleUpdate(NULL); + if (compare_regions(bufa, bufb, count)) { + return -1; + } + } + printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); + consoleUpdate(NULL); + return 0; +} + +int test_blockseq_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + unsigned int j; + size_t i; + + printf(" "); + for (j = 0; j < (64 / dividend / dividend) ; j++) { + printf("\b\b\b\b\b\b\b\b\b\b\b"); + p1 = (ulv *) bufa; + p2 = (ulv *) bufb; + printf("setting %3u", j); + consoleUpdate(NULL); + for (i = 0; i < count; i++) { + *p1++ = *p2++ = (ul) UL_BYTE(j); + } + printf("\b\b\b\b\b\b\b\b\b\b\b"); + printf("testing %3u", j); + consoleUpdate(NULL); + if (compare_regions(bufa, bufb, count)) { + return -1; + } + } + printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); + consoleUpdate(NULL); + return 0; +} + +int test_walkbits0_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + unsigned int j; + size_t i; + + printf(" "); + for (j = 0; j < (UL_LEN * 2 / dividend / dividend); j++) { + printf("\b\b\b\b\b\b\b\b\b\b\b"); + p1 = (ulv *) bufa; + p2 = (ulv *) bufb; + printf("setting %3u", j); + consoleUpdate(NULL); + for (i = 0; i < count; i++) { + if (j < UL_LEN) { /* Walk it up. */ + *p1++ = *p2++ = ONE << j; + } else { /* Walk it back down. */ + *p1++ = *p2++ = ONE << (UL_LEN * 2 - j - 1); + } + } + printf("\b\b\b\b\b\b\b\b\b\b\b"); + printf("testing %3u", j); + consoleUpdate(NULL); + if (compare_regions(bufa, bufb, count)) { + return -1; + } + } + printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); + return 0; +} + +int test_walkbits1_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + unsigned int j; + size_t i; + + printf(" "); + for (j = 0; j < (UL_LEN * 2 / dividend / dividend); j++) { + printf("\b\b\b\b\b\b\b\b\b\b\b"); + p1 = (ulv *) bufa; + p2 = (ulv *) bufb; + printf("setting %3u", j); + consoleUpdate(NULL); + for (i = 0; i < count; i++) { + if (j < UL_LEN) { /* Walk it up. */ + *p1++ = *p2++ = UL_ONEBITS ^ (ONE << j); + } else { /* Walk it back down. */ + *p1++ = *p2++ = UL_ONEBITS ^ (ONE << (UL_LEN * 2 - j - 1)); + } + } + printf("\b\b\b\b\b\b\b\b\b\b\b"); + printf("testing %3u", j); + consoleUpdate(NULL); + if (compare_regions(bufa, bufb, count)) { + return -1; + } + } + printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); + return 0; +} + +int test_bitspread_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + unsigned int j; + size_t i; + + printf(" "); + for (j = 0; j < (UL_LEN * 2 / dividend / dividend); j++) { + printf("\b\b\b\b\b\b\b\b\b\b\b"); + p1 = (ulv *) bufa; + p2 = (ulv *) bufb; + printf("setting %3u", j); + consoleUpdate(NULL); + for (i = 0; i < count; i++) { + if (j < UL_LEN) { /* Walk it up. */ + *p1++ = *p2++ = (i % 2 == 0) + ? (ONE << j) | (ONE << (j + 2)) + : UL_ONEBITS ^ ((ONE << j) + | (ONE << (j + 2))); + } else { /* Walk it back down. */ + *p1++ = *p2++ = (i % 2 == 0) + ? (ONE << (UL_LEN * 2 - 1 - j)) | (ONE << (UL_LEN * 2 + 1 - j)) + : UL_ONEBITS ^ (ONE << (UL_LEN * 2 - 1 - j) + | (ONE << (UL_LEN * 2 + 1 - j))); + } + } + printf("\b\b\b\b\b\b\b\b\b\b\b"); + printf("testing %3u", j); + consoleUpdate(NULL); + if (compare_regions(bufa, bufb, count)) { + return -1; + } + } + printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); + return 0; +} + +int test_bitflip_comparison(ulv *bufa, ulv *bufb, size_t count) { + ulv *p1 = bufa; + ulv *p2 = bufb; + unsigned int j, k; + ul q; + size_t i; + + printf(" "); + for (k = 0; k < (UL_LEN / dividend / dividend); k++) { + q = ONE << k; + for (j = 0; j < 8; j++) { + printf("\b\b\b\b\b\b\b\b\b\b\b"); + q = ~q; + printf("setting %3u", k * 8 + j); + consoleUpdate(NULL); + p1 = (ulv *) bufa; + p2 = (ulv *) bufb; + for (i = 0; i < count; i++) { + *p1++ = *p2++ = (i % 2) == 0 ? q : ~q; + } + printf("\b\b\b\b\b\b\b\b\b\b\b"); + printf("testing %3u", k * 8 + j); + consoleUpdate(NULL); + if (compare_regions(bufa, bufb, count)) { + return -1; + } + } + } + printf("\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b"); + return 0; +} + +#ifdef TEST_NARROW_WRITES +int test_8bit_wide_random(ulv* bufa, ulv* bufb, size_t count) { + u8v *p1, *t; + ulv *p2; + int attempt; + unsigned int b, j = 0; + size_t i; + + putchar(' '); + for (attempt = 0; attempt < 2; attempt++) { + if (attempt & 1) { + p1 = (u8v *) bufa; + p2 = bufb; + } else { + p1 = (u8v *) bufb; + p2 = bufa; + } + for (i = 0; i < count; i++) { + t = mword8.bytes; + *p2++ = mword8.val = rand_ul(); + for (b=0; b < UL_LEN/8; b++) { + *p1++ = *t++; + } + if (!(i % PROGRESSOFTEN)) { + putchar('\b'); + putchar(progress[++j % PROGRESSLEN]); + consoleUpdate(NULL); + } + } + if (compare_regions(bufa, bufb, count)) { + return -1; + } + } + printf("\b \b"); + consoleUpdate(NULL); + return 0; +} + +int test_16bit_wide_random(ulv* bufa, ulv* bufb, size_t count) { + u16v *p1, *t; + ulv *p2; + int attempt; + unsigned int b, j = 0; + size_t i; + + putchar( ' ' ); + for (attempt = 0; attempt < 2; attempt++) { + if (attempt & 1) { + p1 = (u16v *) bufa; + p2 = bufb; + } else { + p1 = (u16v *) bufb; + p2 = bufa; + } + for (i = 0; i < count; i++) { + t = mword16.u16s; + *p2++ = mword16.val = rand_ul(); + for (b = 0; b < UL_LEN/16; b++) { + *p1++ = *t++; + } + if (!(i % PROGRESSOFTEN)) { + putchar('\b'); + putchar(progress[++j % PROGRESSLEN]); + consoleUpdate(NULL); + } + } + if (compare_regions(bufa, bufb, count)) { + return -1; + } + } + printf("\b \b"); + consoleUpdate(NULL); + return 0; +} +#endif diff --git a/Source/MemTesterNX/source/tests.h b/Source/MemTesterNX/source/tests.h new file mode 100755 index 00000000..e8b2f5ff --- /dev/null +++ b/Source/MemTesterNX/source/tests.h @@ -0,0 +1,39 @@ +/* + * Very simple yet very effective memory tester. + * Originally by Simon Kirby + * Version 2 by Charles Cazabon + * Version 3 not publicly released. + * Version 4 rewrite: + * Copyright (C) 2004-2020 Charles Cazabon + * Licensed under the terms of the GNU General Public License version 2 (only). + * See the file COPYING for details. + * + * This file contains the declarations for the functions for the actual tests, + * called from the main routine in memtester.c. See other comments in that + * file. + * + */ + +/* Function declaration. */ + +int test_stuck_address(unsigned long volatile *bufa, size_t count); +int test_random_value(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_xor_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_sub_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_mul_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_div_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_or_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_and_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_seqinc_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_solidbits_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_checkerboard_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_blockseq_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_walkbits0_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_walkbits1_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_bitspread_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_bitflip_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +#ifdef TEST_NARROW_WRITES +int test_8bit_wide_random(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +int test_16bit_wide_random(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count); +#endif + diff --git a/Source/MemTesterNX/source/types.h b/Source/MemTesterNX/source/types.h new file mode 100755 index 00000000..4cb41c3c --- /dev/null +++ b/Source/MemTesterNX/source/types.h @@ -0,0 +1,26 @@ +/* + * Very simple but very effective user-space memory tester. + * Originally by Simon Kirby + * Version 2 by Charles Cazabon + * Version 3 not publicly released. + * Version 4 rewrite: + * Copyright (C) 2004-2020 Charles Cazabon + * Licensed under the terms of the GNU General Public License version 2 (only). + * See the file COPYING for details. + * + * This file contains typedefs, structure, and union definitions. + * + */ + +#include "sizes.h" + +typedef unsigned long ul; +typedef unsigned long long ull; +typedef unsigned long volatile ulv; +typedef unsigned char volatile u8v; +typedef unsigned short volatile u16v; + +struct test { + char *name; + int (*fp)(); +};