Add MD syscalls to sync the icache and to drain the write buffer.

Obtained from:	NetBSD
This commit is contained in:
Olivier Houchard 2004-09-23 21:56:01 +00:00
parent 8e90166a08
commit 371853e562
2 changed files with 113 additions and 1 deletions

View File

@ -43,6 +43,8 @@ __FBSDID("$FreeBSD$");
#include <sys/syscall.h>
#include <sys/sysent.h>
#include <machine/sysarch.h>
#ifndef _SYS_SYSPROTO_H_
struct sysarch_args {
int op;
@ -50,11 +52,55 @@ struct sysarch_args {
};
#endif
/* Prototypes */
static int arm32_sync_icache (struct thread *, void *);
static int arm32_drain_writebuf(struct thread *, void *);
static int
arm32_sync_icache(struct thread *td, void *args)
{
struct arm_sync_icache_args ua;
int error;
if ((error = copyin(args, &ua, sizeof(ua))) != 0)
return (error);
cpu_icache_sync_range(ua.addr, ua.len);
td->td_retval[0] = 0;
return(0);
}
static int
arm32_drain_writebuf(struct thread *td, void *args)
{
/* No args. */
td->td_retval[0] = 0;
cpu_drain_writebuf();
return(0);
}
int
sysarch(td, uap)
struct thread *td;
register struct sysarch_args *uap;
{
return (0);
int error;
switch (uap->op) {
case ARM_SYNC_ICACHE :
error = arm32_sync_icache(td, uap->parms);
break;
case ARM_DRAIN_WRITEBUF :
error = arm32_drain_writebuf(td, uap->parms);
break;
default:
error = EINVAL;
break;
}
return (error);
}

66
sys/arm/include/sysarch.h Normal file
View File

@ -0,0 +1,66 @@
/* $NetBSD: sysarch.h,v 1.5 2003/09/11 09:40:12 kleink Exp $ */
/*
* Copyright (c) 1996-1997 Mark Brinicombe.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Mark Brinicombe.
* 4. The name of the company nor the name of the author may be used to
* endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/* $FreeBSD$ */
#ifndef _ARM_SYSARCH_H_
#define _ARM_SYSARCH_H_
#include <sys/cdefs.h>
/*
* Pickup definition of uintptr_t
*/
#include <sys/stdint.h>
/*
* Architecture specific syscalls (arm)
*/
#define ARM_SYNC_ICACHE 0
#define ARM_DRAIN_WRITEBUF 1
struct arm_sync_icache_args {
uintptr_t addr; /* Virtual start address */
size_t len; /* Region size */
};
#ifndef _KERNEL
__BEGIN_DECLS
int arm_sync_icache (u_int addr, int len);
int arm_drain_writebuf (void);
__END_DECLS
#endif
#endif /* !_ARM_SYSARCH_H_ */