Port-mips archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: rust for mipsel / mips32



>>>      * cpu = "mips3", an earlier mistake.  Produces "of course" 64-bit
>>>        instructions, so gives "illegal instruction" on e.g. cobalt and
>>>        32-bit-only CPUs.  Despite this also being marked "highly experimental"
>>>        in llvm, this build completed.
>>
>> -march=mips3 -mabi=32?
>
> Hmm, possibly.  I'll look into whether / how that can be
> expressed in the rust target specification.

I've made an attempt with this rust target specification:

------------------------------
use crate::abi::Endian;
use crate::spec::{Target, TargetOptions};

pub fn target() -> Target {
    let mut base = super::netbsd_base::opts();
    base.max_atomic_width = Some(32);
    base.cpu = "mips3".into();

    Target {
        llvm_target: "mipsel-unknown-netbsd".into(),
        pointer_width: 32,
        data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
        arch: "mips".into(),
        options: TargetOptions {
            features: "+soft-float,+m32".into(),
            mcount: "__mcount".into(),
            endian: Endian::Little,
            ..base
        },
    }
}
------------------------------

stored in compiler/rustc_target/src/specs/mipsel_unknown_netbsd.rs

However, note that I have not been able to find a comprehensive
overview of exactly what "features" I can turn on and what's
supported for which target, and no other rust mips targets try to
do anything like the above, so this is a bit of a "fumbling in
the dark" for me at the moment.

However, both on a Cobalt raq2 with an RM5200 CPU (but running an
9.2 O32 user-land) and a MIPSSIM emulator with a 24Kc CPU (with an
9.3 O32 user-land), in both cases I end up with an illegal
instruction trap when doing "cargo --help".

The executable of "cargo" is marked with

  Flags:    0x20001107, noreorder, pic, cpic, 32bitmode, o32, mips3

On both machines gdb refuses to cooperate and

a) cannot successfully read the core file I get from trying to do
   "cargo --help" (results in an internal consistency check
   causing gdb to want to dump a core of itself)
b) produces a different trap (trace/breakpoint) in an apparently
   un-mapped portion of memory according to "info target" when
   run under gdb

I don't know if this is because gdb in 9.2 and 9.3 is broken or if
there is something else going on, or whether a newer user-land would
improve matters.

So I don't quite know which instruction is at fault.  An earlier
attempt with just "mips3" without "+m32" succeeded the build, but
produced, perhaps expectedly, 64-bit instructions, and those are
"disabled" if you run the MIPSSIM NetBSD kernel.

I've uploaded the rust-bin package built with the above target
spec to

  ftp://ftp.netbsd.org/pub/NetBSD/misc/he/rust-bin-1.66.0-mips3-m32-fails.tgz

if anyone else wants to take a closer look at the executables and
can help identify the instruction causing the "illegal instruction"
fault.

Regards,

- Håvard


Home | Main Index | Thread Index | Old Index