[BACK]Return to mem_user.c CVS log [TXT][DIR] Up to [Development] / linux-2.6-xfs / arch / um / kernel / skas

File: [Development] / linux-2.6-xfs / arch / um / kernel / skas / Attic / mem_user.c (download)

Revision 1.2, Fri Oct 1 15:10:15 2004 UTC (13 years ago) by nathans.longdrop.melbourne.sgi.com
Branch: MAIN
Changes since 1.1: +21 -11 lines

Upgrade kernel to 2.6.9-rc3 and kdb to 4.4
Merge of 2.6.x-xfs-melb:linux:19628a by kenmcd.

/* 
 * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
 * Licensed under the GPL
 */

#include <errno.h>
#include <sys/mman.h>
#include <sys/ptrace.h>
#include "mem_user.h"
#include "mem.h"
#include "user.h"
#include "os.h"
#include "proc_mm.h"

void map(int fd, unsigned long virt, unsigned long phys, unsigned long len, 
	 int r, int w, int x)
{
	struct proc_mm_op map;
	__u64 offset;
	int prot, n, phys_fd;

	prot = (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | 
		(x ? PROT_EXEC : 0);
	phys_fd = phys_mapping(phys, &offset);

	map = ((struct proc_mm_op) { .op 	= MM_MMAP,
				     .u 	= 
				     { .mmap	= 
				       { .addr 		= virt,
					 .len		= len,
					 .prot		= prot,
					 .flags		= MAP_SHARED | 
					                  MAP_FIXED,
					 .fd		= phys_fd,
					 .offset	= offset
				       } } } );
	n = os_write_file(fd, &map, sizeof(map));
	if(n != sizeof(map)) 
		printk("map : /proc/mm map failed, err = %d\n", -n);
}

int unmap(int fd, void *addr, int len)
{
	struct proc_mm_op unmap;
	int n;

	unmap = ((struct proc_mm_op) { .op 	= MM_MUNMAP,
				       .u 	= 
				       { .munmap	= 
					 { .addr 	= (unsigned long) addr,
					   .len		= len } } } );
	n = os_write_file(fd, &unmap, sizeof(unmap));
	if(n != sizeof(unmap)) {
		if(n < 0)
			return(n);
		else if(n > 0)
			return(-EIO);
	}

	return(0);
}

int protect(int fd, unsigned long addr, unsigned long len, int r, int w, 
	    int x, int must_succeed)
{
	struct proc_mm_op protect;
	int prot, n;

	prot = (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | 
		(x ? PROT_EXEC : 0);

	protect = ((struct proc_mm_op) { .op 	= MM_MPROTECT,
				       .u 	= 
				       { .mprotect	= 
					 { .addr 	= (unsigned long) addr,
					   .len		= len,
					   .prot	= prot } } } );

	n = os_write_file(fd, &protect, sizeof(protect));
	if(n != sizeof(protect)) {
		if(n == 0) return(0);

		if(must_succeed)
			panic("protect failed, err = %d", -n);

		return(-EIO);
	}

	return(0);
}

void before_mem_skas(unsigned long unused)
{
}

/*
 * Overrides for Emacs so that we follow Linus's tabbing style.
 * Emacs will notice this stuff at the end of the file and automatically
 * adjust the settings for this buffer only.  This must remain at the end
 * of the file.
 * ---------------------------------------------------------------------------
 * Local variables:
 * c-file-style: "linux"
 * End:
 */