*** 3000physicalview.c 2020-03-21 15:40:39.000000000 -0400 --- 3000physicalview-read.c 2025-04-07 21:15:46.907971456 -0400 *************** *** 23,28 **** --- 23,29 ---- static struct device *device = NULL; static struct class *class = NULL; static int major_number; + static unsigned long addr = 0; //before any writes /* Helper functions below this line ---------------- */ *************** *** 147,157 **** --- 148,200 ---- return 0; } + static ssize_t physicalview_write(struct file *f, const char *buf, size_t len, loff_t *offset) + { + if(kstrtoul_from_user(buf, len>255?255:len, 0, &addr)) + addr = 0; + *offset += len; + printk("GOT: %ld\n", addr); + return (ssize_t) *offset; + } + + static ssize_t physicalview_read(struct file *f, char *buf, size_t len, loff_t *offset) + { + size_t i, msglen; + unsigned long phys = 0; + + char message[100]; + + if (*offset > 0) { + return 0; + } + + phys = get_physical(addr); + + snprintf(message, 100, "The physical address is 0x%lx!\n", phys); + + msglen = strlen(message); + + if (len < msglen) { + msglen = len; + } + + for (i = 0; i < msglen; i++) { + put_user(message[i], buf++); + } + + *offset = i; + + return i; + } + + /* Register file operations */ static struct file_operations fops = { .open = physicalview_open, .release = physicalview_release, .unlocked_ioctl = physicalview_ioctl, + .read = physicalview_read, + .write = physicalview_write, }; /* World readable and writable because... security? */