Date: Fri, 29 May 1998 22:09:08 -0500 (EST) From: "John S. Dyson" <toor@dyson.iquest.net> To: nirva@ishiboo.com (Danny Dulai) Cc: doconnor@gsoft.com.au, freebsd-multimedia@FreeBSD.ORG, freebsd-current@FreeBSD.ORG Subject: Re: Fastvid.. Message-ID: <199805300309.WAA05164@dyson.iquest.net> In-Reply-To: <19980527232341.65268@bleep.ishiboo.com> from Danny Dulai at "May 27, 98 11:23:41 pm"
next in thread | previous in thread | raw e-mail | index | archive | help
> Quoting Daniel O'Connor (doconnor@gsoft.com.au):
> >
> > The speedup factor is 1.89, mmm :)
>
>
> The vm_map.h problems are solved by #including <sys/lock.h>, but the
> MOD_SYSCALL on line 103 and the problem at line 234 I do not understand.
>
> Does anyone have copy of this module for -current?
>
This is a copy of the original code that I submitted to someone who
cleaned it up (I am sorry that I forgot who actually took ownership.)
This code works on my display adaptor, and compiles under -current.
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/exec.h>
#include <sys/sysent.h>
#include <sys/lkm.h>
#include <sys/lock.h>
#include <sys/proc.h>
#include <vm/vm.h>
#include <vm/vm_prot.h>
#include <vm/vm_page.h>
#include <vm/vm_extern.h>
#include <vm/vm_map.h>
#include <vm/pmap.h>
#define I586_CPU /* XXX for i586_ctr_freq */
#include <machine/clock.h>
static int load(struct lkm_table *lkmtp, int cmd);
static int mycall(struct proc *p, void *uap, int *retval);
extern int newsyscall_mod(struct lkm_table *lkmtp, int cmd, int ver);
static int unload(struct lkm_table *lkmtp, int cmd);
vm_offset_t contigaddr;
struct proc *curproc;
static struct sysent newent = {
0, mycall /* # of args, function pointer*/
};
MOD_SYSCALL(newsyscall_mod, -1, &newent);
static struct {
int address;
char *name;
} ranges[] = {
{0x250, "MTRRfix64K_00000"},
{0x258, "MTRRfix16K_80000"},
{0x259, "MTRRfix16K_A0000"},
{0x268, "MTRRfix4K_C0000"},
{0x269, "MTRRfix4K_C8000"},
{0x26a, "MTRRfix4K_D0000"},
{0x26b, "MTRRfix4K_D8000"},
{0x26c, "MTRRfix4K_E0000"},
{0x26d, "MTRRfix4K_E8000"},
{0x26e, "MTRRfix4K_F0000"},
{0x26f, "MTRRfix4K_F8000"},
{0x0, NULL}
};
static int load(struct lkm_table *lkmtp, int cmd)
{
int i;
long long base;
long long mask;
vm_offset_t kernaddr;
struct proc *otherp;
int tbase, tmask, type;
unsigned long long newval;
pmap_t pmap;
base = rdmsr(0x2ff);
tbase = base & 0xfff;
printf("default: type: 0x%x\n", tbase);
wrmsr(0x259, 0x0101010101010101ULL);
/*
* Add in an Memory type register entry here, after
* reviewing the output of your X server.
* My video ram is at phys addr 0xfe000000, size 8MB
*/
#define VIDPHYSADDR (0xfe000000)
#define VIDPHYSSIZE (0x800000)
#define MSRINDEX 5
base = VIDPHYSADDR | 0x1;
mask = (long long) (0xfffffffffLL - ((long) VIDPHYSSIZE - 1)) | (long long) 0x800;
wrmsr(0x200 + MSRINDEX * 2, base);
wrmsr(0x201 + MSRINDEX * 2, mask);
for(i=0;i<8;i++) {
int basehi, baselo;
int maskhi, masklo;
base = rdmsr(0x200 + i * 2);
basehi = (unsigned long long) base >> 32;
baselo = (unsigned long long) base & 0xffffffffL;
type = base & 0xff;
base >>= 12;
tbase = base;
mask = rdmsr(0x201 + i * 2);
if ((mask & 0x800) == 0)
continue;
maskhi = (unsigned long long) mask >> 32;
masklo = (unsigned long long) mask & 0xffffffffL;
mask >>= 12;
tmask = mask;
printf("%d: type: %d, addr: 0x%x000, mask: 0x%x000\n basehi: 0x%8.8x, baselo: 0x%8.8x\n maskhi: 0x%8.8x, masklo: 0x%8.8x\n",
i, type, tbase, tmask, basehi, baselo, maskhi, masklo);
}
for(i=0;ranges[i].address;i++) {
int maskhi, masklo;
mask = rdmsr(ranges[i].address);
maskhi = (unsigned long long) mask >> 32;
masklo = (unsigned long long) mask & 0xffffffffL;
printf("%s: 0x%8.8x 0x%8.8x\n",
ranges[i].name, maskhi, masklo);
}
tbase = rdmsr(0x1e0);
printf("BKUPTMPDR6: %x\n", tbase);
tbase = rdmsr(0x2a);
printf("BKUPTMPDR6: %x\n", tbase);
pmap = &curproc->p_vmspace->vm_pmap;
for(i=0;i<1024;i++) {
unsigned entry;
entry = (unsigned) curproc->p_vmspace->vm_pmap.pm_pdir[i];
if (entry & PG_PS) {
printf("4MB page: 0x%x(%x)\n", entry, i << 22);
}
}
otherp = pfind(153);
if (otherp) {
for(i=0;i<1024;i++) {
unsigned entry;
entry = (unsigned) otherp->p_vmspace->vm_pmap.pm_pdir[i];
if (entry & PG_PS) {
printf("4MB page: 0x%x(%x)\n", entry, i << 22);
}
}
}
return 0;
}
static int mycall(struct proc *p, void *uap, int *retval)
{
return ENODEV;
}
int newsyscall_mod(struct lkm_table *lkmtp, int cmd, int ver)
{
#if 0
DISPATCH(lkmtp, cmd, ver, load, unload, lkm_nullcmd)
#endif
MOD_DISPATCH(newsyscall_mod,
lkmtp, cmd, ver, load, unload, lkm_nullcmd)
#if 0
MOD_DISPATCH(newsyscall_mod, lkmtp, cmd, ver,
newsyscall_load, lkm_nullcmd, lkm_nullcmd)
#endif
}
static int unload(struct lkm_table *lkmtp, int cmd)
{
return 0;
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199805300309.WAA05164>
