Skip to content

Commit ab60da1

Browse files
authored
Merge branch 'main' into dev
2 parents c3a98ce + b716798 commit ab60da1

46 files changed

Lines changed: 1886 additions & 54 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
name: バグの報告
3+
about: Create a report to help us improve
4+
title: 'Bug report: '
5+
labels: bug
6+
assignees: tas0dev
7+
8+
---
9+
10+
## 概要
11+
報告するバグの内容を簡潔に書いてください。
12+
13+
## 動作
14+
そのバグはどのようにしたら発生したか、詳細に書いてください。
15+
16+
## 発生箇所
17+
そのバグが発生するソースコード(わかる場合でOKです!)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
name: 機能の提案
3+
about: Suggest an idea for this project
4+
title: 'Feature request: '
5+
labels: enhancement
6+
assignees: tas0dev
7+
8+
---
9+
10+
問題が何であるかについて、明確かつ簡潔に説明してください。 例 私はいつも...のときに苛立ちます。
11+
12+
## その解決策
13+
起こってほしいことの明確かつ簡潔な説明を書いてください。
14+
15+
## 代替案
16+
その機能について、代替できる方法はありますか?
17+
18+
## ノート
19+
ここに機能リクエストに関するその他のコンテキストやスクリーンショットを追加してください。

