Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stuck when compiling on m1 chip mac os #76

Open
ZonePG opened this issue Apr 22, 2021 · 25 comments · May be fixed by #62
Open

Stuck when compiling on m1 chip mac os #76

ZonePG opened this issue Apr 22, 2021 · 25 comments · May be fixed by #62

Comments

@ZonePG
Copy link

ZonePG commented Apr 22, 2021

I use brew install RISC-V toolchain on m1 mac os, and make qemu

it prints:

qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0

then seems like stuck.

@VitalyAnkh
Copy link

I'm running Arch Linux with an amd64 laptop but meet the same problem.

@gaelwjl
Copy link

gaelwjl commented May 30, 2021

I have met the same problem with qemu-system-riscv64: qemu_mprotect__osdep: mprotect failed: Permission denied

@Virtual-Machine
Copy link

What worked for me was to pull the source for Qemu 4.2.1 and compile. I put this 4.2.1 version qemu-system-riscv64 in my path before the system version so it would be preferred.

What I am unsure of is if a later version of Qemu would work, but this atleast let me boot from make qemu. Maybe someone with a faster rig could try newer versions to see if one of them will also suffice.

Another strange thing which I am unsure if this is a generic risc-v/qemu issue or not but I cannot seem to get it to launch a graphics window like the x86_64 version does regardless of the version. Maybe someone more knowledgable can comment.

@Taowyoo
Copy link

Taowyoo commented Jun 4, 2021

I'm running Arch Linux with an amd64 laptop but meet the same problem.

@VitalyAnkh
I meet the same problem in Archlinux.
According to Virtual-Machine 's solution.
Because Archlinux update in rolling, qemu 4.2 depending on many old version libraries so it cannot run correctly.
After serval tries, I found qemu 5.2 is OK to me.

My OS info

Operating System: Manjaro Linux 21.0.5
Kernel: Linux 5.9.16-1-MANJARO

Here is how to downgrade qemu and qemu-arch-extra

  1. Install downgrade through yay
# install yay
pacman -S yay
# use yay to install downgrade from AUR repo
yay -S downgrade
  1. Use downgrade to downgrade qemu and qemu-arch-extra to 5.2
sudo su
export DOWNGRADE_FROM_ALA=1
downgrade qemu-arch-extra qemu

When asking you which version to downgrade, choose:
qemu 5.2.0 4 x86_64
qemu-arch-extra 5.2.0 4 x86_64

@VitalyAnkh
Copy link

@Taowyoo Thanks! This makes us run the tutorial smoothly, but I wonder how could we port xv6 to the latest qemu? I think it’s worthing doing.

@Taowyoo
Copy link

Taowyoo commented Jun 5, 2021

@Taowyoo Thanks! This makes us run the tutorial smoothly, but I wonder how could we port xv6 to the latest qemu? I think it’s worthing doing.

@VitalyAnkh
Yes, that's the best way.
I tried to debug xv6 to found the problem:
I found the code stuck at

asm volatile("mret");

I am new to RISC-V and xv6 also qemu. But I will continue learning and working on this problem

@Virtual-Machine
Copy link

@Taowyoo

Nice catch. I tried debugging as well and I am also getting caught on mret but inside the timervec routine instead... when using QEMU 6.0.0 on Arch. I can send an interrupt signal and it will reloop back and get caught on the mret again.

@Taowyoo

This comment has been minimized.

@Taowyoo
Copy link

Taowyoo commented Jun 15, 2021

This problem should be fixed by #62
I have checked it works correctly with Qemu 6.0.0 on my Arch.
@Virtual-Machine @VitalyAnkh

@lf- lf- linked a pull request Jun 17, 2021 that will close this issue
@kalpesh2001
Copy link

I am trying to compile on Mac running Big Sur 11.2.3 and getting
qemu-system-riscv64: qemu_mprotect__osdep: mprotect failed: Permission denied

Any idea how to get around this. Any help is appreciated.

@ZonePG
Copy link
Author

ZonePG commented Jun 29, 2021

I am trying to compile on Mac running Big Sur 11.2.3 and getting
qemu-system-riscv64: qemu_mprotect__osdep: mprotect failed: Permission denied

Any idea how to get around this. Any help is appreciated.

This article may help you, but applies to qemu5.1.0 and xv6 os run well.

@Alice-space
Copy link

I ran into the same problem.
The solution of this blog works

@siwei-li
Copy link

Two patches added to qemu-5.10.0 and it works!
See here: ReZeroS/mit6.828-note#3

@jcob-sikorski
Copy link

jcob-sikorski commented Dec 4, 2021

Solution:

