Skip to content

Commit 62eaf3a

Browse files
authored
Merge pull request #476 from Gelbpunkt/aarch64_be-part1
Add support for aarch64_be
2 parents ec33379 + 37c4eb9 commit 62eaf3a

File tree

6 files changed

+50
-16
lines changed

6 files changed

+50
-16
lines changed

.github/workflows/ci.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
name: Run
4343
strategy:
4444
matrix:
45-
target: [x86_64, aarch64, riscv64]
45+
target: [x86_64, aarch64, aarch64_be, riscv64]
4646
os: [ubuntu-latest, macos-latest, windows-latest]
4747
include:
4848
- target: x86_64
@@ -83,8 +83,11 @@ jobs:
8383
- uses: actions/checkout@v5
8484
with:
8585
lfs: true
86-
- name: Install stable Rust toolchain
87-
uses: dtolnay/rust-toolchain@stable
86+
- name: Install Rust toolchain
87+
uses: dtolnay/rust-toolchain@master
88+
with:
89+
toolchain: ${{ matrix.target == 'aarch64_be' && 'nightly' || 'stable' }}
90+
components: ${{ matrix.target == 'aarch64_be' && 'rust-src' || '' }}
8891
- name: Dowload OpenSBI
8992
if: matrix.target == 'riscv64'
9093
run: |

data/aarch64_be/hello_world

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:652a3617267de4e2dc79533188dfb35e165ca4324dd354b9ed9c434de2f6320b
3+
size 801232

