191 lines
6.3 KiB
Python
191 lines
6.3 KiB
Python
|
|
import sys
|
||
|
|
import os
|
||
|
|
QEMU_PATH_VAR = "qemu_exec"
|
||
|
|
QEMU_PATH_ENV_VAR = ""
|
||
|
|
QEMU_SMP_VAR = "qemu_smp"
|
||
|
|
QEMU_SMP_ENV_VAR = "XOS_QEMU_SMP"
|
||
|
|
QEMU_STD_PATH = ""
|
||
|
|
qemu_run_cmd = ""
|
||
|
|
arch = sys.argv[1]
|
||
|
|
target_board = sys.argv[2]
|
||
|
|
base = sys.argv[3]
|
||
|
|
out = sys.argv[4]
|
||
|
|
|
||
|
|
if arch == "x86":
|
||
|
|
QEMU_PATH_ENV_VAR = "XOS_QEMU_X86"
|
||
|
|
QEMU_STD_PATH = "qemu-system-i386"
|
||
|
|
qemu_run_cmd = "${2} -m 256M --drive file={1}/os-image.bin,format=raw,index=0,if=floppy -device piix3-ide,id=ide -drive id=disk,format=raw,file={1}/one.img,if=none -device ide-hd,drive=disk,bus=ide.0 -serial mon:stdio -rtc base=utc -vga std -qmp unix:./qmp-sock,server,nowait".format(
|
||
|
|
base, out, QEMU_PATH_VAR)
|
||
|
|
if arch == "x86_64":
|
||
|
|
QEMU_PATH_ENV_VAR = "XOS_QEMU_X86_64"
|
||
|
|
QEMU_STD_PATH = "qemu-system-x86_64"
|
||
|
|
qemu_run_cmd = "${2} -m 1G -kernel {1}/rawImage.elf -cpu phenom -device piix3-ide,id=ide -drive id=disk,format=raw,file={1}/one.img,if=none -device ide-hd,drive=disk,bus=ide.0 -serial mon:stdio -rtc base=utc -vga std".format(
|
||
|
|
base, out, QEMU_PATH_VAR)
|
||
|
|
if arch == "arm32":
|
||
|
|
QEMU_PATH_ENV_VAR = "XOS_QEMU_ARM"
|
||
|
|
QEMU_STD_PATH = "qemu-system-arm"
|
||
|
|
qemu_run_cmd = "${2} -m 256M -M vexpress-a15 -cpu cortex-a15 -kernel {1}/bootarm.bin -smp ${3} -serial mon:stdio -vga std -drive id=disk,if=sd,format=raw,file={1}/one.img".format(
|
||
|
|
base, out, QEMU_PATH_VAR, QEMU_SMP_VAR)
|
||
|
|
if arch == "arm64":
|
||
|
|
QEMU_PATH_ENV_VAR = "XOS_QEMU_AA64"
|
||
|
|
QEMU_STD_PATH = "echo Please provide path to custom QEMU with $XOS_QEMU_AA64, see https://code.ayaantunio.me/ayaan/Custom-Operating-System/src/branch/master/docs/getting_qemu.md"
|
||
|
|
qemu_run_cmd = "${2} -machine virt,secure=off,virtualization=off,gic-version=2 -cpu cortex-a53 -m 1G -kernel {1}/rawImage.bin -smp ${3} -serial mon:stdio -drive id=disk,if=sd,format=raw,file={1}/one.img".format(
|
||
|
|
base, out, QEMU_PATH_VAR, QEMU_SMP_VAR)
|
||
|
|
if target_board == "apl":
|
||
|
|
qemu_run_cmd = "python3 {0}/utils/codeassistant/pongo_startup.py".format(base)
|
||
|
|
if arch == "riscv64":
|
||
|
|
QEMU_PATH_ENV_VAR = "XOS_QEMU_RV64"
|
||
|
|
QEMU_STD_PATH = "qemu-system-riscv64"
|
||
|
|
qemu_run_cmd = "${2} -machine virt -m 1G -bios none -kernel {1}/prekernelriscv64.bin -serial mon:stdio -drive if=none,format=raw,file={1}/one.img,id=drv -device virtio-blk-device,drive=drv -device virtio-rng-device -device virtio-gpu-device -device virtio-keyboard-device -device virtio-mouse-device".format(
|
||
|
|
base, out, QEMU_PATH_VAR, QEMU_SMP_VAR)
|
||
|
|
|
||
|
|
if base[-1] == '/':
|
||
|
|
base = base[:-1]
|
||
|
|
|
||
|
|
if out[-1] == '/':
|
||
|
|
out = out[:-1]
|
||
|
|
|
||
|
|
env_var_checker = """
|
||
|
|
{2}="{3}"
|
||
|
|
{4}=1
|
||
|
|
[[ -z "${1}" ]] && {2}='{3}' || {2}="${1}"
|
||
|
|
[[ -z "${5}" ]] && {4}=1 || {4}="${5}"
|
||
|
|
""".format("", QEMU_PATH_ENV_VAR, QEMU_PATH_VAR, QEMU_STD_PATH, QEMU_SMP_VAR, QEMU_SMP_ENV_VAR)
|
||
|
|
|
||
|
|
sync = open("{0}/sync.sh".format(out), "w")
|
||
|
|
sync.write(
|
||
|
|
"""#!/bin/bash
|
||
|
|
GREEN='\\033[0;32m'
|
||
|
|
RED='\\033[0;31m'
|
||
|
|
NC='\\033[0m'
|
||
|
|
ERROR="${{RED}}[ERROR]${{NC}}"
|
||
|
|
SUCCESS="${{GREEN}}[SUCCESS]${{NC}}"
|
||
|
|
|
||
|
|
mkdir -p {1}/mountpoint
|
||
|
|
sudo fuse-ext2 {1}/one.img {1}/mountpoint -o rw+
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${{ERROR}} Can't mount one.img to {1}/mountpoint" && exit 1; fi
|
||
|
|
sudo mkdir -p {1}/mountpoint/boot
|
||
|
|
sudo mkdir -p {1}/mountpoint/proc
|
||
|
|
sudo mkdir -p {1}/mountpoint/var
|
||
|
|
sudo mkdir -p {1}/mountpoint/dev
|
||
|
|
sudo mkdir -p {1}/mountpoint/tmp
|
||
|
|
sudo cp -r {0}/base/* {1}/mountpoint/
|
||
|
|
sudo cp -r {1}/base/* {1}/mountpoint/
|
||
|
|
|
||
|
|
sudo chmod -R 644 {1}/mountpoint/proc
|
||
|
|
sudo chmod -R 644 {1}/mountpoint/dev
|
||
|
|
sudo chmod -R 666 {1}/mountpoint/tmp
|
||
|
|
sudo chmod -R 666 {1}/mountpoint/var
|
||
|
|
sudo chmod -R 755 {1}/mountpoint/bin
|
||
|
|
sudo chmod -R 700 {1}/mountpoint/home
|
||
|
|
sudo chmod 777 {1}/mountpoint/home
|
||
|
|
sudo chmod -R 755 {1}/mountpoint/System
|
||
|
|
sudo chmod -R 755 {1}/mountpoint/Applications
|
||
|
|
|
||
|
|
sudo chown -R 0 {1}/mountpoint/home/root
|
||
|
|
sudo chown -R 0 {1}/mountpoint/bin/sudo
|
||
|
|
sudo chmod 4755 {1}/mountpoint/bin/sudo
|
||
|
|
|
||
|
|
sudo chown -R 10 {1}/mountpoint/home/user
|
||
|
|
|
||
|
|
sudo umount {1}/mountpoint
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${{ERROR}} Can't umount {1}/mountpoint" && exit 1; fi
|
||
|
|
echo -e "${{SUCCESS}} Sync"
|
||
|
|
""".format(base, out))
|
||
|
|
sync.close()
|
||
|
|
|
||
|
|
|
||
|
|
build = open("{0}/build.sh".format(out), "w")
|
||
|
|
build.write(
|
||
|
|
"""#!/bin/bash
|
||
|
|
GREEN='\\033[0;32m'
|
||
|
|
RED='\\033[0;31m'
|
||
|
|
NC='\\033[0m'
|
||
|
|
ERROR="${{RED}}[ERROR]${{NC}}"
|
||
|
|
SUCCESS="${{GREEN}}[SUCCESS]${{NC}}"
|
||
|
|
|
||
|
|
ninja
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${{ERROR}} Can't build for arch: {0}" && exit 1; fi
|
||
|
|
echo -e "${{SUCCESS}} Build for arch: {0}"
|
||
|
|
""".format(arch))
|
||
|
|
build.close()
|
||
|
|
|
||
|
|
run = open("{0}/run.sh".format(out), "w")
|
||
|
|
run.write(
|
||
|
|
"""#!/bin/bash
|
||
|
|
{1}
|
||
|
|
{0}
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${{ERROR}} Run command failed" && exit 1; fi""".format(qemu_run_cmd, env_var_checker)
|
||
|
|
)
|
||
|
|
run.close()
|
||
|
|
|
||
|
|
debug = open("{0}/debug.sh".format(out), "w")
|
||
|
|
debug.write(
|
||
|
|
"""#!/bin/bash
|
||
|
|
{1}
|
||
|
|
{0} -s -S
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${{ERROR}} Debug Run command failed" && exit 1; fi""".format(qemu_run_cmd, env_var_checker)
|
||
|
|
)
|
||
|
|
debug.close()
|
||
|
|
|
||
|
|
allf = open("{0}/all.sh".format(out), "w")
|
||
|
|
allf.write(
|
||
|
|
"""#!/bin/bash
|
||
|
|
GREEN='\\033[0;32m'
|
||
|
|
RED='\\033[0;31m'
|
||
|
|
NC='\\033[0m'
|
||
|
|
ERROR="${RED}[ERROR]${NC}"
|
||
|
|
SUCCESS="${GREEN}[SUCCESS]${NC}"
|
||
|
|
|
||
|
|
./build.sh
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${ERROR} All command failed" && exit 1; fi
|
||
|
|
./sync.sh
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${ERROR} All command failed" && exit 1; fi
|
||
|
|
./run.sh
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${ERROR} All command failed" && exit 1; fi
|
||
|
|
""")
|
||
|
|
allf.close()
|
||
|
|
|
||
|
|
allf = open("{0}/run_tester.sh".format(out), "w")
|
||
|
|
allf.write(
|
||
|
|
"""#!/bin/bash
|
||
|
|
GREEN='\\033[0;32m'
|
||
|
|
RED='\\033[0;31m'
|
||
|
|
NC='\\033[0m'
|
||
|
|
ERROR="${{RED}}[ERROR]${{NC}}"
|
||
|
|
SUCCESS="${{GREEN}}[SUCCESS]${{NC}}"
|
||
|
|
|
||
|
|
./build.sh
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${{ERROR}} All command failed" && exit 1; fi
|
||
|
|
./sync.sh
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${{ERROR}} All command failed" && exit 1; fi
|
||
|
|
{1}
|
||
|
|
{0} --nographic
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${{ERROR}} All command failed" && exit 1; fi
|
||
|
|
""".format(qemu_run_cmd, env_var_checker))
|
||
|
|
allf.close()
|
||
|
|
|
||
|
|
allf = open("{0}/dll.sh".format(out), "w")
|
||
|
|
allf.write(
|
||
|
|
"""#!/bin/bash
|
||
|
|
GREEN='\\033[0;32m'
|
||
|
|
RED='\\033[0;31m'
|
||
|
|
NC='\\033[0m'
|
||
|
|
ERROR="${RED}[ERROR]${NC}"
|
||
|
|
SUCCESS="${GREEN}[SUCCESS]${NC}"
|
||
|
|
|
||
|
|
./build.sh
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${ERROR} Debug All command failed" && exit 1; fi
|
||
|
|
./sync.sh
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${ERROR} Debug All command failed" && exit 1; fi
|
||
|
|
./debug.sh
|
||
|
|
if [ $? -ne 0 ]; then echo -e "${ERROR} Debug All command failed" && exit 1; fi
|
||
|
|
""")
|
||
|
|
allf.close()
|
||
|
|
|
||
|
|
gdbinit = open("{0}/.gdbinit".format(out), "w")
|
||
|
|
gdbinit.write(
|
||
|
|
"""file {0}/base/boot/kernel.bin
|
||
|
|
target remote :1234""".format(out))
|
||
|
|
gdbinit.close()
|