* gnu/packages/linux.scm (libaio)[arguments]: When building for riscv64-linux add a patch to account for undeclared behavior. [native-inputs]: Add patch file, patch. * gnu/packages/patches/libaio-riscv-test5.patch: New file. * gnu/local.mk (dist_patch_DATA): Register it.
		
			
				
	
	
		
			47 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| https://pagure.io/libaio/pull-request/23
 | |
| 
 | |
| From f68c69b6cbc1260a6034997d5f146e3d0a197ed8 Mon Sep 17 00:00:00 2001
 | |
| From: Xiongchuan Tan <xc-tan@outlook.com>
 | |
| Date: Jun 28 2022 15:53:38 +0000
 | |
| Subject: As of June 28th, 2022, the RISC-V spec[1] reserves the PTE permission bit
 | |
| 
 | |
| combination of "write+!read", and the kernel would have incoherent behavior in
 | |
| the last test case of "harness/cases/5.t". Since it leads to undefined behavior,
 | |
| until further spec update, this test case should be disabled for RISC-V.
 | |
| 
 | |
| A patch to disallow such permission in mmap() can be found here[2].
 | |
| 
 | |
| [1]: https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf
 | |
| [2]: https://www.spinics.net/lists/kernel/msg4412421.html
 | |
| 
 | |
| ---
 | |
| 
 | |
| diff --git a/harness/cases/5.t b/harness/cases/5.t
 | |
| index b0a7c56..8d6c959 100644
 | |
| --- a/harness/cases/5.t
 | |
| +++ b/harness/cases/5.t
 | |
| @@ -37,6 +37,14 @@ int test_main(void)
 | |
|  	status |= attempt_rw(rwfd, buf, SIZE,  0,  READ, -EFAULT);
 | |
|  
 | |
|  	res = munmap(buf, page_size);			assert(res == 0);
 | |
| +
 | |
| +	/* As of  June 28th, 2022,  the RISC-V spec Volume 2 Section 4.3
 | |
| +	 * version "20211203 Privileged Architecture v1.12, Ratified"
 | |
| +	 * reserves the usage of  the PTE permission bit combination  of
 | |
| +	 * "write+!read",   so the next test leads to undefined behavior
 | |
| +	 * and should be disabled. */
 | |
| +#ifndef __riscv
 | |
| +
 | |
|  	buf = mmap(0, page_size, PROT_WRITE, MAP_SHARED, rwfd, 0);
 | |
|  	assert(buf != (char *)-1);
 | |
|  
 | |
| @@ -48,6 +56,8 @@ int test_main(void)
 | |
|  	status |= attempt_rw(rwfd, buf, SIZE,  0,  READ, SIZE);
 | |
|  	status |= attempt_rw(rwfd, buf, SIZE,  0, WRITE, res);
 | |
|  
 | |
| +#endif
 | |
| +
 | |
|  	return status;
 | |
|  }
 | |
|  
 | |
| 
 |