Files
LithosAnanake/v3/include/vm_host.h
T
rajamesandJunie a8b70e88d3 Reorganize source tree: kernel/, v3/, v4/ split and board infrastructure
Source tree reorganization:
- Move StarForth v3 engine to v3/ (src/, include/, Makefile)
- Move kernel to kernel/ (src/, include/, linker/, Makefile)
- Create v4/ skeleton for F18-ISA golden model (DECOMPOSITION.md, JUSTIFICATION.md)
- Move FABRIC-0..4.md to docs/fabric/
- Move ONTOLOGY.md and ROADMAP.md to docs/

Board infrastructure:
- Add boards/ser5/, boards/raspi/, boards/milkv/, boards/zynq7020/
- Each board has board.mk (ISA, CPU flags, boot recipe) and README.md
- Root Makefile becomes thin dispatcher: boot_image, all, clean, docs take TARGET
- make boot_image TARGET=SER5|RASPI|MILKV builds one GPT/MBR image per board
- ZYNQ7020 target exists but stops with clear error (ARMv7 port not built yet)
- scripts/mkdiskimage.sh builds disk images for all boards

Docs pipeline:
- docs/book/ with LaTeX master (main.tex) and Makefile
- pandoc converts Markdown to LaTeX at build time
- Two Lua filters: table-widths.lua (wide tables wrap), code-breaks.lua (inline code breaks)
- make docs builds single PDF (754 pages, 0 missing characters)
- make docs TARGET=<board> adds board appendix
- build/docs/<book|board>/meta.tex stamps git commit into PDF

Bug fixes:
- 42 include paths that only worked by accident now use correct relative paths
- clang-18 hardcode replaced with configurable CC variable (fixed aarch64 build)
- Pi 5: kernel_2712.img linked at 0x80000, .bss zeroed, memory reserved
- Doxyfile, .clang-tidy, README.md, Kconfig paths updated

Verified:
- Hosted v3 build passes 1012 tests, 0 failures
- SER5 image boots in QEMU (OVMF), POST passes, K exact (65536 = Q48_ONE)
- Milk-V image boots in QEMU (OpenSBI + U-Boot + bootefi), POST passes
- make clean TARGET=<board> removes only that board and its ISA objects
- make all builds all boards, hosted v3, and docs in one run

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-01 15:40:09 -04:00

179 lines
5.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
StarForth — Steady-State Virtual Machine Runtime
Copyright (c) 2023–2025 Robert A. James
All rights reserved.
This file is part of the StarForth project.
Licensed under the StarForth License, Version 1.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at:
https://github.com/star.4th@proton.me/StarForth/LICENSE.txt
This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
express or implied, including but not limited to the warranties of
merchantability, fitness for a particular purpose, and noninfringement.
See the License for the specific language governing permissions and
limitations under the License.
StarForth — Steady-State Virtual Machine Runtime
Copyright (c) 2023–2025 Robert A. James
All rights reserved.
This file is part of the StarForth project.
Licensed under the StarForth License, Version 1.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at:
https://github.com/star.4th@proton.me/StarForth/LICENSE.txt
This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
express or implied, including but not limited to the warranties of
merchantability, fitness for a particular purpose, and noninfringement.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* vm_host.h - Host services abstraction for StarForth VM
*
* Provides pluggable allocator, time, and mutex services.
* Hosted builds use libc; kernel builds use PMM/kmalloc/TSC.
*
* M7 Non-Negotiable: All allocation goes through these hooks.
* No direct malloc/free in VM code.
*/
#ifndef STARKERNEL_VM_HOST_H
#define STARKERNEL_VM_HOST_H
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
struct DictEntry;
/**
* Host allocator function signature
* Returns NULL on failure
*/
typedef void* (*sk_alloc_fn)(size_t size, size_t align);
/**
* Host free function signature
*/
typedef void (*sk_free_fn)(void *ptr);
/**
* Host monotonic time function signature
* Returns nanoseconds since arbitrary epoch
* In PARITY_MODE, returns deterministic fake time
*/
typedef uint64_t (*sk_time_fn)(void);
/**
* Host mutex operations (no-op in kernel single-threaded mode)
*/
typedef int (*sk_mutex_init_fn)(void *mutex);
typedef int (*sk_mutex_lock_fn)(void *mutex);
typedef int (*sk_mutex_unlock_fn)(void *mutex);
typedef void (*sk_mutex_destroy_fn)(void *mutex);
/**
* Host console output (for words that print)
* Returns number of bytes written, or -1 on error
*/
typedef int (*sk_puts_fn)(const char *str);
typedef int (*sk_putc_fn)(int c);
/**
* Host execution-token validation
* Returns 1 if pointer is executable, 0 otherwise
*/
typedef bool (*sk_xt_validate_fn)(const void *ptr);
/**
* Host dictionary entry ownership check
*/
typedef bool (*sk_xt_entry_owns_fn)(const void *entry, size_t bytes);
/**
* Host fatal handler (panic)
*/
typedef void (*sk_panic_fn)(const char *message);
/**
* VMHostServices - pluggable host operations
*
* Hosted builds point these at libc functions.
* Kernel builds point these at kernel implementations.
*/
typedef struct VMHostServices {
/* Memory allocation */
sk_alloc_fn alloc;
sk_free_fn free;
/* Monotonic time source */
sk_time_fn monotonic_ns;
/* Mutex operations (can be no-ops) */
sk_mutex_init_fn mutex_init;
sk_mutex_lock_fn mutex_lock;
sk_mutex_unlock_fn mutex_unlock;
sk_mutex_destroy_fn mutex_destroy;
/* Console output */
sk_puts_fn puts;
sk_putc_fn putc;
/* XT validation */
sk_xt_validate_fn is_executable_ptr;
sk_xt_entry_owns_fn owns_xt_entry;
sk_panic_fn panic;
/* Flags */
int parity_mode; /* 1 = deterministic time */
int verbose; /* 1 = enable logging */
} VMHostServices;
/**
* Get the current host services instance.
* Returns hosted or kernel services depending on build.
*/
const VMHostServices* sk_host_services(void);
/**
* Initialize host services for kernel build.
* Must be called before any VM operations.
*/
#ifdef __STARKERNEL__
void sk_host_init(void);
#endif
/**
* Convenience macros for common operations
* Use these instead of direct malloc/free/etc.
*/
#define SK_ALLOC(size) (sk_host_services()->alloc((size), sizeof(void*)))
#define SK_ALLOC_ALIGNED(s, a) (sk_host_services()->alloc((s), (a)))
#define SK_FREE(ptr) (sk_host_services()->free(ptr))
#define SK_TIME_NS() (sk_host_services()->monotonic_ns())
#define SK_PUTS(str) (sk_host_services()->puts(str))
#define SK_PUTC(c) (sk_host_services()->putc(c))
/**
* Mutex wrapper macros
*/
#define SK_MUTEX_INIT(m) (sk_host_services()->mutex_init(m))
#define SK_MUTEX_LOCK(m) (sk_host_services()->mutex_lock(m))
#define SK_MUTEX_UNLOCK(m) (sk_host_services()->mutex_unlock(m))
#define SK_MUTEX_DESTROY(m) (sk_host_services()->mutex_destroy(m))
#endif /* STARKERNEL_VM_HOST_H */