shithub: riscv

Download patch

ref: f1aa66eb2adfb93167a54902d8e5fe30ab6bea98
parent: 64d062acdb9ed71cc251c69a08ee03e6c5bfcaaf
author: cinap_lenrek <[email protected]>
date: Sun Oct 29 11:18:08 EDT 2023

imx8: use generic 9/arm64/fpu.c

--- a/sys/src/9/imx8/fpu.c
+++ /dev/null
@@ -1,289 +1,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-
-#include "ureg.h"
-#include "sysreg.h"
-
-/* libc */
-extern ulong getfcr(void);
-extern void setfcr(ulong fcr);
-extern ulong getfsr(void);
-extern void setfsr(ulong fsr);
-
-static FPsave fpsave0;
-
-static void
-fpsave(FPsave *p)
-{
-	p->control = getfcr();
-	p->status = getfsr();
-	fpsaveregs(p->regs);
-	fpoff();
-}
-
-static void
-fprestore(FPsave *p)
-{
-	fpon();
-	setfcr(p->control);
-	setfsr(p->status);
-	fploadregs(p->regs);
-}
-
-static void
-fpinit(void)
-{
-	fprestore(&fpsave0);
-}
-
-void
-fpuinit(void)
-{
-	m->fpstate = FPinit;
-	m->fpsave = nil;
-	fpoff();
-}
-
-static FPsave*
-fpalloc(void)
-{
-	FPsave *save;
-
-	while((save = mallocalign(sizeof(FPsave), 16, 0, 0)) == nil){
-		spllo();
-		resrcwait("no memory for FPsave");
-		splhi();
-	}
-	return save;
-}
-
-static void
-fpfree(FPsave *save)
-{
-	free(save);
-}
-
-
-/*
- *  Protect or save FPU state and setup new state
- *  (lazily in the case of user process) for the kernel.
- *  All syscalls, traps and interrupts (except mathtrap()!)
- *  are handled between fpukenter() and fpukexit(),
- *  so they can use floating point and vector instructions.
- */
-FPsave*
-fpukenter(Ureg*)
-{
-	if(up == nil){
-		switch(m->fpstate){
-		case FPactive:
-			fpsave(m->fpsave);
-			/* wet floor */
-		case FPinactive:
-			m->fpstate = FPinit;
-			return m->fpsave;
-		}
-		return nil;
-	}
-
-	switch(up->fpstate){
-	case FPactive:
-		up->fpstate = FPprotected;
-		fpoff();
-		/* wet floor */
-	case FPprotected:
-		return nil;
-	}
-
-	switch(up->kfpstate){
-	case FPactive:
-		fpsave(up->kfpsave);
-		/* wet floor */
-	case FPinactive:
-		up->kfpstate = FPinit;
-		return up->kfpsave;
-	}
-	return nil;
-}
-
-void
-fpukexit(Ureg *ureg, FPsave *save)
-{
-	if(up == nil){
-		switch(m->fpstate){
-		case FPactive:
-			fpoff();
-			/* wet floor */
-		case FPinactive:
-			fpfree(m->fpsave);
-			m->fpstate = FPinit;
-		}
-		m->fpsave = save;
-		if(save != nil)
-			m->fpstate = FPinactive;
-		return;
-	}
-
-	if(up->fpstate == FPprotected){
-		if(userureg(ureg)){
-			up->fpstate = FPactive;
-			fpon();
-		}
-		return;
-	}
-
-	switch(up->kfpstate){
-	case FPactive:
-		fpoff();
-		/* wet floor */
-	case FPinactive:
-		fpfree(up->kfpsave);
-		up->kfpstate = FPinit;
-	}
-	up->kfpsave = save;
-	if(save != nil)
-		up->kfpstate = FPinactive;
-}
-
-void
-fpuprocsetup(Proc *p)
-{
-	p->fpstate = FPinit;
-}
-
-void
-fpuprocfork(Proc *p)
-{
-	int s;
-
-	s = splhi();
-	switch(up->fpstate & ~FPillegal){
-	case FPprotected:
-		fpon();
-		/* wet floor */
-	case FPactive:
-		fpsave(up->fpsave);
-		up->fpstate = FPinactive;
-		/* wet floor */
-	case FPinactive:
-		if(p->fpsave == nil)
-			p->fpsave = fpalloc();
-		memmove(p->fpsave, up->fpsave, sizeof(FPsave));
-		p->fpstate = FPinactive;
-	}
-	splx(s);
-}
-
-void
-fpuprocsave(Proc *p)
-{
-	if(p->state == Moribund){
-		if(p->fpstate == FPactive || p->kfpstate == FPactive)
-			fpoff();
-		fpfree(p->fpsave);
-		fpfree(p->kfpsave);
-		p->fpsave = p->kfpsave = nil;
-		p->fpstate = p->kfpstate = FPinit;
-		return;
-	}
-	if(p->kfpstate == FPactive){
-		fpsave(p->kfpsave);
-		p->kfpstate = FPinactive;
-		return;
-	}
-	if(p->fpstate == FPprotected)
-		fpon();
-	else if(p->fpstate != FPactive)
-		return;
-	fpsave(p->fpsave);
-	p->fpstate = FPinactive;
-}
-
-void
-fpuprocrestore(Proc*)
-{
-	/*
-	 * when the scheduler switches,
-	 * we can discard its fp state.
-	 */
-	switch(m->fpstate){
-	case FPactive:
-		fpoff();
-		/* wet floor */
-	case FPinactive:
-		fpfree(m->fpsave);
-		m->fpsave = nil;
-		m->fpstate = FPinit;
-	}
-}
-
-void
-mathtrap(Ureg *ureg)
-{
-	if(!userureg(ureg)){
-		if(up == nil){
-			switch(m->fpstate){
-			case FPinit:
-				m->fpsave = fpalloc();
-				m->fpstate = FPactive;
-				fpinit();
-				break;
-			case FPinactive:
-				fprestore(m->fpsave);
-				m->fpstate = FPactive;
-				break;
-			default:
-				panic("floating point error in irq");
-			}
-			return;
-		}
-
-		if(up->fpstate == FPprotected){
-			fpon();
-			fpsave(up->fpsave);
-			up->fpstate = FPinactive;
-		}
-
-		switch(up->kfpstate){
-		case FPinit:
-			up->kfpsave = fpalloc();
-			up->kfpstate = FPactive;
-			fpinit();
-			break;
-		case FPinactive:
-			fprestore(up->kfpsave);
-			up->kfpstate = FPactive;
-			break;
-		default:
-			panic("floating point error in trap");
-		}
-		return;
-	}
-
-	if(up->fpstate & FPillegal){
-		postnote(up, 1, "sys: floating point in note handler", NDebug);
-		return;
-	}
-	switch(up->fpstate){
-	case FPinit:
-		if(up->fpsave == nil)
-			up->fpsave = fpalloc();
-		up->fpstate = FPactive;
-		fpinit();
-		break;
-	case FPinactive:
-		fprestore(up->fpsave);
-		up->fpstate = FPactive;
-		break;
-	case FPprotected:
-		up->fpstate = FPactive;
-		fpon();
-		break;
-	case FPactive:
-		postnote(up, 1, "sys: floating point error", NDebug);
-		break;
-	}
-}
--- a/sys/src/9/imx8/mkfile
+++ b/sys/src/9/imx8/mkfile
@@ -83,6 +83,10 @@
 /$objtype/$p$CONF:D: $p$CONF $p$CONF.u
 	cp -x $p$CONF $p$CONF.u /$objtype/
 
+ARM64FILES=`{../port/mkfilelist ../arm64}
+^($ARM64FILES)\.$O:R:	'../arm64/\1.c'
+	$CC $CFLAGS -I. -. ../arm64/$stem1.c
+
 <../boot/bootmkfile
 <../port/portmkfile
 <|../port/mkbootrules $CONF