Compare commits

...
47 Commits
Author SHA1 Message Date
Aaron e69b134bff Integrate x86_64 desktop boot and extend VirtualBox validation
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is passing
2026-11-08 09:02:34 +00:00
Aaron a6a55153af Enable native WASM execution with process-owned contexts and cleanup 2026-11-08 09:02:34 +00:00
Aaron e462165049 Enable native desktop applications and synchronized resolution changes 2026-11-08 09:02:34 +00:00
Aaron b71e6d67b4 Port E1000 networking and bound packet and DMA handling 2026-11-08 09:02:34 +00:00
Aaron 465cf1deca Enable native USB core, OHCI, mass storage and HID drivers 2026-11-08 09:02:33 +00:00
Aaron f8911ccdec Port storage and filesystems to x86_64 with stable device ownership 2026-11-08 09:02:33 +00:00
Aaron a27d9cb39d Port shared core and platform services to native pointer widths 2026-11-08 09:02:33 +00:00
Aaron 7a6be7f66e Refactor builds to use target profiles and discovery; remove architecture checker 2026-11-07 20:50:04 +00:00
Aaron 6a1eb5e2ac Add x86_64 kernel bring-up with build-selected platform adapters 2026-11-07 20:13:20 +00:00
Aaron e8e4061564 fix file header
continuous-integration/drone Build is failing
2026-11-07 10:19:01 +00:00
Aaron 10691a9e03 fix file headers 2026-11-07 10:18:33 +00:00
Aaron cebad0b583 Fix USB volume discovery, automounting, and file saves 2026-11-01 20:22:07 +00:00
Aaron 53cc758e60 Add standard license headers and Aaron Hance attribution 2026-10-31 20:56:15 +00:00
Aaron 6c7619bc2c Keep development plan local and remove it from version control 2026-10-31 20:50:31 +00:00
Aaron d318eca262 Refactor VFS shared operations and remove unused legacy storage wrappers 2026-10-31 20:46:48 +00:00
Aaron c28b9dd77f Implement USB mass storage and batch OHCI bulk transfers 2026-10-31 20:36:52 +00:00
Aaron c0c56a9c84 Add initial ext2 read/write and formatting support
Register ext2 at boot, integrate mode-aware VFS opens and volume cleanup, and queue asynchronous transfers through a persistent worker.

Validation: Pascal compiler check and git diff --check passed. Full build blocked by Docker engine HTTP 500; runtime and Linux interoperability remain unverified.
2026-10-31 19:49:36 +00:00
Aaron 720ba46630 Improve disk benchmark suites and timing, and fix command launch race 2026-10-31 19:06:46 +00:00
Aaron 8e0ab3da8b Improve storage performance with read pipelining, run lookup, request merging, and counters 2026-10-31 17:32:59 +00:00
Aaron 3d4f846a8f fix(ahci): harden command submission, DMA ownership, and timeout recovery 2026-10-31 16:56:18 +00:00
Aaron d8d51ba5df feat(storage): use volume labels for default mount folders 2026-10-31 16:39:43 +00:00
Aaron d1ecd3fc41 fix(storage): harden disk operations, add volume labels, and stabilize AHCI discovery 2026-10-31 16:30:40 +00:00
Aaron 7e99bc2db1 fat
continuous-integration/drone/push Build is passing
2026-03-24 18:10:04 +00:00
Aaron 096db148d0 fat32: fix pre-alloc cluster leak; add write-handle ref-count
- Remove FAT_WRITE_PREALLOC_BYTES (redundant at typical cluster sizes)
- Simplify fatPreallocClusterCount to always return MAX_CLUSTERS
- FAT32CloseFile: truncate pre-allocated tail clusters back to ByteSize
  on close, freeing FAT chain entries beyond the file's real size
- Add TFATWriteRef + WriteRefs[32] in TFATVolumeCtx and Registered flag
  on TFATOpenFile to track concurrent write handles per dir entry
- fatRegisterWriteHandle / fatUnregisterWriteHandle: CLI-guarded slot scan
  keyed by (DirLoc.SectorLBA, DirLoc.EntryIdx)
