Skip to content

Commit 4cd1ba4

Browse files
stash
Signed-off-by: Anhad Singh <[email protected]>
1 parent 48b92bb commit 4cd1ba4

File tree

13 files changed

+264
-17
lines changed

13 files changed

+264
-17
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,6 @@ base-files/doom1.wad
2222
# Wayland test client and server executables: (todo: remove these)
2323
base-files/client
2424
base-files/server
25+
26+
# todo: remove these
27+
debug

bootstrap/net.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -724,10 +724,10 @@ packages:
724724
- '-DUSE_SOUP2=ON'
725725
- '-DUSE_LCMS=OFF'
726726
- '@THIS_SOURCE_DIR@'
727+
environ:
728+
CXXFLAGS: '-DLOG_DISABLED=0'
727729
build:
728730
- args: ['ninja', '-j6']
729-
# environ:
730-
# CXXFLAGS: '-std=c++11'
731731
- args: ['ninja', 'install']
732732
environ:
733733
DESTDIR: '@THIS_COLLECT_DIR@'

src/aero_kernel/src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@
4848
trait_upcasting, // https://github.com/rust-lang/rust/issues/65991
4949
naked_functions, // https://github.com/rust-lang/rust/issues/32408
5050
cfg_match, // https://github.com/rust-lang/rust/issues/115585
51-
strict_provenance
51+
strict_provenance,
52+
offset_of
5253
)]
5354
// TODO(andypython): can we remove the dependency of "prelude_import" and "lang_items"?
5455
// `lang_items` => is currently used for the personality function (`rust_eh_personality`).

