Skip to content

Commit 652f9d5

Browse files
committed
WIP
1 parent 211b909 commit 652f9d5

File tree

8 files changed

+379
-87
lines changed

8 files changed

+379
-87
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
[submodule "vitaGL"]
22
path = vitaGL
33
url = https://github.com/Rinnegatamante/vitaGL.git
4+
[submodule "kubridge"]
5+
path = kubridge
6+
url = https://github.com/bythos14/kubridge.git

Cargo.lock

Lines changed: 11 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ affinity = "0.1.2"
3232
[build-dependencies]
3333
bindgen = "0.70.0"
3434
cc = "1.0.100"
35+
cmake = "0.1"
3536

3637
[target.armv7-sony-vita-newlibeabihf.dependencies]
3738
vitasdk-sys = { version = "0.3.2", features = [

build.rs

Lines changed: 77 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -25,47 +25,82 @@ fn main() {
2525
let vitasdk_include_path = vitasdk_path.join("arm-vita-eabi").join("include");
2626
let vitasdk_lib_path = vitasdk_path.join("arm-vita-eabi").join("lib");
2727

28-
let bindings_file = out_path.join("imgui_bindings.rs");
29-
30-
const IMGUI_HEADERS: [&str; 3] = ["imgui.h", "imgui_internal.h", "imgui_impl_vitagl.h"];
31-
let mut bindings = bindgen::Builder::default()
32-
.clang_args(["-I", vitasdk_include_path.to_str().unwrap()])
33-
.clang_args(["-x", "c++"])
34-
.clang_args(["-std=c++17"])
35-
.clang_args(["-target", "armv7a-none-eabihf"])
36-
.formatter(Formatter::Prettyplease);
37-
for header in IMGUI_HEADERS {
38-
let header_path = vitasdk_include_path.join(header);
39-
println!("cargo:rerun-if-changed={header_path:?}");
40-
bindings = bindings.header(header_path.to_str().unwrap());
28+
let kubridge_path = PathBuf::from("kubridge");
29+
30+
{
31+
let bindings_file = out_path.join("imgui_bindings.rs");
32+
33+
const IMGUI_HEADERS: [&str; 3] = ["imgui.h", "imgui_internal.h", "imgui_impl_vitagl.h"];
34+
let mut bindings = bindgen::Builder::default()
35+
.clang_args(["-I", vitasdk_include_path.to_str().unwrap()])
36+
.clang_args(["-x", "c++"])
37+
.clang_args(["-std=c++17"])
38+
.clang_args(["-target", "armv7a-none-eabihf"])
39+
.formatter(Formatter::Prettyplease);
40+
for header in IMGUI_HEADERS {
41+
let header_path = vitasdk_include_path.join(header);
42+
println!("cargo:rerun-if-changed={header_path:?}");
43+
bindings = bindings.header(header_path.to_str().unwrap());
44+
}
45+
bindings.rust_target(bindgen::RustTarget::Nightly).generate().unwrap().write_to_file(bindings_file).unwrap();
46+
47+
println!("cargo:rustc-link-search=native={vitasdk_lib_path:?}");
48+
println!("cargo:rustc-link-lib=static=imgui");
49+
}
50+
51+
{
52+
let bindings_file = out_path.join("kubridge_bindings.rs");
53+
54+
const KUBRIDGE_HEADERS: [&str; 1] = ["kubridge.h"];
55+
let mut bindings = bindgen::Builder::default()
56+
.clang_args(["-I", vitasdk_include_path.to_str().unwrap()])
57+
.clang_args(["-I", kubridge_path.to_str().unwrap()])
58+
.clang_args(["-x", "c++"])
59+
.clang_args(["-std=c++17"])
60+
.clang_args(["-target", "armv7a-none-eabihf"])
61+
.formatter(Formatter::Prettyplease);
62+
for header in KUBRIDGE_HEADERS {
63+
let header_path = kubridge_path.join(header);
64+
println!("cargo:rerun-if-changed={header_path:?}");
65+
bindings = bindings.header(header_path.to_str().unwrap());
66+
}
67+
bindings.rust_target(bindgen::RustTarget::Nightly).generate().unwrap().write_to_file(bindings_file).unwrap();
68+
}
69+
70+
{
71+
let vita_gl_path = PathBuf::from("vitaGL");
72+
let vita_gl_lib_path = vita_gl_path.join("libvitaGL.a");
73+
let vita_gl_lib_new_path = vita_gl_path.join("libvitaGL_dsvita.a");
74+
75+
Command::new("make")
76+
.current_dir("vitaGL")
77+
.args(["-j", &num_jobs])
78+
.envs([
79+
("HAVE_UNFLIPPED_FBOS", "1"),
80+
("NO_TEX_COMBINER", "1"),
81+
("NO_DEBUG", "1"),
82+
("SHADER_COMPILER_SPEEDHACK", "1"),
83+
("MATH_SPEEDHACK", "1"),
84+
("HAVE_SHADER_CACHE", "1"),
85+
// ("HAVE_SHARK_LOG", "1"),
86+
// ("LOG_ERRORS", "1"),
87+
// ("HAVE_RAZOR", "1"),
88+
])
89+
.status()
90+
.unwrap();
91+
92+
fs::rename(vita_gl_lib_path, vita_gl_lib_new_path).unwrap();
93+
println!("cargo:rustc-link-search=native={}", fs::canonicalize(vita_gl_path).unwrap().to_str().unwrap());
94+
println!("cargo:rustc-link-lib=static=vitaGL_dsvita");
95+
}
96+
97+
{
98+
let kubridge_dst_path = cmake::Config::new(&kubridge_path).build_target("libkubridge_stub.a").build().join("build");
99+
let kubridge_lib_path = kubridge_dst_path.join("libkubridge_stub.a");
100+
let kubridge_lib_new_path = kubridge_dst_path.join("libkubridge_stub_dsvita.a");
101+
fs::rename(kubridge_lib_path, kubridge_lib_new_path).unwrap();
102+
103+
println!("cargo:rustc-link-search=native={}", fs::canonicalize(kubridge_dst_path).unwrap().to_str().unwrap());
104+
println!("cargo:rustc-link-lib=static=kubridge_stub_dsvita");
41105
}
42-
bindings.rust_target(bindgen::RustTarget::Nightly).generate().unwrap().write_to_file(bindings_file).unwrap();
43-
44-
println!("cargo:rustc-link-search=native={vitasdk_lib_path:?}");
45-
println!("cargo:rustc-link-lib=static=imgui");
46-
47-
let vita_gl_path = PathBuf::from("vitaGL");
48-
let vita_gl_lib_path = vita_gl_path.join("libvitaGL.a");
49-
let vita_gl_lib_new_path = vita_gl_path.join("libvitaGL_dsvita.a");
50-
51-
Command::new("make")
52-
.current_dir("vitaGL")
53-
.args(["-j", &num_jobs])
54-
.envs([
55-
("HAVE_UNFLIPPED_FBOS", "1"),
56-
("NO_TEX_COMBINER", "1"),
57-
("NO_DEBUG", "1"),
58-
("SHADER_COMPILER_SPEEDHACK", "1"),
59-
("MATH_SPEEDHACK", "1"),
60-
("HAVE_SHADER_CACHE", "1"),
61-
// ("HAVE_SHARK_LOG", "1"),
62-
// ("LOG_ERRORS", "1"),
63-
// ("HAVE_RAZOR", "1"),
64-
])
65-
.status()
66-
.unwrap();
67-
68-
fs::rename(vita_gl_lib_path, vita_gl_lib_new_path).unwrap();
69-
println!("cargo:rustc-link-search=native={}", fs::canonicalize(vita_gl_path).unwrap().to_str().unwrap());
70-
println!("cargo:rustc-link-lib=static=vitaGL_dsvita");
71106
}

kubridge

Submodule kubridge added at a4ef20f

src/core/memory/regions.rs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use crate::core::memory::vram;
2+
13
pub const INSTRUCTION_TCM_OFFSET: u32 = 0x00000000;
24
pub const INSTRUCTION_TCM_MIRROR_OFFSET: u32 = 0x01000000;
35
pub const INSTRUCTION_TCM_SIZE: u32 = 32 * 1024;
@@ -34,3 +36,54 @@ pub const ARM9_BIOS_OFFSET: u32 = 0xFFFF0000;
3436
pub const ARM9_BIOS_SIZE: u32 = 32 * 1024;
3537
pub const ARM7_BIOS_OFFSET: u32 = 0x00000000;
3638
pub const ARM7_BIOS_SIZE: u32 = 16 * 1024;
39+
40+
pub const TOTAL_MEM_SIZE: u32 = INSTRUCTION_TCM_SIZE
41+
+ DATA_TCM_SIZE
42+
+ MAIN_MEMORY_SIZE
43+
+ SHARED_WRAM_SIZE
44+
+ ARM7_WRAM_SIZE
45+
+ WIFI_RAM_SIZE
46+
+ vram::TOTAL_SIZE as u32
47+
+ GBA_ROM_SIZE
48+
+ GBA_RAM_SIZE
49+
+ ARM9_BIOS_SIZE
50+
+ ARM7_BIOS_SIZE;
51+
52+
pub struct MemRegion {
53+
start: u32,
54+
end: u32,
55+
size: u32,
56+
allow_write: bool,
57+
}
58+
59+
impl MemRegion {
60+
pub const fn new(start: u32, end: u32, size: u32, allow_write: bool) -> Self {
61+
MemRegion { start, end, size, allow_write }
62+
}
63+
}
64+
65+
pub const VIRTUAL_MEM_REGIONS_ARM9: [MemRegion; 11] = [
66+
MemRegion::new(INSTRUCTION_TCM_OFFSET, MAIN_MEMORY_OFFSET, INSTRUCTION_TCM_SIZE, true),
67+
MemRegion::new(0, 0, DATA_TCM_SIZE, true),
68+
MemRegion::new(MAIN_MEMORY_OFFSET, SHARED_WRAM_OFFSET, MAIN_MEMORY_SIZE, true),
69+
MemRegion::new(0, 0, SHARED_WRAM_SIZE, true),
70+
MemRegion::new(IO_PORTS_OFFSET, STANDARD_PALETTES_OFFSET, 0, true),
71+
MemRegion::new(STANDARD_PALETTES_OFFSET, VRAM_OFFSET, 0, true),
72+
MemRegion::new(0, 0, vram::TOTAL_SIZE as u32, true),
73+
MemRegion::new(OAM_OFFSET, GBA_ROM_OFFSET, 0, true),
74+
MemRegion::new(GBA_ROM_OFFSET, GBA_RAM_OFFSET, GBA_ROM_SIZE, false),
75+
MemRegion::new(0, 0, GBA_RAM_SIZE, true),
76+
MemRegion::new(0xF0000000, 0x10000000, ARM9_BIOS_SIZE, false),
77+
];
78+
79+
pub const VIRTUAL_MEM_REGIONS_ARM7: [MemRegion; 8] = [
80+
MemRegion::new(ARM7_BIOS_OFFSET, MAIN_MEMORY_OFFSET, ARM7_BIOS_SIZE, true),
81+
MemRegion::new(MAIN_MEMORY_OFFSET, SHARED_WRAM_OFFSET, MAIN_MEMORY_SIZE, true),
82+
MemRegion::new(0, 0, SHARED_WRAM_SIZE, true),
83+
MemRegion::new(ARM7_WRAM_OFFSET, IO_PORTS_OFFSET, ARM7_WRAM_SIZE, true),
84+
MemRegion::new(IO_PORTS_OFFSET, WIFI_IO_OFFSET, 0, true),
85+
MemRegion::new(WIFI_IO_OFFSET, STANDARD_PALETTES_OFFSET, WIFI_RAM_SIZE, true),
86+
MemRegion::new(0, 0, vram::TOTAL_SIZE as u32, true),
87+
MemRegion::new(GBA_ROM_OFFSET, GBA_RAM_OFFSET, GBA_ROM_SIZE, false),
88+
MemRegion::new(0, 0, GBA_RAM_SIZE, true),
89+
];

src/mmap/linux.rs

Lines changed: 104 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,29 @@
1+
use libc::*;
12
use std::io::{Error, ErrorKind};
23
use std::ops::{Deref, DerefMut};
3-
use std::ptr::null_mut;
4-
use std::{io, slice};
4+
use std::{io, ptr, slice};
55

66
pub struct Mmap {
7-
ptr: *mut libc::c_void,
7+
ptr: *mut u8,
88
size: usize,
99
}
1010

1111
impl Mmap {
12-
pub fn rw(_: &str, size: usize) -> io::Result<Self> {
13-
Mmap::new(libc::PROT_READ | libc::PROT_WRITE, size)
14-
}
15-
16-
pub fn executable(_: &str, size: usize) -> io::Result<Self> {
17-
Mmap::new(libc::PROT_READ | libc::PROT_WRITE | libc::PROT_EXEC, size)
12+
pub fn executable(_: impl AsRef<str>, size: usize) -> io::Result<Self> {
13+
Mmap::new(PROT_READ | PROT_WRITE | PROT_EXEC, size)
1814
}
1915

2016
fn new(prot: i32, size: usize) -> io::Result<Self> {
21-
let ptr = unsafe { libc::mmap(null_mut(), size as _, prot, libc::MAP_ANON | libc::MAP_PRIVATE, -1, 0) };
22-
if ptr != libc::MAP_FAILED {
23-
Ok(Mmap { ptr, size })
17+
let ptr = unsafe { mmap(ptr::null_mut(), size as _, prot, libc::MAP_ANON | libc::MAP_PRIVATE, -1, 0) };
18+
if ptr != MAP_FAILED {
19+
Ok(Mmap { ptr: ptr as _, size })
2420
} else {
2521
Err(Error::from(ErrorKind::AddrNotAvailable))
2622
}
2723
}
2824

2925
pub fn as_mut_ptr(&mut self) -> *mut u8 {
30-
self.ptr as _
26+
self.ptr
3127
}
3228

3329
pub fn as_ptr(&self) -> *const u8 {
@@ -41,7 +37,7 @@ impl Mmap {
4137

4238
impl Drop for Mmap {
4339
fn drop(&mut self) {
44-
unsafe { libc::munmap(self.ptr, self.size as _) };
40+
unsafe { munmap(self.ptr as _, self.size as _) };
4541
}
4642
}
4743

@@ -70,3 +66,97 @@ impl AsMut<[u8]> for Mmap {
7066
self.deref_mut()
7167
}
7268
}
69+
70+
pub struct ShmMem(i32);
71+
72+
impl ShmMem {
73+
pub fn new(_: impl AsRef<str>, size: usize) -> io::Result<Self> {
74+
let fd = unsafe { shm_open("dsvita_mem\0".as_ptr() as _, O_CREAT | O_EXCL | O_RDWR, S_IREAD | S_IWRITE) };
75+
unsafe { shm_unlink("dsvita_mem\0".as_ptr() as _) };
76+
if fd >= 0 {
77+
if unsafe { ftruncate(fd, size as _) == 0 } {
78+
Ok(ShmMem(fd))
79+
} else {
80+
unsafe { close(fd) };
81+
Err(Error::from(ErrorKind::AddrNotAvailable))
82+
}
83+
} else {
84+
Err(Error::from(ErrorKind::AddrNotAvailable))
85+
}
86+
}
87+
}
88+
89+
impl Drop for ShmMem {
90+
fn drop(&mut self) {
91+
unsafe { close(self.0) };
92+
}
93+
}
94+
95+
pub struct VirtualMem {
96+
ptr: *mut u8,
97+
size: usize,
98+
}
99+
100+
impl VirtualMem {
101+
pub fn new(virtual_size: usize) -> io::Result<Self> {
102+
let ptr = unsafe { mmap(ptr::null_mut(), virtual_size as _, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0) };
103+
if ptr == MAP_FAILED {
104+
Err(Error::from(ErrorKind::AddrNotAvailable))
105+
} else {
106+
Ok(VirtualMem { ptr: ptr as _, size: virtual_size })
107+
}
108+
}
109+
110+
pub fn as_mut_ptr(&mut self) -> *mut u8 {
111+
self.ptr
112+
}
113+
114+
pub fn as_ptr(&self) -> *const u8 {
115+
self.ptr as _
116+
}
117+
118+
pub fn len(&self) -> usize {
119+
self.size as _
120+
}
121+
122+
pub fn create_mapping(&mut self, shm_mem: &ShmMem, offset: usize, size: usize, start_addr: usize, end_addr: usize) -> io::Result<()> {
123+
for addr_offset in (start_addr..end_addr).step_by(size) {
124+
if unsafe { mmap(self.ptr.add(addr_offset) as _, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, shm_mem.0, offset as _) } == MAP_FAILED {
125+
return Err(Error::from(ErrorKind::AddrNotAvailable));
126+
}
127+
}
128+
Ok(())
129+
}
130+
}
131+
132+
impl Drop for VirtualMem {
133+
fn drop(&mut self) {
134+
unsafe { munmap(self.ptr as _, self.size) };
135+
}
136+
}
137+
138+
impl Deref for VirtualMem {
139+
type Target = [u8];
140+
141+
fn deref(&self) -> &Self::Target {
142+
unsafe { slice::from_raw_parts(self.as_ptr(), self.len()) }
143+
}
144+
}
145+
146+
impl DerefMut for VirtualMem {
147+
fn deref_mut(&mut self) -> &mut Self::Target {
148+
unsafe { slice::from_raw_parts_mut(self.as_mut_ptr(), self.len()) }
149+
}
150+
}
151+
152+
impl AsRef<[u8]> for VirtualMem {
153+
fn as_ref(&self) -> &[u8] {
154+
self.deref()
155+
}
156+
}
157+
158+
impl AsMut<[u8]> for VirtualMem {
159+
fn as_mut(&mut self) -> &mut [u8] {
160+
self.deref_mut()
161+
}
162+
}

0 commit comments

Comments
 (0)