From: Stafford Horne <shorne@gmail.com>
To: Rob Landley <rob@landley.net>
Cc: linux-openrisc@vger.kernel.org, Jonas Bonn <jonas@southpole.se>,
Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
Subject: Re: Adding or1k support to mkroot.
Date: Sun, 17 Dec 2023 09:05:52 +0000 [thread overview]
Message-ID: <ZX658P7dEgqCezpi@antec> (raw)
In-Reply-To: <2e1d9f74-88fa-3f5a-7bc3-4fe7b726f2be@landley.net>
On Sat, Dec 16, 2023 at 07:00:23AM -0600, Rob Landley wrote:
> On 12/16/23 03:44, Stafford Horne wrote:
> > On Fri, Dec 15, 2023 at 07:33:42AM -0600, Rob Landley wrote:
> >> I've more or less gotten it to work. The trick was statically linking in the
> >> initramfs image:
> >>
> >> https://github.com/landley/toybox/commit/5647741f6687
> >>
> >> I haven't added any of the OPENRISC_HAVE_INST_* symbols because it booted
> >> without them, and presumably the toolchain will automatically do the right thing
> >> for userspace:
> >>
> >> https://landley.net/notes-2023.html#10-12-2023
> >>
> >> (I just specify an i486, i586, or i686 toolchain, or tell x86-64
> >> "CFLAGS=-mtune=nocona", and so on. I don't need to micromanage stuff in
> >> menuconfig to build for minor variations of a given target, I have no idea why
> >> openrisc would work differently.)
> >>
> >> Nor did I add JUMP_UPON_UNHANDLED_EXCEPTION because I honestly don't know what
> >> that modifies or why you would ever NOT do it if it was at all useful? I err on
> >> the side of fewer symbols when the benefit's not clear...
> >
> > I just use the defaults.
>
> Because of the way I'm doing it, the "default" for any symbol I don't select is
> switched off. My config lists all the symbols I need that aren't in allnoconfig.
> (Although "need" means a dependency won't switch it on when the other symbol
> gets switched on.)
>
> Conceptually it's the same as running "make allnoconfig" and then going through
> the list of symbols and switching them on by hand in menuconfig. "This is what's
> enabled in this kernel."
OK.
> > Those instruction specific switches will only be
> > helpful if you really want tune things. Which may be fun for some people.
> >
> > The OpenRISC kernel is not yet sophisticated enough to detect and replace,
> > emulate the missing instructions. So we have these switches. Some soft CPUs
> > may have these instructions enabled/or disabled and these switches help if you
> > know what you are doing. Luckily QEMU has all the instruction enabled.
>
> Isn't that a toolchain issue, though? Your userspace gets built with the same
> toolchain, "we have a multiply instruction" is kind of something it needs to
> know. Which means:
>
> $ :| or1k-linux-musl-cc -E -dM -
> #define __DBL_MIN_EXP__ (-1021)
> #define __UINT_LEAST16_MAX__ 0xffff
> #define __ATOMIC_ACQUIRE 2
> ...
> #define __UINT_FAST8_TYPE__ unsigned char
> #define __ATOMIC_ACQ_REL 4
> #define __ATOMIC_RELEASE 3
>
> Can't you have #defines in your toolchain saying what architecture variant it
> supports? And thus the code can #ifdef those without kconfig having to care?
Yes, the toolchain supports these, the kernel switches enable the toolchain
flags when building the kernel (mostly). For example:
$ or1k-elf-gcc --target-help
The following options are target specific:
...
-mcmov Enable generation of conditional move (l.cmov)
instructions. By default the equivalent will
be generated using set and branch.
..
-mhard-div Enable generation of hardware divide (l.div,
l.divu) instructions. This is the default; use
-msoft-div to override.
-mhard-mul Enable generation of hardware multiply
instructions (l.mul, l.muli) instructions. This
is the default; use -msoft-mul to override.
..
The exception is where we use these flags to enable bitops. In:
arch/openrisc/include/asm/bitops/ffs.h
arch/openrisc/include/asm/bitops/fls.h
Like other architectures the or1k toolchain doesn't expose which architecture is
being built. While architectures such as m68k define tunes and export i.e.
__mcfisaa__ to infer which instructions are enabled.
OpenRISC has no such architectures as within a softcpu architecture instructions
can be enabled or disabled as required. I know, its a bit crazy.
However, you should be safe disabling everything.
> > In terms of JUMP_UPON_UNHANDLED_EXCEPTION, this was added before my time. We
> > probably could get rid of it and do a more graceful power based halt.
>
> I'm still not 100% clear on what it does, even after reading the help text. :)
This set's up an infinite loop on panic, rather than performing the default
kernel operation.
> >> >> I built an or1k musl+gcc toolchain with my wrapper script around Rich Felker's
> >> >> musl-cross-make project by adding "or1k::" to the TARGETS list in
> >> >> https://github.com/landley/toybox/blob/master/scripts/mcm-buildall.sh#L34 and
> >> >> that seems to have worked-ish. (Well, the kernel headers didn't install because
> >> >> I have to add or1k->openrisc to musl-cross-make's TARGET_ARCH_MANGLED in
> >> >> litecross/Makefile, but eh, close enough for the moment.)
> >>
> >> I fixed that too, by the way:
> >>
> >> https://github.com/landley/toybox/commit/ab046139f9d8
> >
> > OK.
>
> Some glorious day Rich might apply the backlog of patches I've sent him to
> musl-cross-make (which last updated April 2022). Or I might scrape up the spoons
> to write a new linux-from-scratch style toolchain builder script so my
> mcm-buildall.sh isn't a wrapper around an external project. It's a toss-up which
> happens first...
>
> (Mostly when I have spare toolchain brain I wrestle with llvm stuff instead...)
>
> >> > This are my qemu arguments:
> >> >
> >> > qemu-system-or1k -cpu or1200 -machine virt \
> >> > -no-reboot -kernel /home/shorne/work/linux/vmlinux \
> >> > -device virtio-net-pci,netdev=user \
> >> > -netdev user,id=user,net=10.9.0.1/24,host=10.9.0.100,hostfwd=tcp::2222-:22 \
> >> > -serial mon:stdio -nographic
> >>
> >> If you're putting the monitor on stdio, where does the console go? (Is this
> >> going to pop up a graphics window or something? Or do you talk to it entirely
> >> through the virtual network?)
> >
> > Console goes to stdio, I use ctrl-a C to drop into monitor which is also in
> > stdio.
>
> Huh, I didn't know that was an option.
There are soo many options in QEMU.
> >> > -device virtio-blk-device,drive=d0 \
> >> > -drive file=/home/shorne/work/openrisc/or1k-utils/buildroot/output/qemu-fs-or1k.qcow2,id=d0,if=none,format=qcow2 \
> >> > -gdb tcp::10001 \
> >> > -accel tcg,thread=multi \
> >> > -smp cpus=4 -m 768 \
> >>
> >> Do I need to micromanage -accel?
> >
> > Probably not for your use cases. I can not recall the defaults but I think it
> > was not multi threaded. But I cannot be sure unless I go look. You probably
> > can run with a single core and no SMP.
>
> What I did years ago was set up distcc so qemu called out to the cross compiler
> running on loopback through the 10.0.2.2 emulated interface, thus moving the
> heavy lifting of compilation outside the emulator to where CPU was cheap without
> reintroducing all the problems of cross compiling (two compilers to keep
> straight, two sets of headers and two sets of libraries leaking into each other,
> can't run the binaries you generate, configure keeps asking questions about the
> host and applying the results to the target...)
>
> It still maxed out around -j 3 because of the preprocessing, linking, network
> transfer, and make figuring out what to do next, but was way better than purely
> native single CPU builds.
>
> No clue what the sweet spot is at today...
>
> >> > -append rootwait \
> >> > -append boot=/dev/vda2
> >>
> >> Did they ever fix qemu's problem that "append" didn't and you could only have
> >> one -append and it in fact completely replaced the existing command line on most
> >> architectures?
> >>
> >> https://lists.gnu.org/archive/html/qemu-devel/2017-05/msg03214.html
> >
> > After I sent this message I noticed this looked strange. It doesn't work, so my
> > command line ends up being: 'boot=/dev/vda2'. Which was enough to get it to
> > work.
>
> It's a misleading name.
>
> >> Hmmm, I've got:
> >>
> >> qemu-system-or1k -M or1k-sim -m 256 "$@" -nographic -no-reboot -kernel
> >> "$DIR"/linux-kernel -append "HOST=or1k console=FIXME $KARGS"
> >>
> >> And it looks like the answer to "how do you enable a halt/reboot switch that can
> >> exit qemu" is "don't use the or1k-sim board, use the virt board".
> >
> > Yeah, virt board is the only one that supports halt/reboot. The 'or1ksim'
> > platform that we used as the model of qemu 'or1k-sim' supported reboot and halt
> > via special 'nop' instructions. The QEMU maintainers did not feel these special
> > nop instructions should be supported in QEMU.
>
> Sigh. Ok, I'll start the process over digesting the other config and trying to
> get that one to work instead...
>
> >> It provides boot messages without any initrd at all. It eventually panics
> >> because there's no init, but early in board bringup I'm just looking for proof
> >> of life.
> >>
> >> > Do you have a valid initrd that maybe I can try out? I recently use qcow2
> >> > images to build, but I did used to use initrd images and it did work fine.
> >>
> >> Sure, just remove the BUILTIN=1 from the if or1k stanza, and... it's 582k, I'll
> >> send it _not_ cc-ing the mailing list. :)
> >
> > OK, I will try this out. But sorry busy this weekend I will probably not get
> > time.
>
> No rush, I think you've answered my question above. It would be nice to get the
> bug fixed, but unless I can -device,poweroff or similar on the qemu command line
> to insert whatever it's poking to halt (and then tell the kernel about it), the
> sim board isn't useful to me for automation.
I tried to boot your initramfs with my virt_defconfig kernel, I just exchanged
driver for -initrd. It seems to work, but panics with the following:
[ 0.260000] 90000000.serial: ttyS0 at MMIO 0x90000000 (irq = 2, base_baud = 1250000) is a 16550A
[ 0.270000] printk: console [ttyS0] enabled
..
[ 0.420000] usbhid: USB HID core driver
[ 0.420000] NET: Registered PF_PACKET protocol family
[ 0.490000] clk: Disabling unused clocks
[ 0.490000] ALSA device list:
[ 0.490000] No soundcards found.
[ 0.520000] Freeing unused kernel image (initmem) memory: 232K
[ 0.520000] This architecture does not have kernel memory protection.
[ 0.520000] Run /init as init process
Type exit when done.
oneit: /dev/ttyS0ttyS0: No such file or directory
[ 0.780000] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000100
[ 0.780000] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000100 ]---
I am not sure about /dev/ttyS0ttyS0.
-Stafford
> >> >> Any idea what's going on here? That last one's kind of a blocker...
> >> >
> >> > Have you tried to debug where it's getting hung up? Gdb remote debug should
> >> > be working for or1k.
> >>
> >> I have not yet tried to rustle up a gdb build that understands or1k machine
> >> code, no. I'm more likely to try to either get EARLY_PRINTK less broken or
> >> dredge up the 2 line spin-to-write-register version of 8250 output and cut and
> >> paste it in various places if I need to debug this myself.
> >
> > That's OK, I usually use the console too to help debug too.
>
> If I can reproduce it and stick a printf in it, I can generally debug it.
>
> >> But I was hoping it was a known limitation or at least easily recognized...
> >
> > OK, are things working for you now? Or is the problem that the initrd still
> > does not work?
>
> I can use initrd built-in to the kernel. I cannot supply it externally via
> qemu's -initrd. Which means I need to rebuild the kernel (7 minute clean
> rebuild) to tweak the filesystem (30 second clean rebuild).
>
> That said, if I can supply an external -initrd to the virt board, then it works
> like the other targets. (It's a matter of workflow, I'm trying to regression
> test stuff against as many architectures as I can, which means I want them to
> work the same.)
>
> One script I have doing this is my smoketest script at
> https://github.com/landley/toybox/blob/master/mkroot/testroot.sh which runs all
> the targets under qemu and makes sure they can get their clocks set (via ntp if
> necessary) and access a block device and do basic networking.
>
> Eventually I want to get that running the toybox test suite inside qemu on each
> architecture, but that's still a ways off. (The shell isn't capable enough yet,
> working on it...)
>
> I also want to get an automated Linux From Scratch build to compile and run on
> each target. I did that before with aboriginal linux years ago, but that was
> making busybox into a development environment. (Other projects like Alpine Linux
> and Adelie Linux took over from there when I stopped.) Now I'm trying to do it
> again with toybox, with the extra difficulty that I can't use any existing GPL
> code for anything because toybox is under a public domain equivalent license
> (Zero Clause BSD).
>
> (Yes, this would mean building Linux From Scratch on or1k, under qemu. That's
> why I need I need a board with a working block device and at least 256 megs of
> ram, although I can use a network block device and a swap file in a pinch on
> systems with an MMU. I would someday LIKE to do a from-source debootstrap and
> populate a musl-backed package repository via automated cluster build, but
> there's still a certain amount of undocumented black magic in getting that to
> work. The old "people who know have known so long they've forgotten how to
> explain it" problem...)
>
> > -Stafford
>
> Rob
next prev parent reply other threads:[~2023-12-17 9:05 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-12 10:16 Adding or1k support to mkroot Rob Landley
2023-12-14 19:50 ` Stafford Horne
2023-12-15 13:33 ` Rob Landley
2023-12-16 9:44 ` Stafford Horne
2023-12-16 13:00 ` Rob Landley
2023-12-17 9:05 ` Stafford Horne [this message]
2023-12-19 11:19 ` Rob Landley
2023-12-21 8:22 ` Rob Landley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZX658P7dEgqCezpi@antec \
--to=shorne@gmail.com \
--cc=jonas@southpole.se \
--cc=linux-openrisc@vger.kernel.org \
--cc=rob@landley.net \
--cc=stefan.kristiansson@saunalahti.fi \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).