src/aero_kernel/src/socket/unix.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ fn path_from_unix_sock(address: &SocketAddrUnix) -> fs::Result<&Path> {
4242
// connection which does not require a path to be created.
4343
let abstract_namespaced = address.path[0] == 0;
4444
assert!(!abstract_namespaced);
45+
assert!(address.path[1] != 0, "unnamed UNIX socket");
4546

4647
let path_len = address
4748
.path
@@ -351,6 +352,7 @@ impl INodeInterface for UnixSocket {
351352

352353
let peer = queue.pop().expect("UnixSocket::accept(): backlog is empty");
353354
let sock = Self::new();
355+
sock.inner.lock_irq().address = inner.address.clone();
354356

355357
{
356358
let mut sock_inner = sock.inner.lock_irq();
@@ -362,16 +364,18 @@ impl INodeInterface for UnixSocket {
362364
peer_data.state = UnixSocketState::Connected(sock.clone());
363365
}
364366

367+
// THIS SHOULD NOT BE DONE HERE
365368
if let Some((address, length)) = address {
366369
let mut address = unsafe { UserRef::new(address) };
367370

368-
if let Some(paddr) = peer.inner.lock_irq().address.as_ref() {
371+
if let Some(paddr) = inner.address.as_ref() {
369372
*address = paddr.clone();
370373
} else {
371374
*address = SocketAddrUnix::default();
372375
address.family = AF_UNIX;
373376
}
374377

378+
// THIS IS WRONG use addr.name_len() + offset_of!(sockaddr_un, path)
375379
*length = core::mem::size_of::<SocketAddrUnix>() as u32;
376380
}
377381

src/aero_kernel/src/syscall/mod.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,8 @@ pub fn generic_do_syscall(
259259
// Syscall aliases (this should be handled in aero_syscall)
260260
SYS_MKDIR => fs::mkdirat(aero_syscall::AT_FDCWD as _, b, c),
261261

262+
SYS_DEBUG => tag_memory(b, c, d, e),
263+
262264
_ => {
263265
log::error!("invalid syscall: {:#x}", a);
264266
Err(SyscallError::ENOSYS)
@@ -267,3 +269,19 @@ pub fn generic_do_syscall(
267269

268270
aero_syscall::syscall_result_as_usize(result)
269271
}
272+
273+
#[syscall]
274+
pub fn tag_memory(ptr: *const u8, size: usize, tag: &str) -> Result<usize, SyscallError> {
275+
use crate::userland::scheduler;
276+
use alloc::string::ToString;
277+
278+
let addr = ptr as usize;
279+
280+
let thread = scheduler::current_thread();
281+
thread
282+
.mem_tags
283+
.lock()
284+
.insert(addr..(addr + size), tag.to_string());
285+
286+
Ok(0)
287+
}

src/aero_kernel/src/syscall/net.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,12 @@ pub fn socket(___domain: usize, socket_type: usize, protocol: usize) -> Result<usiz
178178

179179
let sockfd_flags = SocketFlags::from_bits_truncate(socket_type).into();
180180
let fd = dbg!(current_task.file_table.debug_open_file(entry, sockfd_flags))?;
181-
if fd == 17 {
182-
scheduler::get_scheduler()
183-
.find_task(TaskId::new(40))
184-
.unwrap()
185-
.enable_systrace();
186-
}
181+
// if fd == 17 {
182+
// scheduler::get_scheduler()
183+
// .find_task(TaskId::new(40))
184+
// .unwrap()
185+
// .enable_systrace();
186+
// }
187187

188188
Ok(fd)
189189
}
@@ -237,13 +237,12 @@ pub fn get_peername(fd: usize, addr: usize, len: &mut u32) -> Result<usize, Sysc
237237

238238
SocketAddr::Netlink(peer) => unimplemented!("{:?}", peer),
239239
SocketAddr::Unix(peer) => {
240-
// let size = core::mem::size_of::<SocketAddrUnix>() as u32;
241-
// assert!(*len >= size);
240+
let size = core::mem::size_of::<SocketAddrUnix>() as u32;
241+
assert!(*len >= size);
242242

243-
// let mut target = unsafe { UserRef::<SocketAddrUnix>::new(VirtAddr::new(addr as u64))
244-
// }; *target = peer;
245-
// *len = size;
246-
return Err(SyscallError::ENOSYS);
243+
let mut target = unsafe { &mut *(addr as *mut SocketAddrUnix) };
244+
*len = peer.path_len() as u32 + core::mem::offset_of!(SocketAddrUnix, path) as u32;
245+
*target = peer;
247246
}
248247
}
249248

@@ -290,8 +289,8 @@ pub fn get_sockname(fd: usize, addr: usize, len: &mut u32) -> Result<usize, Sysc
290289
assert!(*len >= size);
291290

292291
let mut target = unsafe { UserRef::<SocketAddrUnix>::new(VirtAddr::new(addr as u64)) };
292+
*len = name.path_len() as u32 + core::mem::offset_of!(SocketAddrUnix, path) as u32;
293293
*target = name;
294-
*len = size;
295294
}
296295
}
297296

src/aero_kernel/src/unwind.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use xmas_elf::ElfFile;
2626
use crate::mem::paging::{Translate, VirtAddr};
2727
use crate::mem::AddressSpace;
2828

29+
use crate::userland::scheduler;
2930
use crate::{logger, rendy};
3031

3132
use crate::arch::interrupts;
@@ -145,6 +146,20 @@ pub fn unwind_stack_trace() {
145146

146147
if let Some(name) = name {
147148
log::trace!("{:>2}: 0x{:016x} - {}", depth, rip, name);
149+
} else if scheduler::is_initialized() {
150+
if let Some((region, tag)) = scheduler::current_thread()
151+
.mem_tags
152+
.lock()
153+
.iter()
154+
.find(|(region, _tag)| region.contains(&rip))
155+
{
156+
let resolved_addr = rip - region.start;
157+
log::trace!(
158+
"{depth:>2}: 0x{rip:016x} - <userland, in={tag}, resolved_addr={resolved_addr:#x}>"
159+
);
160+
} else {
161+
log::trace!("{depth:>2}: 0x{rip:016x} - <unknown>");
162+
}
148163
} else {
149164
log::trace!("{:>2}: 0x{:016x} - <unknown>", depth, rip);
150165
}
@@ -153,6 +168,14 @@ pub fn unwind_stack_trace() {
153168
break;
154169
}
155170
}
171+
172+
let thread = scheduler::current_thread();
173+
let tags = thread.mem_tags.lock();
174+
let mut tags = tags.iter().collect::<alloc::vec::Vec<_>>();
175+
tags.sort_by(|x, y| x.0.start.cmp(&y.0.start));
176+
for (x, s) in tags.iter() {
177+
log::trace!("{:#x}..{:#x} {s}", x.start, x.end);
178+
}
156179
}
157180

158181
#[cfg(feature = "ci")]

src/aero_kernel/src/userland/task/mod.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ pub mod sessions;
2020
use aero_syscall::WaitPidFlags;
2121
use alloc::sync::{Arc, Weak};
2222

23+
use hashbrown::HashMap;
2324
use spin::{Once, RwLock};
2425

2526
use core::cell::UnsafeCell;
27+
use core::ops::Range;
2628
use core::sync::atomic::{AtomicBool, AtomicU8, AtomicUsize, Ordering};
2729

2830
use crate::fs::cache::{DirCacheImpl, DirCacheItem};
@@ -221,6 +223,9 @@ pub struct Task {
221223

222224
controlling_terminal: Mutex<Option<Arc<dyn TerminalDevice>>>,
223225
systrace: AtomicBool,
226+
227+
// for debugging only. may remove in the future.
228+
pub mem_tags: Mutex<HashMap<Range<usize>, String>>,
224229
}
225230

226231
impl Task {
@@ -265,6 +270,8 @@ impl Task {
265270

266271
systrace: AtomicBool::new(false),
267272
controlling_terminal: Mutex::new(None),
273+
274+
mem_tags: Mutex::new(HashMap::new()),
268275
})
269276
}
270277

