shithub: riscv

Download patch

ref: 760e539811001f569fc24d988e72c0b1eef81cd7
parent: 1dc5f9222a0cddf21414f20731d791ffc0416599
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun May 21 12:36:11 EDT 2017

kernel: avoid panic with segio and SG_FAULT segments

the problem is that segio doesnt check segment attributes
and it can't really in case of SG_FAULT which can be
inherited from pseg and toggle at any time.

so instead of returning -1 from fault into the fault$cputype
handler which then panics when fault happend kernel mode,
we jump into segio's waserror() block just like in the
demand load i/o error case (faulterror()).

--- a/sys/src/9/port/devproc.c
+++ b/sys/src/9/port/devproc.c
@@ -921,7 +921,7 @@
 				continue;
 			j += sprint(statbuf+j, "%-6s %c%c %8p %8p %4ld\n",
 				sname[sg->type&SG_TYPE],
-				sg->type&SG_RONLY ? 'R' : ' ',
+				sg->type&SG_FAULT ? 'F' : (sg->type&SG_RONLY ? 'R' : ' '),
 				sg->profile ? 'P' : ' ',
 				sg->base, sg->top, sg->ref);
 		}
--- a/sys/src/9/port/fault.c
+++ b/sys/src/9/port/fault.c
@@ -40,6 +40,8 @@
 		if((attr & SG_FAULT) != 0 || !read && (attr & SG_RONLY) != 0) {
 			qunlock(s);
 			up->psstate = sps;
+			if(up->kp && up->nerrlab)	/* for segio */
+				error(Eio);
 			return -1;
 		}