(Steps 2-5 have to be made on Ubuntu)

  1. install Ubuntu LTS for arm64 (I made it by installing on UTM virtual machine https://mac.getutm.app/gallery/ubuntu-20-04)
  2. after successful installation, type to Ubuntu Shell sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu
  3. git clone this repository
  4. go to directory where this repository was installed
  5. type make qemu

@u2386
Copy link

u2386 commented Feb 20, 2022

I tried to debug xv6 to found the problem:

Hi @Taowyoo @Virtual-Machine, I got the same problem but did know how to debug on qemu, especially at the time of os booting. :/

Could I ask how did you debug this scenario?

@Virtual-Machine
Copy link

Virtual-Machine commented Feb 21, 2022

@u2386 to debug OS boot you can use the provided "make qemu-gdb" which should start up xv6 in qemu waiting for a gdb session to connect. If you then run gdb in another shell you can have it connect to the OS waiting in qemu. From there you should be able to set breakpoints, jump, read, inspect the OS as it boots up etc.

Reviewing the Makefile should be helpful to see how it does this via command line flags.

image

Also of relevance see the .gdbinit file:

image

@fengxiaohu
Copy link

@u2386 to debug OS boot you can use the provided "make qemu-gdb" which should start up xv6 in qemu waiting for a gdb session to connect. If you then run gdb in another shell you can have it connect to the OS waiting in qemu. From there you should be able to set breakpoints, jump, read, inspect the OS as it boots up etc.

Reviewing the Makefile should be helpful to see how it does this via command line flags.

image

Also of relevance see the .gdbinit file:

image

perfect answer.I used to know run make qemu-gdb to debug,But I never realized to check the Makefile.Now I get it.

@zhouzilong2020
Copy link

zhouzilong2020 commented Dec 22, 2022

Try to boot with

riscv64-unknown-elf-gcc (g2ee5e430018-dirty) 12.2.0
QEMU emulator version 7.2.0

and met the same problem.

@Mazz84002
Copy link

I was able to run xv6-x86 on my m1 mac running ubuntu arm64. Perform the following steps:

  1. clone the xv6 from git
  2. Now you need to install a cross compiler: sudo apt install gcc-i686-linux-gnu
  3. Go to the directory and instead of make , type make TOLLPREFIX=i686-linux-gnu-
  4. Now, instead of make qemu-nox, type make TOLLPREFIX=i686-linux-gnu- qemu-nox
  5. Voilà!!

@alex-puchkov
Copy link

I was able to run xv6-x86 on my m1 mac running ubuntu arm64. Perform the following steps:

1. clone the xv6 from git

2. Now you need to install a cross compiler: `sudo apt install gcc-i686-linux-gnu`

3. Go to the directory and instead of `make` , type `make TOLLPREFIX=i686-linux-gnu-`

4. Now, instead of `make qemu-nox`, type `make TOLLPREFIX=i686-linux-gnu- qemu-nox`

5. Voilà!!

Hey,

I'm also using M1 and a virtual Ubuntu ARM64 using UTM. How do I find the directory you mentioned at the third line?

@Mazz84002
Copy link

By directory I mean the location where you have downloaded the files of xv6. When you type git clone https://github.com/mit-pdos/xv6-public.git, you will have a directory named xv6 inside the directory you are already working in. Then you can use cd xv6 in the terminal to go to the xv6 directory. You can also find this by doing a system search and cd to that directly through the terminal.

@alex-puchkov
Copy link

By directory I mean the location where you have downloaded the files of xv6. When you type git clone https://github.com/mit-pdos/xv6-public.git, you will have a directory named xv6 inside the directory you are already working in. Then you can use cd xv6 in the terminal to go to the xv6 directory. You can also find this by doing a system search and cd to that directly through the terminal.

Thanks. I'm getting the following error after running make TOLLPREFIX. Any ideas on how to solve it?

`make TOLLPREFIX=i686-linux-gnu-


*** Error: Couldn't find an i386--elf version of GCC/binutils.
*** Is the directory with i386-jos-elf-gcc in your PATH?
*** If your i386-
-elf toolchain is installed with a command
*** prefix other than 'i386-jos-elf-', set your TOOLPREFIX
*** environment variable to that prefix and run 'make' again.
*** To turn off this error, run 'gmake TOOLPREFIX= ...'.


gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pie -no-pie -fno-pic -O -nostdinc -I. -c bootmain.c
gcc: error: unrecognized command-line option ‘-m32’
make: *** [Makefile:104: bootblock] Error 1
`

@Mazz84002
Copy link

To run xv6, you need qemu. Do you have it installed> sudo apt install qemu x86_64-elf-gcc
Can you try typing sudo apt install build-essential in your terminal?
Not sure if this will work

@keichenblat
Copy link

I was able to run xv6-x86 on my m1 mac running ubuntu arm64. Perform the following steps:

  1. clone the xv6 from git
  2. Now you need to install a cross compiler: sudo apt install gcc-i686-linux-gnu
  3. Go to the directory and instead of make , type make TOLLPREFIX=i686-linux-gnu-
  4. Now, instead of make qemu-nox, type make TOLLPREFIX=i686-linux-gnu- qemu-nox
  5. Voilà!!

Thanks, but there's a crucial typo in your answer, it is TOOLPREFIX not TOLLPREFIX. Here's a corrected answer:

  1. clone the xv6 from git
  2. Now you need to install a cross compiler: sudo apt install gcc-i686-linux-gnu
  3. Go to the directory and instead of make , type make TOOLPREFIX=i686-linux-gnu-
  4. Now, instead of make qemu-nox, type make TOOLPREFIX=i686-linux-gnu- qemu-nox

@AnzhiZhang
Copy link

I was on Ubuntu 22.04.4 LTS with QEMU 6 and had the same issue. Using #62 solves the problem.

After upgrading to Ubuntu 24.04.1 LTS and QEMU 8, this issue has also been resolved.

$ qemu-system-riscv64 --version
QEMU emulator version 8.2.2 (Debian 1:8.2.2+ds-0ubuntu1.2)
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.