diff --git a/Tools/Toolsets/rpi-5-elf.json b/Tools/Toolsets/rpi-5-elf.json new file mode 100644 index 00000000..88d9a133 --- /dev/null +++ b/Tools/Toolsets/rpi-5-elf.json @@ -0,0 +1,19 @@ +{ + "schemaVersion": "1.0", + "swiftCompiler": { + "extraCLIOptions": [ + "-Xfrontend", "-disable-stack-protector", + "-Xfrontend", "-function-sections", + "-enable-experimental-feature", "Embedded", + "-Xfrontend", "-mergeable-symbols", + "-Xclang-linker", "-fuse-ld=lld", + "-Xclang-linker", "-nostdlib" + ] + }, + "linker": { + "extraCLIOptions": [ + "-T", "Sources/Support/linkerscript.ld", + "--unresolved-symbols=ignore-in-object-files" + ] + } +} diff --git a/rpi-4b-blink/Makefile b/rpi-4b-blink/Makefile index da37442b..77b7f29d 100644 --- a/rpi-4b-blink/Makefile +++ b/rpi-4b-blink/Makefile @@ -1,28 +1,47 @@ -SWIFT_EXEC ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f swift; else which swift; fi) -CLANG ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f clang; else which clang; fi) -LLVM_OBJCOPY ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f llvm-objcopy; else which llvm-objcopy; fi) +##===----------------------------------------------------------------------===## +## +## This source file is part of the Swift open source project +## +## Copyright (c) 2025 Apple Inc. and the Swift project authors. +## Licensed under Apache License v2.0 with Runtime Library Exception +## +## See https://swift.org/LICENSE.txt for license information +## +##===----------------------------------------------------------------------===## -BUILDROOT := $(shell $(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector --show-bin-path) +# Paths +REPOROOT := $(shell git rev-parse --show-toplevel) +TOOLSROOT := $(REPOROOT)/Tools +TOOLSET := $(TOOLSROOT)/Toolsets/rpi-5-elf.json +LLVM_OBJCOPY := llvm-objcopy +SWIFT_BUILD := swift build -.PHONY: all clean +# Flags +ARCH := aarch64 +TARGET := $(ARCH)-none-none-elf +SWIFT_BUILD_ARGS := \ + --configuration release \ + --triple $(TARGET) \ + --toolset $(TOOLSET) \ + --disable-local-rpath +BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path) -all: kernel8.img +.PHONY: build +build: + @echo "building..." + $(SWIFT_BUILD) \ + $(SWIFT_BUILD_ARGS) \ + --verbose -kernel8.img: kernel8.elf - @echo "💾 Converting to binary kernel image with llvm-objcopy..." - $(LLVM_OBJCOPY) -O binary kernel8.elf kernel8.img - @echo "" - @echo "🥳 Done! kernel8.img was saved to this directory." + @echo "extracting binary..." + $(LLVM_OBJCOPY) \ + -O binary \ + "$(BUILDROOT)/Application" \ + "$(BUILDROOT)/Application.bin" \ -kernel8.elf: $(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o link.ld - @echo "🔗 Linking with clang..." - $(CLANG) --target=aarch64-elf -o kernel8.elf $< $^ -fuse-ld=lld -nostdlib -Wl,--unresolved-symbols=ignore-in-object-files -Wl,-T ./link.ld - @echo "" - -$(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o: - @echo "🛠️ Building with Swift Package Manager..." - $(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector - @echo "" +.PHONY: clean clean: - rm -rf kernel8.elf kernel8.img .build \ No newline at end of file + @echo "cleaning..." + @swift package clean + @rm -rf .build diff --git a/rpi-4b-blink/Package.resolved b/rpi-4b-blink/Package.resolved index 6b4a420f..bfffc5ae 100644 --- a/rpi-4b-blink/Package.resolved +++ b/rpi-4b-blink/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "34c5bcbd964b6dde904b1ee02c0f89612b6ec5884ebfe47bfe412daefc0becd4", + "originHash" : "d0330fea11b0fbdacbddd4f13debd9a4fe72ed5b628ad4959a93972f3572bf1f", "pins" : [ { "identity" : "swift-argument-parser", @@ -15,8 +15,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-mmio.git", "state" : { - "branch" : "swift-embedded-examples", - "revision" : "06d96ed4916739f2edafde87f3951b2d2a04df65" + "branch" : "main", + "revision" : "5232c5129a8c70beafc3d6acfbae2716c1b6822a" } }, { diff --git a/rpi-4b-blink/Package.swift b/rpi-4b-blink/Package.swift index 05fd6188..5c4c7081 100644 --- a/rpi-4b-blink/Package.swift +++ b/rpi-4b-blink/Package.swift @@ -3,33 +3,19 @@ import PackageDescription let package = Package( - name: "RPi4B-Blink", - platforms: [ - .macOS(.v14) - ], + name: "rpi-4b-blink", products: [ - .library( - name: "MainApp", - type: .static, - targets: ["MainApp"]) + .executable(name: "Application", targets: ["Application"]) ], dependencies: [ - .package( - url: "https://github.com/apple/swift-mmio.git", - branch: "swift-embedded-examples") + .package(url: "https://github.com/apple/swift-mmio.git", branch: "main") ], targets: [ - .target( - name: "MainApp", + .executableTarget( + name: "Application", dependencies: [ - .product(name: "MMIO", package: "swift-mmio") - ], - swiftSettings: [ - .enableExperimentalFeature("Embedded"), - .unsafeFlags(["-Xfrontend", "-function-sections"]), - ] - ), + .product(name: "MMIO", package: "swift-mmio"), + "Support", + ]), .target(name: "Support"), - - ] -) + ]) diff --git a/rpi-4b-blink/README.md b/rpi-4b-blink/README.md index 1afa751a..a2613709 100644 --- a/rpi-4b-blink/README.md +++ b/rpi-4b-blink/README.md @@ -14,11 +14,9 @@ - Build the program, then copy the kernel image to the SD card. ``` console $ cd rpi-4b-blink -$ export TOOLCHAINS='' # Your Swift nightly toolchain identifier $ make $ cp kernel8.img /Volumes/bootfs ``` - If your original OS is not 64-bit, make sure to set `arm_64bit=1` in `config.txt`. - Place the SD card in your Raspberry Pi 4B, and connect it to power. - After the boot sequence, the green (ACT) led will start blinking in a regular pattern. - diff --git a/rpi-4b-blink/Sources/MainApp/MainApp.swift b/rpi-4b-blink/Sources/Application/Application.swift similarity index 98% rename from rpi-4b-blink/Sources/MainApp/MainApp.swift rename to rpi-4b-blink/Sources/Application/Application.swift index eaef412f..77da587a 100644 --- a/rpi-4b-blink/Sources/MainApp/MainApp.swift +++ b/rpi-4b-blink/Sources/Application/Application.swift @@ -67,11 +67,9 @@ func ledOff() { } @main -struct Main { - +struct Application { static func main() { setLedOutput() - while true { ledOn() for _ in 1..<100000 {} // just a delay diff --git a/rpi-4b-blink/Sources/Support/include/boot.h b/rpi-4b-blink/Sources/Support/include/Support.h similarity index 100% rename from rpi-4b-blink/Sources/Support/include/boot.h rename to rpi-4b-blink/Sources/Support/include/Support.h diff --git a/rpi-4b-blink/link.ld b/rpi-4b-blink/Sources/Support/linkerscript.ld similarity index 61% rename from rpi-4b-blink/link.ld rename to rpi-4b-blink/Sources/Support/linkerscript.ld index dfbf0227..8f10b405 100644 --- a/rpi-4b-blink/link.ld +++ b/rpi-4b-blink/Sources/Support/linkerscript.ld @@ -1,6 +1,7 @@ SECTIONS { - . = 0x80000; /* Kernel load address for AArch64 */ + /* Kernel load address for AArch64 */ + . = 0x80000; .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } PROVIDE(_data = .); @@ -14,6 +15,13 @@ SECTIONS } _end = .; - /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } + /DISCARD/ : { + *(.comment) + *(.gnu*) + *(.note*) + *(.eh_frame*) + *(.swift_modhash) + } } -__bss_size = (__bss_end - __bss_start)>>3; + +__bss_size = (__bss_end - __bss_start) >> 3; diff --git a/rpi-5-blink/Makefile b/rpi-5-blink/Makefile index da37442b..77b7f29d 100644 --- a/rpi-5-blink/Makefile +++ b/rpi-5-blink/Makefile @@ -1,28 +1,47 @@ -SWIFT_EXEC ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f swift; else which swift; fi) -CLANG ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f clang; else which clang; fi) -LLVM_OBJCOPY ?= $(shell if [ "$(shell uname)" = "Darwin" ]; then xcrun -f llvm-objcopy; else which llvm-objcopy; fi) +##===----------------------------------------------------------------------===## +## +## This source file is part of the Swift open source project +## +## Copyright (c) 2025 Apple Inc. and the Swift project authors. +## Licensed under Apache License v2.0 with Runtime Library Exception +## +## See https://swift.org/LICENSE.txt for license information +## +##===----------------------------------------------------------------------===## -BUILDROOT := $(shell $(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector --show-bin-path) +# Paths +REPOROOT := $(shell git rev-parse --show-toplevel) +TOOLSROOT := $(REPOROOT)/Tools +TOOLSET := $(TOOLSROOT)/Toolsets/rpi-5-elf.json +LLVM_OBJCOPY := llvm-objcopy +SWIFT_BUILD := swift build -.PHONY: all clean +# Flags +ARCH := aarch64 +TARGET := $(ARCH)-none-none-elf +SWIFT_BUILD_ARGS := \ + --configuration release \ + --triple $(TARGET) \ + --toolset $(TOOLSET) \ + --disable-local-rpath +BUILDROOT := $(shell $(SWIFT_BUILD) $(SWIFT_BUILD_ARGS) --show-bin-path) -all: kernel8.img +.PHONY: build +build: + @echo "building..." + $(SWIFT_BUILD) \ + $(SWIFT_BUILD_ARGS) \ + --verbose -kernel8.img: kernel8.elf - @echo "💾 Converting to binary kernel image with llvm-objcopy..." - $(LLVM_OBJCOPY) -O binary kernel8.elf kernel8.img - @echo "" - @echo "🥳 Done! kernel8.img was saved to this directory." + @echo "extracting binary..." + $(LLVM_OBJCOPY) \ + -O binary \ + "$(BUILDROOT)/Application" \ + "$(BUILDROOT)/Application.bin" \ -kernel8.elf: $(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o link.ld - @echo "🔗 Linking with clang..." - $(CLANG) --target=aarch64-elf -o kernel8.elf $< $^ -fuse-ld=lld -nostdlib -Wl,--unresolved-symbols=ignore-in-object-files -Wl,-T ./link.ld - @echo "" - -$(BUILDROOT)/libMainApp.a $(BUILDROOT)/Support.build/boot.S.o: - @echo "🛠️ Building with Swift Package Manager..." - $(SWIFT_EXEC) build --triple aarch64-none-none-elf -Xswiftc -Xfrontend -Xswiftc -disable-stack-protector - @echo "" +.PHONY: clean clean: - rm -rf kernel8.elf kernel8.img .build \ No newline at end of file + @echo "cleaning..." + @swift package clean + @rm -rf .build diff --git a/rpi-5-blink/Package.resolved b/rpi-5-blink/Package.resolved index 1a6f57c0..4cf1835e 100644 --- a/rpi-5-blink/Package.resolved +++ b/rpi-5-blink/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "193ca3f107e2c8dd2da5d091f6259f64b2cbfd6776d1c26bbcfb195b3a0b5045", + "originHash" : "5bb00fe2bf59115297c70799769d8080cf6ce836d32f4a41d42e7c420afddec6", "pins" : [ { "identity" : "swift-argument-parser", @@ -15,8 +15,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-mmio.git", "state" : { - "branch" : "swift-embedded-examples", - "revision" : "06d96ed4916739f2edafde87f3951b2d2a04df65" + "branch" : "main", + "revision" : "5232c5129a8c70beafc3d6acfbae2716c1b6822a" } }, { diff --git a/rpi-5-blink/Package.swift b/rpi-5-blink/Package.swift index 90371cef..7bd48409 100644 --- a/rpi-5-blink/Package.swift +++ b/rpi-5-blink/Package.swift @@ -3,33 +3,19 @@ import PackageDescription let package = Package( - name: "RPi5-Blink", - platforms: [ - .macOS(.v14) - ], + name: "rpi-5-blink", products: [ - .library( - name: "MainApp", - type: .static, - targets: ["MainApp"]) + .executable(name: "Application", targets: ["Application"]) ], dependencies: [ - .package( - url: "https://github.com/apple/swift-mmio.git", - branch: "swift-embedded-examples") + .package(url: "https://github.com/apple/swift-mmio.git", branch: "main") ], targets: [ - .target( - name: "MainApp", + .executableTarget( + name: "Application", dependencies: [ - .product(name: "MMIO", package: "swift-mmio") - ], - swiftSettings: [ - .enableExperimentalFeature("Embedded"), - .unsafeFlags(["-Xfrontend", "-function-sections"]), - ] - ), + .product(name: "MMIO", package: "swift-mmio"), + "Support", + ]), .target(name: "Support"), - - ] -) + ]) diff --git a/rpi-5-blink/README.md b/rpi-5-blink/README.md index 09872c0c..bed37e98 100644 --- a/rpi-5-blink/README.md +++ b/rpi-5-blink/README.md @@ -14,7 +14,6 @@ - Build the program, then copy the kernel image to the SD card. ``` console $ cd rpi-5-blink -$ export TOOLCHAINS='' # Your Swift nightly toolchain identifier $ make $ cp kernel8.img /Volumes/bootfs # Copy kernel image to SD card $ rm /Volumes/bootfs/kernel_2712.img # Delete this kernel image so our kernel8.img is used @@ -22,4 +21,3 @@ $ # You can also rename our kernel8.img to kernel_2712.img, or set it to anythin ``` - Place the SD card in your Raspberry Pi 5, and connect it to power. - After the boot sequence, the green (ACT) led will start blinking in a regular pattern. - diff --git a/rpi-5-blink/Sources/MainApp/MainApp.swift b/rpi-5-blink/Sources/Application/Application.swift similarity index 97% rename from rpi-5-blink/Sources/MainApp/MainApp.swift rename to rpi-5-blink/Sources/Application/Application.swift index 7bbae377..d0f98eb4 100644 --- a/rpi-5-blink/Sources/MainApp/MainApp.swift +++ b/rpi-5-blink/Sources/Application/Application.swift @@ -41,11 +41,9 @@ func ledOff() { } @main -struct Main { - +struct Application { static func main() { setLedOutput() - while true { ledOn() for _ in 1..<100000 {} // just a delay diff --git a/rpi-5-blink/Sources/Support/include/boot.h b/rpi-5-blink/Sources/Support/include/Support.h similarity index 100% rename from rpi-5-blink/Sources/Support/include/boot.h rename to rpi-5-blink/Sources/Support/include/Support.h diff --git a/rpi-5-blink/link.ld b/rpi-5-blink/Sources/Support/linkerscript.ld similarity index 61% rename from rpi-5-blink/link.ld rename to rpi-5-blink/Sources/Support/linkerscript.ld index dfbf0227..8f10b405 100644 --- a/rpi-5-blink/link.ld +++ b/rpi-5-blink/Sources/Support/linkerscript.ld @@ -1,6 +1,7 @@ SECTIONS { - . = 0x80000; /* Kernel load address for AArch64 */ + /* Kernel load address for AArch64 */ + . = 0x80000; .text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) } .rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) } PROVIDE(_data = .); @@ -14,6 +15,13 @@ SECTIONS } _end = .; - /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } + /DISCARD/ : { + *(.comment) + *(.gnu*) + *(.note*) + *(.eh_frame*) + *(.swift_modhash) + } } -__bss_size = (__bss_end - __bss_start)>>3; + +__bss_size = (__bss_end - __bss_start) >> 3;