mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
devfs: take cred struct in devfs_register
This commit is contained in:
@@ -32,6 +32,6 @@ static devops_t devops = {
|
|||||||
|
|
||||||
void arch_e9_initdev() {
|
void arch_e9_initdev() {
|
||||||
#ifdef X86_64_ENABLE_E9
|
#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
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -420,6 +420,7 @@ void devfs_init() {
|
|||||||
__assert(devfsroot);
|
__assert(devfsroot);
|
||||||
devfsroot->vnode.type = V_TYPE_DIR;
|
devfsroot->vnode.type = V_TYPE_DIR;
|
||||||
devfsroot->vnode.flags = V_FLAGS_ROOT;
|
devfsroot->vnode.flags = V_FLAGS_ROOT;
|
||||||
|
devfsroot->attr.mode = 0755;
|
||||||
__assert(hashtable_init(&devfsroot->children, 100) == 0);
|
__assert(hashtable_init(&devfsroot->children, 100) == 0);
|
||||||
__assert(vfs_register(&vfsops, "devfs") == 0);
|
__assert(vfs_register(&vfsops, "devfs") == 0);
|
||||||
__assert(hashtable_set(&devfsroot->children, devfsroot, ".", 1, true) == 0);
|
__assert(hashtable_set(&devfsroot->children, devfsroot, ".", 1, true) == 0);
|
||||||
@@ -434,7 +435,7 @@ int devfs_getbyname(char *name, vnode_t **ret) {
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
// register new device
|
// 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);
|
__assert(type == V_TYPE_CHDEV || type == V_TYPE_BLKDEV);
|
||||||
devnode_t *master = slab_allocate(nodecache);
|
devnode_t *master = slab_allocate(nodecache);
|
||||||
if (master == NULL)
|
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.mode = mode;
|
||||||
attr.rdevmajor = major;
|
attr.rdevmajor = major;
|
||||||
attr.rdevminor = minor;
|
attr.rdevminor = minor;
|
||||||
|
attr.uid = cred == NULL ? 0 : cred->euid;
|
||||||
|
attr.gid = cred == NULL ? 0 : cred->egid;
|
||||||
|
|
||||||
vnode_t *newvnode = NULL;
|
vnode_t *newvnode = NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ typedef struct devnode_t {
|
|||||||
|
|
||||||
void devfs_init();
|
void devfs_init();
|
||||||
int devfs_getnode(vnode_t *physical, int major, int minor, vnode_t **node);
|
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_getbyname(char *name, vnode_t **ret);
|
||||||
int devfs_createdir(char *name);
|
int devfs_createdir(char *name);
|
||||||
void devfs_remove(char *name, int major, int minor);
|
void devfs_remove(char *name, int major, int minor);
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#include <kernel/pci.h>
|
||||||
|
#include <logging.h>
|
||||||
|
#include <kernel/hda.h>
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -170,7 +170,7 @@ static int registerdesc(blockdesc_t *desc, char *name) {
|
|||||||
if (ret)
|
if (ret)
|
||||||
return 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
|
#define PART_NONE 0
|
||||||
|
|||||||
+1
-1
@@ -244,7 +244,7 @@ void fb_init() {
|
|||||||
char name[6];
|
char name[6];
|
||||||
snprintf(name, 6, "fb%d", i);
|
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);
|
printf("%s: %dx%d %d bpp\n", name, fb->width, fb->height, fb->bpp);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ keyboard_t *keyboard_new() {
|
|||||||
char name[12];
|
char name[12];
|
||||||
snprintf(name, 12, "keyboard%d", currentkbnum);
|
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);
|
POLL_INITHEADER(&kb->pollheader);
|
||||||
++currentkbnum;
|
++currentkbnum;
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ mouse_t *mouse_new() {
|
|||||||
char name[12];
|
char name[12];
|
||||||
|
|
||||||
snprintf(name, 12, "mouse%d", currentnum);
|
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;
|
++currentnum;
|
||||||
return mouse;
|
return mouse;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ int netdev_register(netdev_t *netdev, char *name) {
|
|||||||
goto leave;
|
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)
|
if (e)
|
||||||
hashtable_remove(&nametable, name, strlen(name));
|
hashtable_remove(&nametable, name, strlen(name));
|
||||||
|
|
||||||
|
|||||||
@@ -61,8 +61,8 @@ static devops_t urandomops = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void pseudodevices_init() {
|
void pseudodevices_init() {
|
||||||
__assert(devfs_register(&nullops, "null", V_TYPE_CHDEV, DEV_MAJOR_NULL, 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, 0644) == 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, 0644) == 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, 0644) == 0);
|
__assert(devfs_register(&urandomops, "urandom", V_TYPE_CHDEV, DEV_MAJOR_URANDOM, 0, 0666, NULL) == 0);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -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
|
// register a master device and immediatelly remove it from the filesystem and tables
|
||||||
// while holding the refcount
|
// 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) {
|
if (error) {
|
||||||
freeptyminor(newminor);
|
freeptyminor(newminor);
|
||||||
freepty(pty);
|
freepty(pty);
|
||||||
@@ -284,7 +284,7 @@ static int open(int oldminor, vnode_t **vnode, int flags) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void pty_init() {
|
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);
|
__assert(devfs_createdir("pts") == 0);
|
||||||
SPINLOCK_INIT(listlock);
|
SPINLOCK_INIT(listlock);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -477,7 +477,7 @@ tty_t *tty_create(char *name, ttydevicewritefn_t writefn, ttyinactivefn_t inacti
|
|||||||
goto error;
|
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);
|
freeminor(minor);
|
||||||
ringbuffer_destroy(&tty->readbuffer);
|
ringbuffer_destroy(&tty->readbuffer);
|
||||||
goto error;
|
goto error;
|
||||||
@@ -541,6 +541,6 @@ void tty_unregister(tty_t *tty) {
|
|||||||
|
|
||||||
|
|
||||||
void tty_init() {
|
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);
|
MUTEX_INIT(&listmutex);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user