cregit-Linux how code gets into the kernel

Release 4.11 arch/avr32/mm/cache.c

Directory: arch/avr32/mm
/*
 * Copyright (C) 2004-2006 Atmel Corporation
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/highmem.h>
#include <linux/unistd.h>

#include <asm/cacheflush.h>
#include <asm/cachectl.h>
#include <asm/processor.h>
#include <linux/uaccess.h>
#include <asm/syscalls.h>

/*
 * If you attempt to flush anything more than this, you need superuser
 * privileges.  The value is completely arbitrary.
 */

#define CACHEFLUSH_MAX_LEN	1024


void invalidate_dcache_region(void *start, size_t size) { unsigned long v, begin, end, linesz, mask; linesz = boot_cpu_data.dcache.linesz; mask = linesz - 1; /* when first and/or last cachelines are shared, flush them * instead of invalidating ... never discard valid data! */ begin = (unsigned long)start; end = begin + size; if (begin & mask) { flush_dcache_line(start); begin += linesz; } if (end & mask) { flush_dcache_line((void *)end); end &= ~mask; } /* remaining cachelines only need invalidation */ for (v = begin; v < end; v += linesz) invalidate_dcache_line((void *)v); flush_write_buffer(); }

Contributors

PersonTokensPropCommitsCommitProp
Håvard Skinnemoen7159.66%266.67%
David Brownell4840.34%133.33%
Total119100.00%3100.00%


void clean_dcache_region(void *start, size_t size) { unsigned long v, begin, end, linesz; linesz = boot_cpu_data.dcache.linesz; begin = (unsigned long)start & ~(linesz - 1); end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1); for (v = begin; v < end; v += linesz) clean_dcache_line((void *)v); flush_write_buffer(); }

Contributors

PersonTokensPropCommitsCommitProp
Håvard Skinnemoen94100.00%1100.00%
Total94100.00%1100.00%


void flush_dcache_region(void *start, size_t size) { unsigned long v, begin, end, linesz; linesz = boot_cpu_data.dcache.linesz; begin = (unsigned long)start & ~(linesz - 1); end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1); for (v = begin; v < end; v += linesz) flush_dcache_line((void *)v); flush_write_buffer(); }

Contributors

PersonTokensPropCommitsCommitProp
Håvard Skinnemoen94100.00%1100.00%
Total94100.00%1100.00%


void invalidate_icache_region(void *start, size_t size) { unsigned long v, begin, end, linesz; linesz = boot_cpu_data.icache.linesz; begin = (unsigned long)start & ~(linesz - 1); end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1); for (v = begin; v < end; v += linesz) invalidate_icache_line((void *)v); }

Contributors

PersonTokensPropCommitsCommitProp
Håvard Skinnemoen91100.00%1100.00%
Total91100.00%1100.00%


static inline void __flush_icache_range(unsigned long start, unsigned long end) { unsigned long v, linesz; linesz = boot_cpu_data.dcache.linesz; for (v = start; v < end; v += linesz) { clean_dcache_line((void *)v); invalidate_icache_line((void *)v); } flush_write_buffer(); }

Contributors

PersonTokensPropCommitsCommitProp
Håvard Skinnemoen66100.00%1100.00%
Total66100.00%1100.00%

/* * This one is called after a module has been loaded. */
void flush_icache_range(unsigned long start, unsigned long end) { unsigned long linesz; linesz = boot_cpu_data.dcache.linesz; __flush_icache_range(start & ~(linesz - 1), (end + linesz - 1) & ~(linesz - 1)); }

Contributors

PersonTokensPropCommitsCommitProp
Håvard Skinnemoen52100.00%1100.00%
Total52100.00%1100.00%

EXPORT_SYMBOL(flush_icache_range); /* * This one is called from __do_fault() and do_swap_page(). */
void flush_icache_page(struct vm_area_struct *vma, struct page *page) { if (vma->vm_flags & VM_EXEC) { void *v = page_address(page); __flush_icache_range((unsigned long)v, (unsigned long)v + PAGE_SIZE); } }

Contributors

PersonTokensPropCommitsCommitProp
Håvard Skinnemoen51100.00%2100.00%
Total51100.00%2100.00%


asmlinkage int sys_cacheflush(int operation, void __user *addr, size_t len) { int ret; if (len > CACHEFLUSH_MAX_LEN) { ret = -EPERM; if (!capable(CAP_SYS_ADMIN)) goto out; } ret = -EFAULT; if (!access_ok(VERIFY_WRITE, addr, len)) goto out; switch (operation) { case CACHE_IFLUSH: flush_icache_range((unsigned long)addr, (unsigned long)addr + len); ret = 0; break; default: ret = -EINVAL; } out: return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Håvard Skinnemoen106100.00%1100.00%
Total106100.00%1100.00%


void copy_to_user_page(struct vm_area_struct *vma, struct page *page, unsigned long vaddr, void *dst, const void *src, unsigned long len) { memcpy(dst, src, len); if (vma->vm_flags & VM_EXEC) flush_icache_range((unsigned long)dst, (unsigned long)dst + len); }

Contributors

PersonTokensPropCommitsCommitProp
Håvard Skinnemoen66100.00%1100.00%
Total66100.00%1100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Håvard Skinnemoen71592.50%444.44%
David Brownell486.21%111.11%
Chen Gang S50.65%111.11%
Jaswinder Singh Rajput30.39%111.11%
Ryota Ozaki10.13%111.11%
Linus Torvalds10.13%111.11%
Total773100.00%9100.00%
Directory: arch/avr32/mm
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.