From 806fa3a33382c349dbbf6f0f9d0c40833b188ebf Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 24 Aug 2024 21:51:55 -0300 Subject: [PATCH] devfs: take cred struct in devfs_register --- kernel-src/arch/x86-64/e9.c | 2 +- kernel-src/fs/devfs.c | 5 +++- kernel-src/include/kernel/devfs.h | 2 +- kernel-src/io/audio/hda.c | 38 +++++++++++++++++++++++++++++++ kernel-src/io/block/block.c | 2 +- kernel-src/io/fb.c | 2 +- kernel-src/io/keyboard.c | 2 +- kernel-src/io/mouse.c | 2 +- kernel-src/io/net/netdev.c | 2 +- kernel-src/io/pseudodevices.c | 8 +++---- kernel-src/io/pty.c | 4 ++-- kernel-src/io/tty.c | 4 ++-- 12 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 kernel-src/io/audio/hda.c diff --git a/kernel-src/arch/x86-64/e9.c b/kernel-src/arch/x86-64/e9.c index 7d465e4e..f1f07202 100644 --- a/kernel-src/arch/x86-64/e9.c +++ b/kernel-src/arch/x86-64/e9.c @@ -32,6 +32,6 @@ static devops_t devops = { void arch_e9_initdev() { #ifdef X86_64_ENABLE_E9 - __assert(devfs_register(&devops, "e9", V_TYPE_CHDEV, DEV_MAJOR_E9, 0, 0644) == 0); + __assert(devfs_register(&devops, "e9", V_TYPE_CHDEV, DEV_MAJOR_E9, 0, 0666, NULL) == 0); #endif } diff --git a/kernel-src/fs/devfs.c b/kernel-src/fs/devfs.c index 5c4fdb7f..53cb506d 100644 --- a/kernel-src/fs/devfs.c +++ b/kernel-src/fs/devfs.c @@ -420,6 +420,7 @@ void devfs_init() { __assert(devfsroot); devfsroot->vnode.type = V_TYPE_DIR; devfsroot->vnode.flags = V_FLAGS_ROOT; + devfsroot->attr.mode = 0755; __assert(hashtable_init(&devfsroot->children, 100) == 0); __assert(vfs_register(&vfsops, "devfs") == 0); __assert(hashtable_set(&devfsroot->children, devfsroot, ".", 1, true) == 0); @@ -434,7 +435,7 @@ int devfs_getbyname(char *name, vnode_t **ret) { return error; } // register new device -int devfs_register(devops_t *devops, char *name, int type, int major, int minor, mode_t mode) { +int devfs_register(devops_t *devops, char *name, int type, int major, int minor, mode_t mode, cred_t *cred) { __assert(type == V_TYPE_CHDEV || type == V_TYPE_BLKDEV); devnode_t *master = slab_allocate(nodecache); if (master == NULL) @@ -456,6 +457,8 @@ int devfs_register(devops_t *devops, char *name, int type, int major, int minor, attr.mode = mode; attr.rdevmajor = major; attr.rdevminor = minor; + attr.uid = cred == NULL ? 0 : cred->euid; + attr.gid = cred == NULL ? 0 : cred->egid; vnode_t *newvnode = NULL; diff --git a/kernel-src/include/kernel/devfs.h b/kernel-src/include/kernel/devfs.h index 80e69ad4..2d6b65f4 100644 --- a/kernel-src/include/kernel/devfs.h +++ b/kernel-src/include/kernel/devfs.h @@ -44,7 +44,7 @@ typedef struct devnode_t { void devfs_init(); int devfs_getnode(vnode_t *physical, int major, int minor, vnode_t **node); -int devfs_register(devops_t *devops, char *name, int type, int major, int minor, mode_t mode); +int devfs_register(devops_t *devops, char *name, int type, int major, int minor, mode_t mode, cred_t *cred); int devfs_getbyname(char *name, vnode_t **ret); int devfs_createdir(char *name); void devfs_remove(char *name, int major, int minor); diff --git a/kernel-src/io/audio/hda.c b/kernel-src/io/audio/hda.c new file mode 100644 index 00000000..8870ecb2 --- /dev/null +++ b/kernel-src/io/audio/hda.c @@ -0,0 +1,38 @@ +#include +#include +#include + +static void initcontroller(pcienum_t *e) { + //pcibar_t bar0p = pci_getbar(e, 0); + //volatile nvmebar0_t *bar0 = (volatile nvmebar0_t *)bar0p.address; + //__assert(bar0); + + pci_setcommand(e, PCI_COMMAND_MMIO, 1); + pci_setcommand(e, PCI_COMMAND_IO, 0); + pci_setcommand(e, PCI_COMMAND_IRQDISABLE, 1); + pci_setcommand(e, PCI_COMMAND_BUSMASTER, 1); + + printf("hda: found controller at %02x:%02x.%x\n", e->bus, e->device, e->function); + + // enable interrupts + + size_t intcount; + if (e->msix.exists) { + intcount = pci_initmsix(e); + } else if (e->msi.exists) { + // intcount = pci_initmsi(e); + } else { + printf("hda: controller doesn't support msi-x or msi\n"); + return; + } +} + +void hda_init() { + int i = 0; + for (;;) { + pcienum_t *e = pci_getenum(-1, -1, -1, 0x8086, 0x2668, -1, i++); + if (e == NULL) + break; + initcontroller(e); + } +} diff --git a/kernel-src/io/block/block.c b/kernel-src/io/block/block.c index 875234d3..5f1e9d11 100644 --- a/kernel-src/io/block/block.c +++ b/kernel-src/io/block/block.c @@ -170,7 +170,7 @@ static int registerdesc(blockdesc_t *desc, char *name) { if (ret) return ret; - return devfs_register(&devops, name, V_TYPE_BLKDEV, DEV_MAJOR_BLOCK, id, 0644); + return devfs_register(&devops, name, V_TYPE_BLKDEV, DEV_MAJOR_BLOCK, id, 0600, NULL); } #define PART_NONE 0 diff --git a/kernel-src/io/fb.c b/kernel-src/io/fb.c index 32bc7ec8..8d823652 100644 --- a/kernel-src/io/fb.c +++ b/kernel-src/io/fb.c @@ -244,7 +244,7 @@ void fb_init() { char name[6]; snprintf(name, 6, "fb%d", i); - __assert(devfs_register(&ops, name, V_TYPE_CHDEV, DEV_MAJOR_FB, i, 0644) == 0); + __assert(devfs_register(&ops, name, V_TYPE_CHDEV, DEV_MAJOR_FB, i, 0666, NULL) == 0); printf("%s: %dx%d %d bpp\n", name, fb->width, fb->height, fb->bpp); } diff --git a/kernel-src/io/keyboard.c b/kernel-src/io/keyboard.c index 291b11eb..ae344438 100644 --- a/kernel-src/io/keyboard.c +++ b/kernel-src/io/keyboard.c @@ -230,7 +230,7 @@ keyboard_t *keyboard_new() { char name[12]; snprintf(name, 12, "keyboard%d", currentkbnum); - __assert(devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_KEYBOARD, currentkbnum, 0644) == 0); + __assert(devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_KEYBOARD, currentkbnum, 0666, NULL) == 0); POLL_INITHEADER(&kb->pollheader); ++currentkbnum; diff --git a/kernel-src/io/mouse.c b/kernel-src/io/mouse.c index d846daa5..41feed0b 100644 --- a/kernel-src/io/mouse.c +++ b/kernel-src/io/mouse.c @@ -171,7 +171,7 @@ mouse_t *mouse_new() { char name[12]; snprintf(name, 12, "mouse%d", currentnum); - __assert(devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_MOUSE, currentnum, 0644) == 0); + __assert(devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_MOUSE, currentnum, 0600, NULL) == 0); ++currentnum; return mouse; diff --git a/kernel-src/io/net/netdev.c b/kernel-src/io/net/netdev.c index 31b77609..4d3b1adc 100644 --- a/kernel-src/io/net/netdev.c +++ b/kernel-src/io/net/netdev.c @@ -17,7 +17,7 @@ int netdev_register(netdev_t *netdev, char *name) { goto leave; - e = devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_NET, 0, 0644); + e = devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_NET, 0, 0600, NULL); if (e) hashtable_remove(&nametable, name, strlen(name)); diff --git a/kernel-src/io/pseudodevices.c b/kernel-src/io/pseudodevices.c index fb1a179a..de2833f2 100644 --- a/kernel-src/io/pseudodevices.c +++ b/kernel-src/io/pseudodevices.c @@ -61,8 +61,8 @@ static devops_t urandomops = { }; void pseudodevices_init() { - __assert(devfs_register(&nullops, "null", V_TYPE_CHDEV, DEV_MAJOR_NULL, 0, 0644) == 0); - __assert(devfs_register(&fullops, "full", V_TYPE_CHDEV, DEV_MAJOR_FULL, 0, 0644) == 0); - __assert(devfs_register(&zeroops, "zero", V_TYPE_CHDEV, DEV_MAJOR_ZERO, 0, 0644) == 0); - __assert(devfs_register(&urandomops, "urandom", V_TYPE_CHDEV, DEV_MAJOR_URANDOM, 0, 0644) == 0); + __assert(devfs_register(&nullops, "null", V_TYPE_CHDEV, DEV_MAJOR_NULL, 0, 0666, NULL) == 0); + __assert(devfs_register(&fullops, "full", V_TYPE_CHDEV, DEV_MAJOR_FULL, 0, 0666, NULL) == 0); + __assert(devfs_register(&zeroops, "zero", V_TYPE_CHDEV, DEV_MAJOR_ZERO, 0, 0666, NULL) == 0); + __assert(devfs_register(&urandomops, "urandom", V_TYPE_CHDEV, DEV_MAJOR_URANDOM, 0, 0666, NULL) == 0); } diff --git a/kernel-src/io/pty.c b/kernel-src/io/pty.c index 78a4a2b2..34d8919a 100644 --- a/kernel-src/io/pty.c +++ b/kernel-src/io/pty.c @@ -253,7 +253,7 @@ static int open(int oldminor, vnode_t **vnode, int flags) { // register a master device and immediatelly remove it from the filesystem and tables // while holding the refcount - int error = devfs_register(&devops, tmpname, V_TYPE_CHDEV, DEV_MAJOR_PTY, newminor, 0644); + int error = devfs_register(&devops, tmpname, V_TYPE_CHDEV, DEV_MAJOR_PTY, newminor, 0, NULL); if (error) { freeptyminor(newminor); freepty(pty); @@ -284,7 +284,7 @@ static int open(int oldminor, vnode_t **vnode, int flags) { } void pty_init() { - __assert(devfs_register(&devops, "ptmx", V_TYPE_CHDEV, DEV_MAJOR_PTY, PTMX_MINOR, 0644) == 0); + __assert(devfs_register(&devops, "ptmx", V_TYPE_CHDEV, DEV_MAJOR_PTY, PTMX_MINOR, 0666, NULL) == 0); __assert(devfs_createdir("pts") == 0); SPINLOCK_INIT(listlock); } diff --git a/kernel-src/io/tty.c b/kernel-src/io/tty.c index 73613533..fb576733 100644 --- a/kernel-src/io/tty.c +++ b/kernel-src/io/tty.c @@ -477,7 +477,7 @@ tty_t *tty_create(char *name, ttydevicewritefn_t writefn, ttyinactivefn_t inacti goto error; } - if (devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_TTY, minor, 0644)) { + if (devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_TTY, minor, 0600, _cpu()->thread->proc ? &_cpu()->thread->proc->cred : NULL)) { freeminor(minor); ringbuffer_destroy(&tty->readbuffer); goto error; @@ -541,6 +541,6 @@ void tty_unregister(tty_t *tty) { void tty_init() { - __assert(devfs_register(&devops, "tty", V_TYPE_CHDEV, DEV_MAJOR_TTY, CONTROLLING_TTY_MINOR, 0644) == 0); + __assert(devfs_register(&devops, "tty", V_TYPE_CHDEV, DEV_MAJOR_TTY, CONTROLLING_TTY_MINOR, 0666, NULL) == 0); MUTEX_INIT(&listmutex); }