mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-10-29 17:54:14 +08:00
The switch is reached through four register functions and the SFR_DATA registers, so a flat register file behind them is enough to run the table code on the host. A few addresses are live: writing TBL_CTRL with EXECUTE performs the VLAN or L2 operation at once and clears the bit, STAT_GET fetches a counter, L2_TBL_FLUSH_CTRL drops entries. Nothing ever reports busy, so a polling loop runs once and the tests say nothing about what happens when hardware stalls; that question was settled elsewhere. The header states the VLAN and L2 entry layouts on its own, so a test can hold what rtl837x_port.c writes against a second reading of the same bits rather than against itself. The first suite does that for the VLAN entry, the PVID register two ports share, the static multicast and management entries, the per-port flush and the trunk registers. Two stub headers stand in for the ones a firmware build generates, so the harness needs no SDCC build first.
60 lines
2.0 KiB
Makefile
60 lines
2.0 KiB
Makefile
# Host unit-test harness for RTLPlayground firmware logic.
|
|
#
|
|
# Compiles selected firmware translation units with host gcc + AddressSanitizer,
|
|
# force-including sdcc_shim.h to erase 8051 keywords, and links them against
|
|
# mocked hardware edges (support.c). No SDCC, no flashing, no hardware.
|
|
#
|
|
# make build + run all tests
|
|
# make run run tests
|
|
# make clean
|
|
|
|
CC = gcc
|
|
SRCROOT = ..
|
|
# -include shim first so __xdata/__code/__banked vanish before any firmware header.
|
|
CFLAGS = -std=gnu11 -g -O1 -Wall -Wextra -Wno-unused-parameter -Wno-unknown-pragmas \
|
|
-Wno-pointer-sign \
|
|
-DRTLP_HOST_TEST \
|
|
-fsanitize=address,undefined -fno-omit-frame-pointer \
|
|
-include sdcc_shim.h -Istub -I. -I$(SRCROOT) -I$(SRCROOT)/httpd -I$(SRCROOT)/uip
|
|
ifeq ($(findstring clang,$(shell $(CC) --version 2>/dev/null)),)
|
|
CFLAGS += -Wno-builtin-declaration-mismatch
|
|
endif
|
|
LDFLAGS = -fsanitize=address,undefined
|
|
|
|
BUILDDIR = build
|
|
|
|
# One binary per subsystem under test.
|
|
TESTS = $(BUILDDIR)/test_cmd_editor \
|
|
$(BUILDDIR)/test_port_tables
|
|
|
|
# The table tests link the register mock and one environment file; stub/
|
|
# stands in for the two headers a firmware build generates.
|
|
TABLE_ENV = support.c hw_mock.c env_tables.c $(SRCROOT)/cmd_editor.c \
|
|
$(SRCROOT)/rtl837x_port.c $(SRCROOT)/httpd/page_impl.c
|
|
|
|
all: run
|
|
|
|
$(BUILDDIR):
|
|
mkdir -p $(BUILDDIR)
|
|
|
|
# cmd_editor.c is compiled UNMODIFIED from the firmware tree.
|
|
$(BUILDDIR)/test_cmd_editor: test_cmd_editor.c support.c $(SRCROOT)/cmd_editor.c | $(BUILDDIR)
|
|
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
|
|
|
|
# rtl837x_port.c and httpd/page_impl.c are compiled UNMODIFIED from the firmware tree.
|
|
$(BUILDDIR)/test_port_tables: test_port_tables.c $(TABLE_ENV) hw_mock.h | $(BUILDDIR)
|
|
$(CC) $(CFLAGS) $(filter %.c,$^) -o $@ $(LDFLAGS)
|
|
|
|
run: $(TESTS)
|
|
@fail=0; for t in $(TESTS); do \
|
|
echo "=== $$t ==="; \
|
|
$$t || fail=1; \
|
|
echo; \
|
|
done; \
|
|
if [ $$fail -ne 0 ]; then echo "TESTS FAILED"; exit 1; else echo "ALL TESTS PASSED"; fi
|
|
|
|
clean:
|
|
rm -rf $(BUILDDIR)
|
|
|
|
.PHONY: all run clean
|