Compare commits

...

4 Commits

Author SHA1 Message Date
Bananymous 1e2c2fb973 Shell: Set get old termios earlier
I sourced the config file before getting old termios. Sourcing
updated the termios so old_termios was always in non canonical, non
echoing mode.
2023-10-24 19:10:53 +03:00
Bananymous 988a4e1cd8 BAN: Fix bug of size of splice after slice()
I have no idea what was I doing before :D
2023-10-24 17:23:45 +03:00
Bananymous adbbdf73c4 meminfo: fix g++ warning for oob write
g++ doesn't realize that read can only return -1
2023-10-24 16:50:21 +03:00
Bananymous e8d20bc653 BuildSystem: Fix bugs in new build system
I had not tested the new build system with clean toolchain build
but it seems to work now.
2023-10-24 16:48:46 +03:00
16 changed files with 111 additions and 95 deletions

4
.gitignore vendored
View File

@ -2,8 +2,4 @@
.idea/ .idea/
build/ build/
base/ base/
*.tar.*
toolchain/*/
!toolchain/local/
!base-sysroot.tar.gz

View File

@ -127,8 +127,8 @@ namespace BAN
ASSERT(start <= m_size); ASSERT(start <= m_size);
if (length == ~size_type(0)) if (length == ~size_type(0))
length = m_size - start; length = m_size - start;
ASSERT(start + length <= m_size); ASSERT(m_size - start >= length);
return Span(m_data + start, m_size - start - length); return Span(m_data + start, length);
} }
} }

View File

@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
set -e
BOCHS_CONFIG_FILE=bochsrc BOCHS_CONFIG_FILE=bochsrc
COM1_TERMINAL=kitty COM1_TERMINAL=kitty

View File

@ -1,24 +1,20 @@
#!/bin/bash #!/bin/bash
set -e set -e
if [[ -z $BANAN_ARCH ]]; then
export BANAN_ARCH=x86_64
fi
export BANAN_SCRIPT_DIR=$(dirname $(realpath $0)) export BANAN_SCRIPT_DIR=$(dirname $(realpath $0))
source $BANAN_SCRIPT_DIR/config.sh source $BANAN_SCRIPT_DIR/config.sh
make_build_dir () { make_build_dir () {
if ! [[ -d $BANAN_BUILD_DIR ]]; then mkdir -p $BANAN_BUILD_DIR
mkdir -p $BANAN_BUILD_DIR cd $BANAN_BUILD_DIR
cd $BANAN_BUILD_DIR if ! [[ -f "build.ninja" ]]; then
cmake --toolchain=$BANAN_TOOLCHAIN_DIR/Toolchain.txt -G Ninja $BANAN_ROOT_DIR $BANAN_CMAKE_ARGS cmake --toolchain=$BANAN_TOOLCHAIN_DIR/Toolchain.txt -G Ninja $BANAN_ROOT_DIR
fi fi
} }
build_target () { build_target () {
make_build_dir make_build_dir
if [[ -z $1 ]]; then if [[ $# -eq 0 ]]; then
echo "No target provided" echo "No target provided"
exit 1 exit 1
fi fi
@ -27,6 +23,15 @@ build_target () {
} }
build_toolchain () { build_toolchain () {
if [[ -f $BANAN_TOOLCHAIN_PREFIX/bin/$BANAN_TOOLCHAIN_TRIPLE_PREFIX-gcc ]]; then
echo "You already seem to have a toolchain."
read -e -p "Do you want to rebuild it [y/N]? " choice
if ! [[ "$choice" == [Yy]* ]]; then
echo "Aborting toolchain rebuild"
exit 0
fi
fi
$BANAN_TOOLCHAIN_DIR/build.sh $BANAN_TOOLCHAIN_DIR/build.sh
build_target libc-install build_target libc-install
$BANAN_TOOLCHAIN_DIR/build.sh libstdc++ $BANAN_TOOLCHAIN_DIR/build.sh libstdc++
@ -51,57 +56,42 @@ run_bochs () {
$BANAN_SCRIPT_DIR/bochs.sh $@ $BANAN_SCRIPT_DIR/bochs.sh $@
} }
if [[ "$1" == "toolchain" ]]; then
if [[ -f $BANAN_TOOLCHAIN_PREFIX/bin/$BANAN_TOOLCHAIN_TRIPLE_PREFIX-gcc ]]; then
echo "You already seem to have build toolchain."
read -e -p "Do you want to rebuild it [y/N]? " choice
if ! [[ "$choice" == [Yy]* ]]; then
echo "Aborting toolchain rebuild"
exit 0
fi
fi
build_toolchain
exit 0
fi
if [[ "$1" == "image" ]]; then
create_image
exit 0
fi
if [[ "$1" == "image-full" ]]; then
create_image full
exit 0
fi
if [[ "$(uname)" == "Linux" ]]; then if [[ "$(uname)" == "Linux" ]]; then
QEMU_ACCEL="-accel kvm" QEMU_ACCEL="-accel kvm"
fi fi
if [[ "$1" == "qemu" ]]; then if [[ $# -eq 0 ]]; then
run_qemu -serial stdio $QEMU_ACCEL echo "No argument given"
exit 0 exit 1
fi fi
if [[ "$1" == "qemu-nographic" ]]; then case $1 in
run_qemu -nographic $QEMU_ACCEL toolchain)
exit 0 build_toolchain
fi ;;
image)
create_image
;;
image-full)
create_image full
;;
qemu)
run_qemu -serial stdio $QEMU_ACCEL
;;
qemu-nographic)
run_qemu -nographic $QEMU_ACCEL
;;
qemu-debug)
run_qemu -serial stdio -d int -no-reboot
;;
bochs)
run_bochs
;;
check-fs)
$BANAN_SCRIPT_DIR/check-fs.sh
;;
*)
build_target $1
;;
esac
if [[ "$1" == "qemu-debug" ]]; then
run_qemu -serial stdio -d int -no-reboot
exit 0
fi
if [[ "$1" == "bochs" ]]; then
run_bochs
exit 0
fi
if [[ "$1" == "check-fs" ]]; then
$BANAN_SCRIPT_DIR/check-fs.sh
exit 0
fi
build_target $1

View File

@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
set -e
if [[ -z $BANAN_DISK_IMAGE_PATH ]]; then if [[ -z $BANAN_DISK_IMAGE_PATH ]]; then
echo "You must set BANAN_DISK_IMAGE_PATH environment variable" >&2 echo "You must set BANAN_DISK_IMAGE_PATH environment variable" >&2

View File

@ -1,5 +1,5 @@
if [[ -z $BANAN_ROOT_DIR ]]; then if [[ -z $BANAN_ROOT_DIR ]]; then
if [[ -z $BANAN_SCRIPT_DIR ]]; then if ! [[ -z $BANAN_SCRIPT_DIR ]]; then
export BANAN_ROOT_DIR=$BANAN_SCRIPT_DIR/.. export BANAN_ROOT_DIR=$BANAN_SCRIPT_DIR/..
else else
echo "You must set the BANAN_ROOT_DIR environment variable" >&2 echo "You must set the BANAN_ROOT_DIR environment variable" >&2
@ -8,8 +8,7 @@ if [[ -z $BANAN_ROOT_DIR ]]; then
fi fi
if [[ -z $BANAN_ARCH ]]; then if [[ -z $BANAN_ARCH ]]; then
echo "You must set the BANAN_ARCH environment variable" >&2 export BANAN_ARCH=x86_64
exit 1
fi fi
export BANAN_TOOLCHAIN_DIR=$BANAN_ROOT_DIR/toolchain export BANAN_TOOLCHAIN_DIR=$BANAN_ROOT_DIR/toolchain

View File

@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
set -e
if [[ -z $BANAN_DISK_IMAGE_PATH ]]; then if [[ -z $BANAN_DISK_IMAGE_PATH ]]; then
echo "You must set the BANAN_DISK_IMAGE_PATH environment variable" >&2 echo "You must set the BANAN_DISK_IMAGE_PATH environment variable" >&2
@ -79,18 +78,18 @@ if [[ "$BANAN_UEFI_BOOT" == "1" ]]; then
sudo mkfs.fat $PARTITION1 > /dev/null sudo mkfs.fat $PARTITION1 > /dev/null
sudo mount $PARTITION1 "$MOUNT_DIR" sudo mount $PARTITION1 "$MOUNT_DIR"
sudo mkdir -p "$MOUNT_DIR/EFI/BOOT" sudo mkdir -p "$MOUNT_DIR/EFI/BOOT"
sudo "$BANAN_TOOLCHAIN_PREFIX/bin/grub-mkstandalone" -O "$BANAN_ARCH-efi" -o "$MOUNT_DIR/EFI/BOOT/BOOTX64.EFI" "boot/grub/grub.cfg=$BANAN_TOOLCHAIN_PREFIX/grub-memdisk.cfg" sudo "$BANAN_TOOLCHAIN_PREFIX/bin/grub-mkstandalone" -O "$BANAN_ARCH-efi" -o "$MOUNT_DIR/EFI/BOOT/BOOTX64.EFI" "boot/grub/grub.cfg=$BANAN_TOOLCHAIN_DIR/grub-memdisk.cfg"
sudo umount "$MOUNT_DIR" sudo umount "$MOUNT_DIR"
sudo mount $PARTITION2 "$MOUNT_DIR" sudo mount $PARTITION2 "$MOUNT_DIR"
sudo mkdir -p "$MOUNT_DIR/boot/grub" sudo mkdir -p "$MOUNT_DIR/boot/grub"
sudo cp "$BANAN_TOOLCHAIN_PREFIX/grub-uefi.cfg" "$MOUNT_DIR/boot/grub/grub.cfg" sudo cp "$BANAN_TOOLCHAIN_DIR/grub-uefi.cfg" "$MOUNT_DIR/boot/grub/grub.cfg"
sudo umount "$MOUNT_DIR" sudo umount "$MOUNT_DIR"
else else
sudo mount $PARTITION2 "$MOUNT_DIR" sudo mount $PARTITION2 "$MOUNT_DIR"
sudo grub-install --no-floppy --target=i386-pc --modules="normal ext2 multiboot" --boot-directory="$MOUNT_DIR/boot" $LOOP_DEV sudo grub-install --no-floppy --target=i386-pc --modules="normal ext2 multiboot" --boot-directory="$MOUNT_DIR/boot" $LOOP_DEV
sudo mkdir -p "$MOUNT_DIR/boot/grub" sudo mkdir -p "$MOUNT_DIR/boot/grub"
sudo cp "$BANAN_TOOLCHAIN_PREFIX/grub-legacy-boot.cfg" "$MOUNT_DIR/boot/grub/grub.cfg" sudo cp "$BANAN_TOOLCHAIN_DIR/grub-legacy-boot.cfg" "$MOUNT_DIR/boot/grub/grub.cfg"
sudo umount "$MOUNT_DIR" sudo umount "$MOUNT_DIR"
fi fi

View File

@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
set -e
if [[ -z $BANAN_DISK_IMAGE_PATH ]]; then if [[ -z $BANAN_DISK_IMAGE_PATH ]]; then
echo "You must set the BANAN_DISK_IMAGE_PATH environment variable" >&2 echo "You must set the BANAN_DISK_IMAGE_PATH environment variable" >&2

1
toolchain/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*/

