SYSCALL_AIO_ERROR = 123,
SYSCALL_AIO_RETURN = 124,
SYSCALL_AIO_SUSPEND = 125,
+
+ SYSCALL_MOUNT = 126,
};
#endif
* ASLR: randomize stack base by up to 256 pages (1 MB). */
extern uint32_t kaslr_offset(uint32_t max_pages);
const uintptr_t aslr_stack_slide = kaslr_offset(256);
- const uintptr_t user_stack_base = 0x00800000U + aslr_stack_slide;
+ const uintptr_t user_stack_base = 0x40000000U + aslr_stack_slide;
const size_t user_stack_size = 0x8000; /* 8 pages = 32 KB */
int src2 = elf32_map_user_range(new_as, user_stack_base, user_stack_size, VMM_FLAG_RW);
kprintf("[USER] Starting ring3 test...\n");
const uintptr_t user_code_vaddr = 0x00400000U;
- const uintptr_t user_stack_vaddr = 0x00800000U;
+ const uintptr_t user_stack_vaddr = 0x40000000U;
void* code_phys = pmm_alloc_page();
void* stack_phys = pmm_alloc_page();
static void diskfs_close_impl(fs_node_t* node) {
if (!node) return;
struct diskfs_node* dn = (struct diskfs_node*)node;
+ if (dn == &g_root) return;
kfree(dn);
}
}
const uintptr_t KERN_BASE = hal_mm_kernel_virt_base();
- const uintptr_t USER_STACK_BASE = 0x00800000U;
+ const uintptr_t USER_STACK_BASE = 0x40000000U;
if (addr < current_process->heap_start) return current_process->heap_break;
if (addr >= USER_STACK_BASE) return current_process->heap_break;
return;
}
+ if (syscall_no == SYSCALL_MOUNT) {
+ if (!current_process || current_process->euid != 0) {
+ sc_ret(regs) = (uint32_t)-EPERM;
+ return;
+ }
+ const char* user_dev = (const char*)sc_arg0(regs);
+ const char* user_mp = (const char*)sc_arg1(regs);
+ const char* user_type = (const char*)sc_arg2(regs);
+ char kdev[64], kmp[128], ktype[32];
+ if (copy_from_user(kdev, user_dev, sizeof(kdev)) < 0 ||
+ path_resolve_user(user_mp, kmp, sizeof(kmp)) < 0 ||
+ copy_from_user(ktype, user_type, sizeof(ktype)) < 0) {
+ sc_ret(regs) = (uint32_t)-EFAULT;
+ return;
+ }
+ kdev[sizeof(kdev)-1] = '\0';
+ ktype[sizeof(ktype)-1] = '\0';
+
+ if (strcmp(ktype, "tmpfs") == 0) {
+ fs_node_t* tmp = tmpfs_create_root();
+ if (!tmp) { sc_ret(regs) = (uint32_t)-ENOMEM; return; }
+ sc_ret(regs) = (uint32_t)vfs_mount(kmp, tmp);
+ return;
+ }
+
+ /* Disk-based: parse /dev/hdX -> drive number */
+ const char* devname = kdev;
+ if (strncmp(devname, "/dev/", 5) == 0) devname += 5;
+ extern int ata_name_to_drive(const char* name);
+ int drive = ata_name_to_drive(devname);
+ if (drive < 0) { sc_ret(regs) = (uint32_t)-ENODEV; return; }
+
+ extern int init_mount_fs(const char* fstype, int drive, uint32_t lba, const char* mountpoint);
+ int rc = init_mount_fs(ktype, drive, 0, kmp);
+ sc_ret(regs) = (uint32_t)(rc < 0 ? -EIO : 0);
+ return;
+ }
+
sc_ret(regs) = (uint32_t)-ENOSYS;
}
-/* AdrOS mount utility — display mounted filesystems */
+/* AdrOS mount utility — mount filesystems or display mounts */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
+#include <syscall.h>
+#include <errno.h>
-int main(int argc, char** argv) {
- (void)argc; (void)argv;
- /* Read /proc/mounts if available, otherwise show static info */
+static void show_mounts(void) {
int fd = open("/proc/mounts", O_RDONLY);
if (fd >= 0) {
char buf[1024];
printf("devfs on /dev type devfs (rw)\n");
printf("procfs on /proc type procfs (ro)\n");
}
+}
+
+int main(int argc, char** argv) {
+ if (argc < 3) {
+ show_mounts();
+ return 0;
+ }
+
+ const char* device = argv[1];
+ const char* mountpoint = argv[2];
+ const char* fstype = "diskfs";
+
+ /* Parse -t fstype option */
+ for (int i = 1; i < argc - 2; i++) {
+ if (strcmp(argv[i], "-t") == 0 && i + 1 < argc) {
+ fstype = argv[++i];
+ }
+ }
+
+ int rc = __syscall_ret(_syscall3(SYS_MOUNT, (int)device, (int)mountpoint, (int)fstype));
+ if (rc < 0) {
+ fprintf(stderr, "mount: mounting %s on %s failed: %d\n", device, mountpoint, rc);
+ return 1;
+ }
return 0;
}
SYS_SETEGID = 91,
SYS_SETITIMER = 92,
SYS_GETITIMER = 93,
+ SYS_MOUNT = 126,
};
/* Raw syscall wrappers — up to 5 args via INT 0x80 */