src/arch/aarch64/entry.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,13 @@ unsafe fn pre_init() -> ! {
165165
or if loading and not setting them would be the appropriate action.
166166
*/
167167

168+
#[cfg(target_endian = "big")]
169+
let endian = SCTLR_EL1::EE::BigEndian + SCTLR_EL1::E0E::BigEndian;
170+
#[cfg(target_endian = "little")]
171+
let endian = SCTLR_EL1::EE::LittleEndian + SCTLR_EL1::E0E::LittleEndian;
172+
168173
SCTLR_EL1.write(
169174
SCTLR_EL1::UCI::DontTrap
170-
+ SCTLR_EL1::EE::LittleEndian
171-
+ SCTLR_EL1::E0E::LittleEndian
172175
+ SCTLR_EL1::WXN::Disable
173176
+ SCTLR_EL1::NTWE::DontTrap
174177
+ SCTLR_EL1::NTWI::DontTrap
@@ -181,7 +184,8 @@ unsafe fn pre_init() -> ! {
181184
+ SCTLR_EL1::SA::Enable
182185
+ SCTLR_EL1::C::Cacheable
183186
+ SCTLR_EL1::A::Disable
184-
+ SCTLR_EL1::M::Disable,
187+
+ SCTLR_EL1::M::Disable
188+
+ endian,
185189
);
186190

187191
// Enter loader

src/arch/aarch64/link.ld

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
* https://github.com/rust-embedded/rust-raspberrypi-OS-tutorials/blob/master/16_virtual_mem_part4_higher_half_kernel/src/bsp/raspberrypi/link.ld
33
*/
44

5-
OUTPUT_FORMAT("elf64-littleaarch64")
6-
OUTPUT_ARCH("aarch64")
75
ENTRY(_start)
86
phys = 0x40200000;
97

xtask/src/ci/qemu.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ impl Qemu {
6363
}
6464

6565
let target = self.build.target();
66-
let arch = target.arch();
67-
let qemu = env::var("QEMU").unwrap_or_else(|_| format!("qemu-system-{arch}"));
66+
let qemu = target.qemu();
67+
let qemu = env::var("QEMU").unwrap_or_else(|_| format!("qemu-system-{qemu}"));
6868
let program = if self.sudo { "sudo" } else { qemu.as_str() };
6969
let arg = self.sudo.then_some(qemu.as_str());
7070

@@ -96,7 +96,7 @@ impl Qemu {
9696
"-append".to_string(),
9797
format!("-freq {frequency}"),
9898
]
99-
} else if self.build.target() == Target::Aarch64 {
99+
} else if matches!(self.build.target(), Target::Aarch64 | Target::Aarch64Be) {
100100
vec!["-machine".to_string(), "virt,gic-version=3".to_string()]
101101
} else if self.build.target() == Target::Riscv64 {
102102
vec![
@@ -174,7 +174,7 @@ impl Qemu {
174174
cpu_args
175175
}
176176
Target::X86_64Fc => panic!("unsupported"),
177-
Target::Aarch64 => {
177+
Target::Aarch64 | Target::Aarch64Be => {
178178
let mut cpu_args = if self.accel {
179179
todo!()
180180
} else {
@@ -233,7 +233,7 @@ impl Qemu {
233233
Target::X86_64Uefi => {
234234
memory = memory.max(512);
235235
}
236-
Target::Aarch64 => {
236+
Target::Aarch64 | Target::Aarch64Be => {
237237
memory = memory.max(256);
238238
}
239239
Target::Riscv64 => {

xtask/src/target.rs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,18 @@ pub enum Target {
99
X86_64Fc,
1010
X86_64Uefi,
1111
Aarch64,
12+
Aarch64Be,
1213
Riscv64,
1314
}
1415

1516
impl Target {
1617
pub fn install(&self) -> xshell::Result<()> {
1718
let sh = Shell::new()?;
1819

19-
let triple = self.triple();
20-
cmd!(sh, "rustup target add {triple}").run()?;
20+
if self.tier() <= 2 {
21+
let triple = self.triple();
22+
cmd!(sh, "rustup target add {triple}").run()?;
23+
}
2124

2225
if self == &Self::X86_64 {
2326
cmd!(sh, "rustup component add llvm-tools-preview").run()?;
@@ -32,6 +35,7 @@ impl Target {
3235
Self::X86_64Fc => "x86_64",
3336
Self::X86_64Uefi => "x86_64",
3437
Self::Aarch64 => "aarch64",
38+
Self::Aarch64Be => "aarch64_be",
3539
Self::Riscv64 => "riscv64",
3640
}
3741
}
@@ -42,16 +46,28 @@ impl Target {
4246
Self::X86_64Fc => "x86_64-unknown-none",
4347
Self::X86_64Uefi => "x86_64-unknown-uefi",
4448
Self::Aarch64 => "aarch64-unknown-none-softfloat",
49+
Self::Aarch64Be => "aarch64_be-unknown-none-softfloat",
4550
Self::Riscv64 => "riscv64imac-unknown-none-elf",
4651
}
4752
}
4853

54+
pub fn tier(&self) -> u8 {
55+
match self {
56+
Self::Aarch64Be => 3,
57+
_ => 2,
58+
}
59+
}
60+
4961
pub fn cargo_args(&self) -> &'static [&'static str] {
5062
match self {
5163
Self::X86_64 => &["--target=x86_64-unknown-none"],
5264
Self::X86_64Fc => &["--target=x86_64-unknown-none"],
5365
Self::X86_64Uefi => &["--target=x86_64-unknown-uefi"],
5466
Self::Aarch64 => &["--target=aarch64-unknown-none-softfloat"],
67+
Self::Aarch64Be => &[
68+
"--target=aarch64_be-unknown-none-softfloat",
69+
"-Zbuild-std=core,alloc,panic_abort",
70+
],
5571
Self::Riscv64 => &["--target=riscv64imac-unknown-none-elf"],
5672
}
5773
}
@@ -67,7 +83,7 @@ impl Target {
6783
"-Crelocation-model=static",
6884
],
6985
Self::X86_64Uefi => &[],
70-
Self::Aarch64 => &["-Clink-arg=-Tsrc/arch/aarch64/link.ld"],
86+
Self::Aarch64 | Self::Aarch64Be => &["-Clink-arg=-Tsrc/arch/aarch64/link.ld"],
7187
Self::Riscv64 => &["-Clink-arg=-Tsrc/arch/riscv64/link.ld"],
7288
}
7389
}
@@ -92,9 +108,18 @@ impl Target {
92108
Self::X86_64Fc => "hermit-loader-x86_64-fc",
93109
Self::X86_64Uefi => "hermit-loader-x86_64.efi",
94110
Self::Aarch64 => "hermit-loader-aarch64",
111+
Self::Aarch64Be => "hermit-loader-aarch64_be",
95112
Self::Riscv64 => "hermit-loader-riscv64",
96113
}
97114
}
115+
116+
pub fn qemu(&self) -> &'static str {
117+
match self {
118+
Self::X86_64 | Self::X86_64Fc | Self::X86_64Uefi => "x86_64",
119+
Self::Aarch64 | Self::Aarch64Be => "aarch64",
120+
Self::Riscv64 => "riscv64",
121+
}
122+
}
98123
}
99124

100125
impl FromStr for Target {
@@ -106,6 +131,7 @@ impl FromStr for Target {
106131
"x86_64-fc" => Ok(Self::X86_64Fc),
107132
"x86_64-uefi" => Ok(Self::X86_64Uefi),
108133
"aarch64" => Ok(Self::Aarch64),
134+
"aarch64_be" => Ok(Self::Aarch64Be),
109135
"riscv64" => Ok(Self::Riscv64),
110136
s => Err(anyhow!("Unsupported target: {s}")),
111137
}

0 commit comments

Comments
 (0)