shithub: front

Download patch

ref: 67ce0bdcd2da7045d3d758561b2d4ac55ee35b69
parent: 0b55cdfae55072346aae7a5757e2d12a3ede3800
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Aug 6 19:20:00 EDT 2025

kernel: leave alignment hole between TEXT and DATA unmapped

We used to pad the TEXT segment to 2MB aligment on amd64,
resulting in the segment going beyond its image file range.

This broke the new pio(), resulting in an endless loop of
zero length reads of the image.

Instead, we now round segment sizes to our effective
page size only and leave the alignment "hole" unmapped.

--- a/sys/src/9/port/fault.c
+++ b/sys/src/9/port/fault.c
@@ -62,9 +62,7 @@
 		if(ask == 0) ask = BY2PG;
 
 		daddr = soff & -ask;
-		if(daddr >= s->flen)
-			ask = 0;
-		else if((daddr+ask) > s->flen)
+		if(daddr+ask > s->flen)
 			ask = s->flen-daddr;
 		paddr = s->base + daddr;
 		daddr += s->fstart;
--- a/sys/src/9/port/sysproc.c
+++ b/sys/src/9/port/sysproc.c
@@ -333,7 +333,7 @@
 	char *a, *e, *charp, *file;
 	int i, n, indir;
 	ulong magic, ssize, nargs, nbytes;
-	uintptr t, d, b, entry, text, data, bss, bssend, tstk, align;
+	uintptr entry, text, data, bss, adata, abss, tstk, align;
 	Segment *s, *ts;
 	Image *img;
 	Tos *tos;
@@ -427,15 +427,13 @@
 		cclose(tc);
 	}
 
-	t = (text+align) & ~align;
+	adata = (text+align) & ~align;
 	text -= UTZERO;
 	data = beswal(u.ehdr.data);
 	bss = beswal(u.ehdr.bss);
 	align = BY2PG-1;
-	d = (t + data + align) & ~align;
-	bssend = t + data + bss;
-	b = (bssend + align) & ~align;
-	if(t >= (USTKTOP-USTKSIZE) || d >= (USTKTOP-USTKSIZE) || b >= (USTKTOP-USTKSIZE))
+	abss = (adata + data + align) & ~align;
+	if(adata >= (USTKTOP-USTKSIZE) || abss >= (USTKTOP-USTKSIZE) || (abss+PGROUND(bss)) >= (USTKTOP-USTKSIZE))
 		error(Ebadexec);
 
 	/*
@@ -561,7 +559,7 @@
 
 	/* Attach text segment */
 	/* attachimage returns a locked cache image */
-	img = attachimage(tc, (b-t)>>PGSHIFT);
+	img = attachimage(tc, (PGROUND(text)+PGROUND(data))>>PGSHIFT);
 	if((ts = img->s) != nil && ts->flen == text){
 		assert(ts->image == img);
 		incref(ts);
@@ -571,7 +569,7 @@
 			putimage(img);
 			nexterror();
 		}
-		ts = newseg(SG_TEXT | SG_RONLY, UTZERO, (t-UTZERO)>>PGSHIFT);
+		ts = newseg(SG_TEXT | SG_RONLY, UTZERO, PGROUND(text)>>PGSHIFT);
 		ts->flushme = 1;
 		ts->image = img;
 		ts->fstart = 0;
@@ -610,7 +608,7 @@
 	up->seg[TSEG] = ts;
 
 	/* Data. Shared. */
-	s = newseg(SG_DATA, t, (d-t)>>PGSHIFT);
+	s = newseg(SG_DATA, adata, PGROUND(data)>>PGSHIFT);
 	s->image = img;
 	s->fstart = text;
 	s->flen = data;
@@ -618,7 +616,7 @@
 	up->seg[DSEG] = s;
 
 	/* BSS. Zero fill on demand */
-	up->seg[BSEG] = newseg(SG_BSS, d, (b-d)>>PGSHIFT);
+	up->seg[BSEG] = newseg(SG_BSS, abss, PGROUND(bss)>>PGSHIFT);
 
 	/*
 	 * Move the stack
--