View File

@ -10,6 +10,16 @@ if [[ -z $BANAN_SYSROOT ]]; then
exit 1 exit 1
fi fi
if [[ -z $BANAN_ROOT_DIR ]]; then
echo "You must set the BANAN_ROOT_DIR environment variable" >&2
exit 1
fi
if [[ -z $BANAN_BUILD_DIR ]]; then
echo "You must set the BANAN_BUILD_DIR environment variable" >&2
exit 1
fi
if [[ -z $BANAN_TOOLCHAIN_DIR ]]; then if [[ -z $BANAN_TOOLCHAIN_DIR ]]; then
echo "You must set the BANAN_TOOLCHAIN_DIR environment variable" >&2 echo "You must set the BANAN_TOOLCHAIN_DIR environment variable" >&2
exit 1 exit 1
@ -30,10 +40,16 @@ if [[ -z $BANAN_ARCH ]]; then
exit 1 exit 1
fi fi
enter_clean_build () {
rm -rf build
mkdir build
cd build
}
build_binutils () { build_binutils () {
echo "Building ${BINUTILS_VERSION}" echo "Building ${BINUTILS_VERSION}"
cd $BANAN_TOOLCHAIN_DIR cd $BANAN_BUILD_DIR/toolchain
if [ ! -f ${BINUTILS_VERSION}.tar.xz ]; then if [ ! -f ${BINUTILS_VERSION}.tar.xz ]; then
wget https://ftp.gnu.org/gnu/binutils/${BINUTILS_VERSION}.tar.xz wget https://ftp.gnu.org/gnu/binutils/${BINUTILS_VERSION}.tar.xz
@ -41,13 +57,13 @@ build_binutils () {
if [ ! -d $BINUTILS_VERSION ]; then if [ ! -d $BINUTILS_VERSION ]; then
tar xvf ${BINUTILS_VERSION}.tar.xz tar xvf ${BINUTILS_VERSION}.tar.xz
patch -s -p0 < ${BINUTILS_VERSION}.patch patch -s -p0 < $BANAN_TOOLCHAIN_DIR/${BINUTILS_VERSION}.patch
fi fi
mkdir -p build/${BINUTILS_VERSION}/ cd $BINUTILS_VERSION
cd build/${BINUTILS_VERSION}/ enter_clean_build
../../${BINUTILS_VERSION}/configure \ ../configure \
--target="$BANAN_TOOLCHAIN_TRIPLE_PREFIX" \ --target="$BANAN_TOOLCHAIN_TRIPLE_PREFIX" \
--prefix="$BANAN_TOOLCHAIN_PREFIX" \ --prefix="$BANAN_TOOLCHAIN_PREFIX" \
--with-sysroot="$BANAN_SYSROOT" \ --with-sysroot="$BANAN_SYSROOT" \
@ -61,7 +77,7 @@ build_binutils () {
build_gcc () { build_gcc () {
echo "Building ${GCC_VERSION}" echo "Building ${GCC_VERSION}"
cd $BANAN_TOOLCHAIN_DIR cd $BANAN_BUILD_DIR/toolchain
if [ ! -f ${GCC_VERSION}.tar.xz ]; then if [ ! -f ${GCC_VERSION}.tar.xz ]; then
wget https://ftp.gnu.org/gnu/gcc/${GCC_VERSION}/${GCC_VERSION}.tar.xz wget https://ftp.gnu.org/gnu/gcc/${GCC_VERSION}/${GCC_VERSION}.tar.xz
@ -69,13 +85,13 @@ build_gcc () {
if [ ! -d $GCC_VERSION ]; then if [ ! -d $GCC_VERSION ]; then
tar xvf ${GCC_VERSION}.tar.xz tar xvf ${GCC_VERSION}.tar.xz
patch -s -p0 < ${GCC_VERSION}.patch patch -s -p0 < $BANAN_TOOLCHAIN_DIR/${GCC_VERSION}.patch
fi fi
mkdir -p build/${GCC_VERSION}/ cd ${GCC_VERSION}
cd build/${GCC_VERSION}/ enter_clean_build
../../${GCC_VERSION}/configure \ ../configure \
--target="$BANAN_TOOLCHAIN_TRIPLE_PREFIX" \ --target="$BANAN_TOOLCHAIN_TRIPLE_PREFIX" \
--prefix="$BANAN_TOOLCHAIN_PREFIX" \ --prefix="$BANAN_TOOLCHAIN_PREFIX" \
--with-sysroot="$BANAN_SYSROOT" \ --with-sysroot="$BANAN_SYSROOT" \
@ -90,7 +106,7 @@ build_gcc () {
build_grub () { build_grub () {
echo "Building ${GRUB_VERSION}" echo "Building ${GRUB_VERSION}"
cd $BANAN_TOOLCHAIN_DIR cd $BANAN_BUILD_DIR/toolchain
if [ ! -f ${GRUB_VERSION}.tar.xz ]; then if [ ! -f ${GRUB_VERSION}.tar.xz ]; then
wget https://ftp.gnu.org/gnu/grub/${GRUB_VERSION}.tar.xz wget https://ftp.gnu.org/gnu/grub/${GRUB_VERSION}.tar.xz
@ -100,10 +116,10 @@ build_grub () {
tar xvf ${GRUB_VERSION}.tar.xz tar xvf ${GRUB_VERSION}.tar.xz
fi fi
mkdir -p build/${GRUB_VERSION}/ cd $GRUB_VERSION
cd build/${GRUB_VERSION}/ enter_clean_build
../../${GRUB_VERSION}/configure \ ../configure \
--target="$BANAN_ARCH" \ --target="$BANAN_ARCH" \
--prefix="$BANAN_TOOLCHAIN_PREFIX" \ --prefix="$BANAN_TOOLCHAIN_PREFIX" \
--with-platform="efi" \ --with-platform="efi" \
@ -114,16 +130,35 @@ build_grub () {
} }
build_libstdcpp () { build_libstdcpp () {
cd build/${GCC_VERSION}/ if ! [[ -d $BANAN_BUILD_DIR/toolchain/$GCC_VERSION/build ]]; then
echo "You have to build gcc first"
exit 1
fi
cd $BANAN_BUILD_DIR/toolchain/$GCC_VERSION/build
make -j $(nproc) all-target-libstdc++-v3 make -j $(nproc) all-target-libstdc++-v3
make install-target-libstdc++-v3 make install-target-libstdc++-v3
} }
if [[ "$1" == "libstdc++" ]]; then if [[ $# -ge 1 ]]; then
build_libstdcpp if [[ "$1" == "libstdc++" ]]; then
exit 0 build_libstdcpp
exit 0
fi
echo "unrecognized arguments $@"
exit 1
fi fi
# NOTE: we have to manually create initial sysroot with libc headers
# since cmake cannot be invoked yet
echo "Syncing sysroot headers"
mkdir -p $BANAN_SYSROOT
sudo mkdir -p $BANAN_SYSROOT/usr/include
sudo rsync -a $BANAN_ROOT_DIR/libc/include/ $BANAN_SYSROOT/usr/include/
mkdir -p $BANAN_BUILD_DIR/toolchain
build_binutils build_binutils
build_gcc build_gcc
build_grub build_grub

View File

@ -1 +0,0 @@
*/

View File

@ -833,6 +833,8 @@ int main(int argc, char** argv)
if (signal(SIGINT, [](int) {}) == SIG_ERR) if (signal(SIGINT, [](int) {}) == SIG_ERR)
perror("signal"); perror("signal");
tcgetattr(0, &old_termios);
{ {
FILE* fp = fopen("/etc/hostname", "r"); FILE* fp = fopen("/etc/hostname", "r");
if (fp != NULL) if (fp != NULL)
@ -876,8 +878,6 @@ int main(int argc, char** argv)
source_shellrc(); source_shellrc();
tcgetattr(0, &old_termios);
new_termios = old_termios; new_termios = old_termios;
new_termios.c_lflag &= ~(ECHO | ICANON); new_termios.c_lflag &= ~(ECHO | ICANON);
tcsetattr(0, TCSANOW, &new_termios); tcsetattr(0, TCSANOW, &new_termios);

View File

@ -45,7 +45,7 @@ int main()
while (ssize_t nread = read(fd, path_buffer, sizeof(path_buffer) - 1)) while (ssize_t nread = read(fd, path_buffer, sizeof(path_buffer) - 1))
{ {
if (nread == -1) if (nread < 0)
{ {
perror("read"); perror("read");
break; break;