Skip to content

V3.13 custom #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: v3.13.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
VERSION = 3
PATCHLEVEL = 13
SUBLEVEL = 0
EXTRAVERSION =
EXTRAVERSION = -networkmmapv0.8
NAME = One Giant Leap for Frogkind

# *DOCUMENTATION*
Expand Down
2 changes: 2 additions & 0 deletions arch/x86/syscalls/syscall_32.tbl
Original file line number Diff line number Diff line change
Expand Up @@ -357,3 +357,5 @@
348 i386 process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev
349 i386 kcmp sys_kcmp
350 i386 finit_module sys_finit_module
351 i386 network_mmap sys_network_mmap_pgoff
352 i386 network_msync sys_network_msync
2 changes: 2 additions & 0 deletions arch/x86/syscalls/syscall_64.tbl
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,8 @@
311 64 process_vm_writev sys_process_vm_writev
312 common kcmp sys_kcmp
313 common finit_module sys_finit_module
314 common network_mmap sys_network_mmap_pgoff
315 common network_msync sys_network_msync

#
# x32-specific system call numbers start at 512 to avoid cache impact
Expand Down
6 changes: 6 additions & 0 deletions include/linux/mm.h
Original file line number Diff line number Diff line change
Expand Up @@ -2011,5 +2011,11 @@ void __init setup_nr_node_ids(void);
static inline void setup_nr_node_ids(void) {}
#endif

typedef int (*network_mmap_fault_handler)(struct vm_area_struct *vma, struct vm_fault *vmf);
extern void set_kmod_network_mmap_fault_handler(network_mmap_fault_handler func);

typedef int (*network_msync)(unsigned long start, size_t len, int flags);
extern void set_kmod_network_msync(network_msync func);

#endif /* __KERNEL__ */
#endif /* _LINUX_MM_H */
6 changes: 6 additions & 0 deletions include/linux/syscalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -847,4 +847,10 @@ asmlinkage long sys_process_vm_writev(pid_t pid,
asmlinkage long sys_kcmp(pid_t pid1, pid_t pid2, int type,
unsigned long idx1, unsigned long idx2);
asmlinkage long sys_finit_module(int fd, const char __user *uargs, int flags);

asmlinkage long sys_network_mmap_pgoff(unsigned long addr, unsigned long len,
unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long pgoff);

asmlinkage long sys_network_msync(unsigned long start, size_t len, int flags);
#endif
59 changes: 59 additions & 0 deletions mm/mmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -1400,6 +1400,65 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
return retval;
}

network_mmap_fault_handler network_mmap_fault_handler_ptr = NULL;

static int default_network_mmap_fault_handler(struct vm_area_struct *vma, struct vm_fault *vmf) {
int retval = VM_FAULT_SIGBUS;
printk(KERN_INFO "1. Calling default_network_mmap_fault_handler: %016llX\n", (uint64_t)network_mmap_fault_handler_ptr);
if (network_mmap_fault_handler_ptr) {
printk(KERN_INFO "2. Calling network_mmap_fault_handler_ptr\n");
retval = network_mmap_fault_handler_ptr(vma, vmf);
printk(KERN_INFO "3. Done calling network_mmap_fault_handler_ptr: %d\n", retval);
}
printk(KERN_INFO "4. default_network_mmap_fault_handler: %d\n", retval);

return retval;
}

static const struct vm_operations_struct network_mmap_vm_ops = {
.fault = default_network_mmap_fault_handler,
};

SYSCALL_DEFINE6(network_mmap_pgoff, unsigned long, addr, unsigned long, len,
unsigned long, prot, unsigned long, flags,
unsigned long, fd, unsigned long, pgoff)
{
unsigned long retval;
struct vm_area_struct *vma;
struct mm_struct *mm = current->mm;

printk(KERN_INFO "network_mmap_pgoff: 1. Entering network_mmap_pgoff\n");

printk(KERN_INFO "network_mmap_pgoff: 2. Calling sys_mmap_pgoff\n");
retval = sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
printk(KERN_INFO "network_mmap_pgoff: 3. Completed sys_mmap_pgoff: %lu\n", retval);

// Was there an error? Just return the error code
if ((signed long)retval < 0 && (signed long)retval >= -133) {
return retval;
}

printk(KERN_INFO "network_mmap_pgoff: 4. Getting vma\n");
// Override the fault handler with our own!
vma = find_vma(mm, retval); // retval contains our address at the start of our mmaped region
if (!vma) {
retval = -ENOMEM;
}
printk(KERN_INFO "network_mmap_pgoff: 5. Completed getting vma: %016llX\n", (uint64_t)vma);
printk(KERN_INFO "network_mmap_pgoff: 6. Overriding fault handler to: %016llX\n", (uint64_t)&network_mmap_vm_ops);
vma->vm_ops = &network_mmap_vm_ops;
printk(KERN_INFO "network_mmap_pgoff: 7. Completed overriding fault handler\n");

return retval;
}

void set_kmod_network_mmap_fault_handler(network_mmap_fault_handler func) {
printk(KERN_INFO "set_kmod_network_mmap_fault_handler: 1. Entering set_kmod_network_mmap_fault_handler: %016llX\n", (uint64_t)func);
network_mmap_fault_handler_ptr = func;
printk(KERN_INFO "set_kmod_network_mmap_fault_handler: 2. Completed setting set_kmod_network_mmap_fault_handler: %016llX\n", (uint64_t)network_mmap_fault_handler_ptr);
}
EXPORT_SYMBOL(set_kmod_network_mmap_fault_handler);

#ifdef __ARCH_WANT_SYS_OLD_MMAP
struct mmap_arg_struct {
unsigned long addr;
Expand Down
23 changes: 23 additions & 0 deletions mm/msync.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,26 @@ SYSCALL_DEFINE3(msync, unsigned long, start, size_t, len, int, flags)
out:
return error ? : unmapped_error;
}

network_msync network_msync_ptr = NULL;

SYSCALL_DEFINE3(network_msync, unsigned long, start, size_t, len, int, flags)
{
int retval = -EINVAL;
printk(KERN_INFO "1. Calling default_network_msync: %016llX\n", (uint64_t)network_msync_ptr);
if (network_msync_ptr) {
printk(KERN_INFO "2. Calling network_msync_ptr\n");
retval = network_msync_ptr(start, len, flags);
printk(KERN_INFO "3. Done calling network_msync_ptr: %d\n", retval);
}
printk(KERN_INFO "4. default_network_msync: %d\n", retval);

return retval;
}

void set_kmod_network_msync(network_msync func) {
printk(KERN_INFO "set_kmod_network_msync: 1. Entering set_kmod_network_msync: %016llX\n", (uint64_t)func);
network_msync_ptr = func;
printk(KERN_INFO "set_kmod_network_msync: 2. Completed setting set_kmod_network_msync: %016llX\n", (uint64_t)network_msync_ptr);
}
EXPORT_SYMBOL(set_kmod_network_msync);