- Register on first FAT chain extension in FAT32EnsureCapacityForWrite
- Truncation in FAT32CloseFile skipped unless this is the last writer
  (prevents RunMap corruption in concurrent-open scenarios)
- Add forward decl for fatFreeClusterChain to fix ordering issue
- app.iotest: update default path to /disk/vol2/IOTEST.BIN
2026-03-18 21:05:36 +00:00
Aaron 663bfbb0e4 storage: lifecycle watch system, PFSFormatParams, vol busy/format flags, diskutil improvements
- Add TStorageLifecycleWatch with watch_lifecycle/unwatch_lifecycle API (up to 32 watchers)
- Add notify_lifecycle to broadcast mount/unmount/format events to registered callbacks
- Replace raw puint32 config in format_volume with typed PFSFormatParams
- Add volume_is_busy, volume_is_formatting, volume_set_mounted helpers
- Add lifecycleFlags field to TStorage_Volume for tracking busy/formatting state
- Expand app.diskutil with improved commands and volume state reporting
- Minor improvements to core.util, arch.x86.util, proc.mgr, VFS, and flatfs
- Remove obsolete driver.storage.fs.fat32.old.pas
2026-03-16 23:03:43 +00:00
Aaron aadc59f831 fat32 rewrite and storage stability fixes 2026-03-16 21:18:44 +00:00
Aaron 5d7aacc28f more improvements 2026-03-15 23:58:52 +00:00
Aaron 4810617922 FAT improvements and switch to 2-way associative cache 2026-03-15 19:46:31 +00:00
Aaron 666a011a9f refactor fat32 2026-03-15 15:11:00 +00:00
Aaron a6e81bf5d3 VFS improvements, IO fixes, IO performance improvements. 2026-03-15 14:02:17 +00:00
admin 7ed8012c7e Merge pull request 'feature/boot.mgr' (#71) from feature/boot.mgr into develop
continuous-integration/drone/push Build is passing
Reviewed-on: #71
Reviewed-by: Aaron Hance <[email protected]>
2026-03-14 20:38:39 +00:00
t3hn3rd e7f7325c54 Fix unicode characters
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-03-14 20:02:25 +00:00
t3hn3rd 516be28057 Rebase on develop: fix duplicate include.
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-03-13 15:49:03 +00:00
t3hn3rd 2d190c221a feature: boot.mgr replace hardcoded init sequence with dependency-driven boot manager
Introduce boot.mgr - a self-registering, dependency-ordered boot
initialization framework with barrier-based phasing and glob pattern
matching. Units now declare their own init procedures and dependencies
via registerBoot()/registerBarrier() in their initialization sections,
boot.mgr.run() topologically sorts and executes them.

- Add src/boot/boot.mgr.pas with topoSort, glob matching, barrier
  two-pass algorithm, and boot tree printer
- Gut src/asuro.pas (kmain): now just stores multiboot info, calls
  System.init(), boot.mgr.run, and yield()
- Add initialization sections with registerBoot() to 53 existing units
- Add new units: core.pas, test.pas, driver.storage.boot.pas,
  app.wasm.pas, app.bsod.pas (factored out of asuro.pas)
- Define 9 barrier phases: immediate -> early -> middle -> storage ->
  bus -> device -> bus.late -> late -> final
- Fix xHCI ISR: exclude PRC/WRC from PORTSC change bit clearing to
  prevent race with port reset busy-wait
- Fix driver.bus.usb.core fire_completion_hooks: guard against uint32
  underflow when CompletionHookCount = 0
- Move auto_mount_volumes from device barrier to late barrier so it
  runs after PCI scan discovers storage controllers
- Add toolchain/compile_initcalls.sh for boot entry extraction
- Add Boot Registration sections to all 51 doc files; create 4 new
  doc files; rewrite boot.mgr.md; update mkdocs.yml nav
2026-03-13 15:37:43 +00:00
Aaron dd56ffbcb4 Merge pull request 'feature/file_browser' (#61) from feature/file_browser into develop
continuous-integration/drone/push Build is passing
Reviewed-on: #61
2026-03-12 19:26:21 +00:00
Aaron ee7dcd107b feat(filebrowser): add delete button to toolbar, fix FAT32 delete/rename with raw sector scanning
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
- Add SYM_TRASH toolbar button wired to fb_delete_cb (was missing entirely)
- Filter '.' and '..' entries in fb_collect_cb so they never appear
- Rewrite deleteFile/deleteDir/renameFile to use raw sector scanning
  instead of getDirEntries linked-list indices (fixes  gap mismatch)
- Handle root directory correctly (use bootRecord^.rootCluster instead
  of assuming entry 0 is '.')
2026-03-11 19:41:51 +00:00
Aaron 671c144ad5 fix: FAT32 >1024 byte read/write truncation, VFS write notifications & dir watch
- FAT32 writeFile: replace hardcoded spc=4 with bootRecord^.spc for
  cluster allocation and per-sector write loop
- FAT32 writeFile: update directory entry byteSize on disk after write
- FAT32 readFile: use dir^.byteSize instead of cluster-based estimate,
  fix off-by-one in read loop, remove spurious +sectorSize allocation
- VFS: fire VFS_OnMutation on sync/async writes (cache invalidate + watch)
- VFS: invalidate all cache entries for volume on mutation (relPath mismatch)
- VFS: add vfsParentDir helper, store VFSDir in file descriptors
- FDTable: add VFSDir field, free on close
- File browser: enable directory watch & poll timer, two-step new file
  creation (open + write), remove io.syslog import
- Linker: add --no-warn-execstack to suppress ld exit code 1 on warning
- Add core.strings.helpers unit (getFileExtension, fmtFileSize, sort)
2026-03-11 19:41:51 +00:00
Aaron 8755f108f2 refactor: rename core.stringhelpers to core.strings.helpers 2026-03-11 19:41:50 +00:00
Aaron 17ee64ba02 refactor: rename core.search to core.stringhelpers 2026-03-11 19:41:50 +00:00
Aaron 6383b35945 remove debug file 2026-03-11 19:41:50 +00:00
Aaron b9e6c53be2 removed unused icons 2026-03-11 19:41:49 +00:00
Aaron abac1ce4a3 fix: replace raw mouse hook with LVGL long-press for file browser context menu
Removed driver.hid.mouse dependency that caused page fault on close.
Context menu now triggers via LV_EVENT_LONG_PRESSED on content rows.
Cleaned up onClose teardown ordering and removed debug syslog markers.
2026-03-11 19:41:49 +00:00
Aaron 5628c1ddbf feat: file dispatch system, file-type icons, multi-instance notepad
- Add extension-based dispatch to driver.storage.filedispatch with typed
  union (variant record THandlerKind = hkMagic/hkExtension)
- Extract file-type icon constants and mapping to core.gfx.fileicons
- Add core.search utility (getFileExtension, fmtFileSize, sortStringArray)
- Generate PUA bitmap icon fonts (32/64/128px) from Font Awesome via
  gen_file_icons.py + compile_icons.sh toolchain
- Integrate file dispatch into file browser (double-click triggers dispatch)
- Register notepad as handler for text file extensions
- Fix init order in app.mgr (filedispatch.init before app inits)
- Refactor notepad from singleton to multi-instance (up to 8 windows)
  using instance array, findStateByWid, and LVGL user_data on msgboxes
2026-03-11 19:41:49 +00:00
admin 140d3d6d68 Merge pull request 'feature: add RFC 8259 JSON parser/serializer and string utility extensions' (#62) from feature/json into develop
continuous-integration/drone/push Build is passing
Reviewed-on: #62
Reviewed-by: Aaron Hance <[email protected]>
2026-03-10 19:26:24 +00:00
admin 1ff6e7549d Merge pull request 'feature: mirror all diagnostics to syslog, add VESA fallback for gfxd crashes' (#63) from feature/panic-fallback into develop
continuous-integration/drone/push Build is passing
Reviewed-on: #63
Reviewed-by: Aaron Hance <[email protected]>
2026-03-10 19:26:02 +00:00
t3hn3rd aa28d62e03 feature: mirror all diagnostics to syslog, add VESA fallback for gfxd crashes
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
- syslogDump now outputs all five diagnostic sections (Fault Info,
  CPU Registers, Process Info, System Info, Call Stack) to serial,
  matching the on-screen BSOD content
- panic() detects if the crash occurred in the gfxd process and
  falls back to rendering the BSOD directly to the VESA framebuffer
  via driver.video text drawing, bypassing LVGL entirely
- Add DrawChar, DrawString, DrawHex, DrawInt to driver.video for
  8x16 bitmap font rendering directly to the framebuffer
- Export SHOULD_CRASH flag from svc.gfxd interface so test commands
  can trigger a deliberate gfxd crash
- Add app.divzero with DIV0, PF, and CRASHGFXD test commands
- Update doc/src/core/core.panic.md and doc/src/driver/video/driver.video.md
2026-03-10 12:35:22 +00:00
t3hn3rd 63f6c5ecc1 feature: add RFC 8259 JSON parser/serializer and string utility extensions
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
Add core.fmt.json — a complete RFC 8259 JSON library with recursive-descent
parser, serializer, builders, dot/bracket path accessors, and full cleanup.
Supports all 6 JSON value types plus JSON_ERROR for parse error reporting.
Numbers stored as Double via x87 FPU. Unicode \uXXXX escapes handled
(ASCII range emitted, non-ASCII replaced with '?').

Supporting changes:
- core.strings: add int64ToString, doubleToStr (scientific notation for
  very large/small values, fixed-point for normal range, trailing zero
  trimming), plus unit tests for both
- asuro.pas: wire core.fmt.json.UnitTest into the boot test suite
- mkdocs.yml: add JSON nav entry under Formats
- doc/src/core/fmt/core.fmt.json.md: full API documentation
- doc/src/core/core.strings.md: document int64ToString and doubleToStr
- doc/planning/json.md: implementation plan and design spec
- doc/planning/webgpu.md: WebGPU-over-WASM design plan (software
  rasterizer backend for WASM apps importing webgpu.h)
2026-03-10 11:51:48 +00:00
278 changed files with 96744 additions and 9213 deletions

No files matched your search

+3
View File
@@ -1,6 +1,8 @@
/lib/*.ppu
/lib/*.a
/lib/*.o
/lib/x86_64/
/bin/x86_64/
/release/*.svg
/release/*.iso
/bin/*.bin
@@ -15,6 +17,7 @@ localenv.json
dockerout.txt
AGENTS.md
lessons_learnt.md
/plan.md
*.log
wasuro
src/core/core.version.pas
+2 -2
View File
@@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND=noninteractive
RUN dpkg --add-architecture i386
RUN apt-get update && apt-get install -y \
curl dos2unix wget git make nasm binutils xorriso grub-pc-bin gcc gcc-multilib \
python3 python3-pip && \
python3 python3-pip python3-pil fp-compiler && \
apt-get clean my room
RUN pip3 install --no-cache-dir --break-system-packages "mkdocs>=1.6,<2" mkdocs-material
@@ -20,6 +20,6 @@ RUN curl -sL https://sourceforge.net/projects/freepascal/files/Linux/$FPC_VERSIO
ADD https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver /usr/bin/semver
RUN chmod +x /usr/bin/semver
WORKDIR /code
RUN find . -type f -print0 | xargs -0 dos2unix
# Sources are mounted at runtime; the CMD below normalizes build scripts.
ENTRYPOINT ["/bin/bash", "-c"]
CMD ["find toolchain -name '*.sh' -exec dos2unix {} + 2>/dev/null; find toolchain -name '*.sh' -exec chmod +x {} +; bash toolchain/compile.sh"]
+10 -10
View File
@@ -22,12 +22,12 @@ type
THeapPageHeader = memory.heap.THeapPageHeader;
procedure init;
function kalloc(size : uint32) : void;
function klalloc(size : uint32) : void;
procedure klfree(address : uint32);
function kpalloc(address : uint32) : void;
function kalloc(size : SizeUInt) : void;
function klalloc(size : SizeUInt) : void;
procedure klfree(address : PtrUInt);
function kpalloc(address : PtrUInt) : void;
procedure kfree(area : void);
function lmm_total_free : uint32;
function lmm_total_free : SizeUInt;
function lmm_page_count : uint32;
implementation
@@ -37,22 +37,22 @@ begin
memory.heap.init;
end;
function kalloc(size : uint32) : void; inline;
function kalloc(size : SizeUInt) : void; inline;
begin
kalloc := memory.heap.kalloc(size);
end;
function klalloc(size : uint32) : void; inline;
function klalloc(size : SizeUInt) : void; inline;
begin
klalloc := memory.heap.klalloc(size);
end;
procedure klfree(address : uint32); inline;
procedure klfree(address : PtrUInt); inline;
begin
memory.heap.klfree(address);
end;
function kpalloc(address : uint32) : void; inline;
function kpalloc(address : PtrUInt) : void; inline;
begin
kpalloc := memory.heap.kpalloc(address);
end;
@@ -62,7 +62,7 @@ begin
memory.heap.kfree(area);
end;
function lmm_total_free : uint32; inline;
function lmm_total_free : SizeUInt; inline;
begin
lmm_total_free := memory.heap.lmm_total_free;
end;
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -205,7 +205,7 @@ Key constants:
- `DATA_OFFSET = $10000` — data area starts at 64 KB into each page
- `LARGE_ALLOC_MAGIC = $FFFFFFFE` — sentinel for klalloc'd multi-page allocations
Interrupt safety: `pushfd; cli; pop saved_flags` (stack-balanced) + `restore_if(saved_flags)`
Interrupt safety: `pushfd; cli; pop saved_flags` (stack-balanced) + `arch.platform.cpu.unlock(saved_flags)`
inline procedure that only restores IF via `sti`, avoiding dangerous EFLAGS restoration
(IOPL, NT, VM, AC bits that caused Bad-TSS on IRET).
@@ -256,7 +256,7 @@ list, fixes Search_Page, calls `free_page_at_address`). Skips Root_Page.
| Bug | Root Cause | Fix |
|-----|-----------|-----|
| Bad TSS exception during network processing | `pushfd`/`popfd` across separate asm blocks: FPC doesn't track ESP changes in asm, causing EFLAGS corruption (NT=1, IOPL wrong) → Bad TSS on IRET | Stack-balanced `pushfd; cli; pop local_var` + `restore_if()` that only does `sti` if IF was set |
| Bad TSS exception during network processing | `pushfd`/`popfd` across separate asm blocks: FPC doesn't track ESP changes in asm, causing EFLAGS corruption (NT=1, IOPL wrong) → Bad TSS on IRET | Stack-balanced `pushfd; cli; pop local_var` + `arch.platform.cpu.unlock()` that only does `sti` if IF was set |
| GPF from SSE MOVAPS in doublebuffer flush | `SIZE_PREFIX=4`→8 gave 8-byte alignment; `MOVAPS` needs 16-byte. `klalloc` returned `page+8` (not 16-aligned) | `SIZE_PREFIX=16` (4B size + 12B pad), klalloc header expanded to 16 bytes |
| Pages never freed (historic) | `free_page` extracted wrong block index from PDE Address field | Fixed extraction to `Address SHR 10` — page freeing works for the first time |
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+4
View File
@@ -17,6 +17,10 @@ Central initialization manager for all baked-in terminal programs and kernel-lev
- `core.version`, `arch.x86.cpu`
- `app.diskcmd`, `driver.bus.usb.core`, `app.diskutil`, `app.notepad`, `app.partcmd`, `app.volcmd`
## Boot Registration
Registered with `boot.mgr` as `app.mgr` at the `late` barrier.
## Functions and Procedures
### init
+28
View File
@@ -0,0 +1,28 @@
# app.wasm
WebAssembly VM backend initialiser.
## Overview
This unit initialises the Wasuro WebAssembly virtual machine backend. It wires up the VM's character output to the syslog interface and calls the main `wasm_init` entry point.
## Boot Registration
Registered with `boot.mgr` as `app.wasm` at the `final` barrier.
## Dependencies
- `boot.mgr`
- `io.syslog`
- `wasm.vm.io`
- `wasm`
## Procedures
### init
```pascal
procedure init;
```
Sets the WASM VM's write-character callback to `io.syslog.logchar` and calls `wasm.wasm_init` to initialise the VM runtime.
+4
View File
@@ -13,6 +13,10 @@ This unit probes the processor using the CPUID instruction to discover the vendo
- `driver.timer.rtc`
- `io.stdio`
## Boot Registration
Registered with `boot.mgr` as `arch.x86.cpu` at the `early` barrier.
## Types
### TCapabilities_Old / PCapabilities_Old
+4
View File
@@ -10,6 +10,10 @@ This unit defines the GDT data structures and provides procedures to set individ
- `io.syslog`
## Boot Registration
Registered with `boot.mgr` as `arch.x86.gdt` at the `early` barrier.
## Types
### TGDT_Entry / PGDT_Entry
+4
View File
@@ -12,6 +12,10 @@ This unit defines the 256-entry IDT used by the x86 interrupt system. It provide
- `arch.x86.util`
- `io.syslog`
## Boot Registration
Registered with `boot.mgr` as `arch.x86.idt`, depending on `arch.x86.gdt`.
## Constants
### ISR_RING_0
+4
View File
@@ -12,6 +12,10 @@ This unit reinitialises and remaps the two 8259A Programmable Interrupt Controll
- `arch.x86.util`
- `io.syslog`
## Boot Registration
Registered with `boot.mgr` as `arch.x86.irq`, depending on `arch.x86.idt`.
## Functions and Procedures
### init
+4
View File
@@ -6,6 +6,10 @@ ISR driver initialisation stub.
This is a minimal stub unit that satisfies compile-time dependencies on an ISR initialisation entry point. The `init` procedure body is empty; actual ISR handler registration and IDT gate setup are performed by `arch.x86.isr.mgr` and the individual handler units in the `isr/` and `fault/` subdirectories.
## Boot Registration
Registered with `boot.mgr` as `asuro.x86.isr`, depending on glob `driver.storage.*.mgr` (waits for all matching entries).
## Functions and Procedures
### init
+4
View File
@@ -12,6 +12,10 @@ This unit acts as the glue layer between the x86 interrupt subsystem and the arc
- `arch.x86.util` (implementation)
- `arch.x86.isr.types` (implementation)
## Boot Registration
Registered with `boot.mgr` as `arch.x86.panic`, depending on glob `driver.video*` (waits for all matching entries).
## Functions and Procedures
### init
+4
View File
@@ -22,6 +22,10 @@ A minimal TSS is installed in GDT gate 5 so the CPU can locate the ring-0 stack
- `arch.x86.idt`
- `arch.x86.isr.types`
## Boot Registration
Registered with `boot.mgr` as `arch.x86.v86` at the `early` barrier.
## Constants
| Constant | Value | Description |
+4
View File
@@ -28,6 +28,10 @@ This unit is the single entry point for registering all x86 CPU exception handle
- `arch.x86.fault.snpe`
- `arch.x86.fault.uie`
## Boot Registration
Registered with `boot.mgr` as `arch.x86.fault`, depending on `arch.x86.isr.mgr`.
## Functions and Procedures
### init
+4
View File
@@ -18,6 +18,10 @@ Each ISR stub is declared with the Free Pascal `interrupt` directive, which caus
- `io.syslog` (implementation)
- `arch.x86.isr.ioapic` (implementation)
## Boot Registration
Registered with `boot.mgr` as `arch.x86.isr.mgr`, depending on `arch.x86.irq`.
## Constants
`MAX_HOOKS` is imported from `arch.x86.isr.types` and defines the maximum number of callbacks per vector.
@@ -16,6 +16,10 @@ During initialisation, the Multiboot memory map is walked to populate `PhysPrese
- `core.util`
- `arch.x86.util`
## Boot Registration
Registered with `boot.mgr` as `arch.x86.memory.physical`, depending on `arch.x86.idt`.
## Constants
| Constant | Value | Description |
@@ -17,6 +17,10 @@ During `init`, the current page directory loaded by the bootloader is adopted as
- `debug.tracer`
- `memory.heap` (implementation)
## Boot Registration
Registered with `boot.mgr` as `arch.x86.memory.virtual`, depending on `arch.x86.memory.physical`.
## Types
### TPageDirEntry / PPageDirEntry
Loaded 20 of 278 files, more files were not shown because too many files have changed in this diff. Show more