@@ -307,6 +314,8 @@ impl Task {
307314

308315
systrace: AtomicBool::new(false),
309316
controlling_terminal: Mutex::new(None),
317+
318+
mem_tags: Mutex::new(HashMap::new()),
310319
})
311320
}
312321

@@ -345,6 +354,8 @@ impl Task {
345354

346355
systrace: AtomicBool::new(self.systrace()),
347356
controlling_terminal: Mutex::new(self.controlling_terminal.lock_irq().clone()),
357+
358+
mem_tags: Mutex::new(self.mem_tags.lock().clone()),
348359
});
349360

350361
self.add_child(this.clone());
@@ -413,6 +424,8 @@ impl Task {
413424
.lock_irq()
414425
.clone(),
415426
),
427+
428+
mem_tags: Mutex::new(self.mem_tags.lock().clone()),
416429
});
417430

418431
self.add_child(this.clone());
@@ -514,6 +527,7 @@ impl Task {
514527
*self.cwd.write() = Some(Cwd::new())
515528
}
516529

530+
*self.mem_tags.lock() = HashMap::new();
517531
self.file_table.close_on_exec();
518532

519533
self.file_table.log();

src/aero_kernel/src/userland/vm.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,8 @@ impl VmProtected {
782782
offset: usize,
783783
file: Option<DirCacheItem>,
784784
) -> Option<VirtAddr> {
785+
let z = file.clone();
786+
785787
// Offset is required to be a multiple of page size.
786788
if (offset as u64 & (Size4KiB::SIZE - 1)) != 0 {
787789
log::warn!("mmap: offset is not a multiple of page size");
@@ -864,6 +866,17 @@ impl VmProtected {
864866
if x.is_none() {
865867
log::warn!("mmap failed");
866868
self.log();
869+
870+
dbg!(
871+
address,
872+
size,
873+
protection,
874+
flags,
875+
offset,
876+
z.map(|f| f.absolute_path_str())
877+
);
878+
879+
crate::unwind::unwind_stack_trace();
867880
}
868881

869882
x

src/aero_syscall/src/consts.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ pub const SYS_GETPGID: usize = 74;
9898
pub const SYS_SOCK_SHUTDOWN: usize = 75;
9999
pub const SYS_GETPEERNAME: usize = 76;
100100
pub const SYS_GETSOCKNAME: usize = 77;
101+
pub const SYS_DEBUG: usize = 78;
101102

102103
// constants for fcntl()'s command argument:
103104
pub const F_DUPFD: usize = 1;

0 commit comments

Comments
 (0)