CONTRIBUTING.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# How to contributing to SwiftCore?
2+
SwiftCoreへの貢献方法は多岐にわたります。少しだけ例を挙げると、
3+
4+
1. バグ修正などを行い、パッチを送信する
5+
2. 新規機能の追加を提案する
6+
3. バグを報告する
7+
4. 改善案を報告する
8+
9+
などがあります。他にも貢献する方法はたくさん!
10+
11+
コードが書けない?大丈夫です!こんなふうにしたらいいんじゃない?と言うだけでコミュニティにとっては嬉しいです。
12+
13+
この文章には、SwiftCoreへ貢献する方法を書いています。
14+
15+
失敗を恐れないでください!私たちはいつでも挑戦を歓迎します。
16+
17+
### バグの報告の仕方
18+
[Issue](https://github.com/tas0dev/SwiftCore/issues)に行き、「New issue」ボタンを押します。
19+
「バグの報告」テンプレートを選択し、そのテンプレートに基づいてissueを書いてください。
20+
21+
### 新規機能の追加の提案の仕方
22+
[Issue](https://github.com/tas0dev/SwiftCore/issues)に行き、「New issue」ボタンを押します。
23+
「機能の提案」テンプレートを選択し、そのテンプレートに基づいてissueを書いてください。
24+
25+
### 実際にコードを書く
26+
実際にコードを書いて、コントリビュートしてくれるのは私たちにとってこの上ない喜びです。
27+
このプロジェクトでは、第三者が貢献する方法にPull request(PR)を使用しています。
28+
PRの送信方法は各自調べて欲しいですが、四つだけ守って欲しいルールがあります。
29+
30+
1. PRの送信するブランチはdevにすること
31+
2. PRの送信はそのパッチを作成した本人が行うこと
32+
3. レビューが遅くなってしまっても、それはあなたが送ってくれたことを忘れているわけではありません。メンションは最低限に控えてください。
33+
4. タイトルは「どの部分を変更したか(mem, shell, schedulerなど): 変更内容」のようにしてください。
34+
35+
これだけです。これを守っていれば、基本的に「ちゃんとしたPR」と認識します。逆に、これらを守っていないPRは無視されるか、クローズされます。
36+
37+
また、貢献する人は全員[Code of Conduct](./CODE_OF_CONDUCT.md)に従う必要があります。

build.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use builders::{
99
create_ext2_image, create_initfs_image, parse_service_index,
1010
};
1111

12+
#[allow(unused)]
1213
fn main() {
1314
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
1415

@@ -105,3 +106,92 @@ fn main() {
105106
println!(" ramfs/ -> {}", initfs_image_path.display());
106107
println!(" fs/ -> {}", ext2_image_path.display());
107108
}
109+
110+
fn find_service_bin(manifest_dir: &Path, name: &str) -> Option<PathBuf> {
111+
let profile = env::var("PROFILE").unwrap_or_else(|_| "debug".to_string());
112+
let profile_dir = if profile == "release" { "release" } else { "debug" };
113+
114+
if let Ok(target_dir) = env::var("CARGO_TARGET_DIR") {
115+
let target_dir = PathBuf::from(target_dir);
116+
let candidate = target_dir
117+
.join("x86_64-unknown-none")
118+
.join(profile_dir)
119+
.join(name);
120+
if candidate.is_file() {
121+
return Some(candidate);
122+
}
123+
}
124+
125+
let candidates = [
126+
manifest_dir
127+
.join("target/x86_64-unknown-none")
128+
.join(profile_dir)
129+
.join(name),
130+
manifest_dir
131+
.join("src/services")
132+
.join(name)
133+
.join("target/x86_64-unknown-none")
134+
.join(profile_dir)
135+
.join(name),
136+
];
137+
138+
candidates.into_iter().find(|p| p.is_file())
139+
}
140+
141+
fn build_service(manifest_dir: &Path, name: &str) -> Option<PathBuf> {
142+
if env::var("SWIFTCORE_SKIP_SHELL_BUILD").ok().as_deref() == Some("1") {
143+
return None;
144+
}
145+
146+
let svc_dir = manifest_dir.join("src/services").join(name);
147+
if !svc_dir.is_dir() {
148+
return None;
149+
}
150+
151+
let profile = env::var("PROFILE").unwrap_or_else(|_| "debug".to_string());
152+
let mut cmd = Command::new("cargo");
153+
cmd.current_dir(&svc_dir)
154+
.env("SWIFTCORE_SKIP_SHELL_BUILD", "1")
155+
.args(["build", "--target", "x86_64-unknown-none"]);
156+
157+
if profile == "release" {
158+
cmd.arg("--release");
159+
}
160+
161+
let status = cmd
162+
.status();
163+
164+
match status {
165+
Ok(s) if s.success() => find_service_bin(manifest_dir, name),
166+
Ok(_) => None,
167+
Err(_) => None,
168+
}
169+
}
170+
171+
fn copy_service(manifest_dir: &Path, name: &str, stage_dir: &Path) {
172+
let env_key = match name {
173+
"shell" => "SWIFTCORE_SHELL_BIN",
174+
"keyboard" => "SWIFTCORE_KEYBOARD_BIN",
175+
_ => "SWIFTCORE_SERVICE_BIN",
176+
};
177+
178+
let env_bin = env::var(env_key).ok().and_then(|p| {
179+
let path = PathBuf::from(p);
180+
if path.is_file() { Some(path) } else { None }
181+
});
182+
183+
let bin = env_bin
184+
.or_else(|| find_service_bin(manifest_dir, name))
185+
.or_else(|| build_service(manifest_dir, name));
186+
187+
if let Some(bin) = bin {
188+
let dest = stage_dir.join(format!("{}.service", name));
189+
let _ = fs::copy(&bin, &dest);
190+
} else {
191+
println!(
192+
"cargo:warning=initfs: {} binary not found; set {} or build service crate",
193+
name, env_key
194+
);
195+
}
196+
}
197+
*/

scripts/build-user-elf.sh

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
ROOT_DIR=$(cd "$(dirname "$0")/.." && pwd)
5+
INITFS_DIR="$ROOT_DIR/src/initfs"
6+
ASM="$INITFS_DIR/hello.asm"
7+
OUT="$INITFS_DIR/hello"
8+
9+
# Use nasm + ld by default
10+
NASM=${1:-nasm}
11+
LD=${2:-ld}
12+
13+
if ! command -v "$NASM" >/dev/null 2>&1; then
14+
echo "Error: nasm not found. Install nasm or pass assembler as first arg."
15+
exit 1
16+
fi
17+
if ! command -v "$LD" >/dev/null 2>&1; then
18+
echo "Error: ld not found. Install binutils or pass linker as second arg."
19+
exit 1
20+
fi
21+
22+
echo "Assembling with: $NASM; linking with: $LD"
23+
24+
TMPOBJ="$OUT.o"
25+
$NASM -f elf64 -o "$TMPOBJ" "$ASM"
26+
$LD -static -o "$OUT" "$TMPOBJ"
27+
rm -f "$TMPOBJ"
28+
29+
echo "Built: $OUT"

scripts/make-uefi-boot.sh

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
CFG=${1:-debug}
5+
ROOT_DIR=$(pwd)
6+
TARGET_DIR="$ROOT_DIR/target/x86_64-unknown-uefi/$CFG/boot"
7+
8+
echo "Assembling UEFI boot directory: $TARGET_DIR"
9+
10+
mkdir -p "$TARGET_DIR/EFI/BOOT"
11+
mkdir -p "$TARGET_DIR/services"
12+
13+
if [ -d "$ROOT_DIR/src/initfs" ]; then
14+
echo "Copying initfs files..."
15+
cp -r "$ROOT_DIR/src/initfs/." "$TARGET_DIR/"
16+
fi
17+
18+
EFI_CANDIDATES=(
19+
"$ROOT_DIR/target/x86_64-unknown-uefi/$CFG/boot/BOOTX64.EFI"
20+
"$ROOT_DIR/target/x86_64-unknown-uefi/$CFG/boot/boot.efi"
21+
"$ROOT_DIR/target/x86_64-unknown-uefi/$CFG/boot/boot"
22+
)
23+
24+
FOUND_EFI=""
25+
for p in "${EFI_CANDIDATES[@]}"; do
26+
if [ -f "$p" ]; then
27+
FOUND_EFI="$p"
28+
break
29+
fi
30+
done
31+
32+
if [ -z "$FOUND_EFI" ]; then
33+
echo "Searching for EFI binary in target directory..."
34+
FOUND_EFI=$(find "$ROOT_DIR/target" -type f \( -iname "*.efi" -o -iname "boot" -o -iname "bootx64*" \) | head -n1 || true)
35+
fi
36+
37+
if [ -n "$FOUND_EFI" ]; then
38+
echo "Found EFI binary: $FOUND_EFI"
39+
cp "$FOUND_EFI" "$TARGET_DIR/EFI/BOOT/BOOTX64.EFI"
40+
else
41+
echo "Warning: No EFI binary found in target. Build the project first." >&2
42+
fi
43+
44+
if [ -d "$ROOT_DIR/src/services" ]; then
45+
for svc in "$ROOT_DIR/src/services"/*; do
46+
if [ -d "$svc" ]; then
47+
name=$(basename "$svc")
48+
# Create a placeholder descriptor if none exists
49+
echo "name=$name" > "$TARGET_DIR/services/$name.service"
50+
fi
51+
done
52+
fi
53+
54+
echo "Boot directory assembled at: $TARGET_DIR"

scripts/qemu-runner.sh

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,24 @@ if [ -z "$OVMF" ]; then
2525
exit 1
2626
fi
2727

28-
EFI_FILE="$1"
28+
SRC="$1"
2929

30-
if [ ! -f "$EFI_FILE" ]; then
31-
echo "Error: EFI file not found: $EFI_FILE"
30+
if [ -z "$SRC" ]; then
31+
echo "Usage: $0 <EFI_FILE|BOOT_DIR>"
3232
exit 1
3333
fi
3434

3535
TEMP_DIR=$(mktemp -d)
3636
# shellcheck disable=SC2064
3737
trap "rm -rf $TEMP_DIR" EXIT
3838

39-
mkdir -p "$TEMP_DIR/esp/EFI/BOOT"
39+
TEMP_DIR=$(mktemp -d)
40+
trap "rm -rf $TEMP_DIR" EXIT
4041

41-
cp "$EFI_FILE" "$TEMP_DIR/esp/EFI/BOOT/BOOTX64.EFI"
42+
mkdir -p "$TEMP_DIR/esp/EFI/BOOT"
43+
cp "$SRC" "$TEMP_DIR/esp/EFI/BOOT/BOOTX64.EFI"
44+
DRIVE_ARG="fat:rw:$TEMP_DIR/esp"
45+
fi
4246

4347
exec qemu-system-x86_64 \
4448
-bios "$OVMF" \

src/core/driver/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub mod ps2_keyboard;

0 commit comments

Comments
 (0)