@@ -99,6 +99,16 @@ static int sys_madvise(void *start, size_t len, int types)
9999 return sret ;
100100}
101101
102+ static void * sys_mremap (void * addr , size_t old_len , size_t new_len ,
103+ unsigned long flags , void * new_addr )
104+ {
105+ void * sret ;
106+
107+ errno = 0 ;
108+ sret = (void * ) syscall (__NR_mremap , addr , old_len , new_len , flags , new_addr );
109+ return sret ;
110+ }
111+
102112static int sys_pkey_alloc (unsigned long flags , unsigned long init_val )
103113{
104114 int ret = syscall (__NR_pkey_alloc , flags , init_val );
@@ -1104,12 +1114,12 @@ static void test_seal_mremap_shrink(bool seal)
11041114 }
11051115
11061116 /* shrink from 4 pages to 2 pages. */
1107- ret2 = mremap (ptr , size , 2 * page_size , 0 , 0 );
1117+ ret2 = sys_mremap (ptr , size , 2 * page_size , 0 , 0 );
11081118 if (seal ) {
1109- FAIL_TEST_IF_FALSE (ret2 == MAP_FAILED );
1119+ FAIL_TEST_IF_FALSE (ret2 == ( void * ) MAP_FAILED );
11101120 FAIL_TEST_IF_FALSE (errno == EPERM );
11111121 } else {
1112- FAIL_TEST_IF_FALSE (ret2 != MAP_FAILED );
1122+ FAIL_TEST_IF_FALSE (ret2 != ( void * ) MAP_FAILED );
11131123
11141124 }
11151125
@@ -1136,7 +1146,7 @@ static void test_seal_mremap_expand(bool seal)
11361146 }
11371147
11381148 /* expand from 2 page to 4 pages. */
1139- ret2 = mremap (ptr , 2 * page_size , 4 * page_size , 0 , 0 );
1149+ ret2 = sys_mremap (ptr , 2 * page_size , 4 * page_size , 0 , 0 );
11401150 if (seal ) {
11411151 FAIL_TEST_IF_FALSE (ret2 == MAP_FAILED );
11421152 FAIL_TEST_IF_FALSE (errno == EPERM );
@@ -1169,7 +1179,7 @@ static void test_seal_mremap_move(bool seal)
11691179 }
11701180
11711181 /* move from ptr to fixed address. */
1172- ret2 = mremap (ptr , size , size , MREMAP_MAYMOVE | MREMAP_FIXED , newPtr );
1182+ ret2 = sys_mremap (ptr , size , size , MREMAP_MAYMOVE | MREMAP_FIXED , newPtr );
11731183 if (seal ) {
11741184 FAIL_TEST_IF_FALSE (ret2 == MAP_FAILED );
11751185 FAIL_TEST_IF_FALSE (errno == EPERM );
@@ -1288,7 +1298,7 @@ static void test_seal_mremap_shrink_fixed(bool seal)
12881298 }
12891299
12901300 /* mremap to move and shrink to fixed address */
1291- ret2 = mremap (ptr , size , 2 * page_size , MREMAP_MAYMOVE | MREMAP_FIXED ,
1301+ ret2 = sys_mremap (ptr , size , 2 * page_size , MREMAP_MAYMOVE | MREMAP_FIXED ,
12921302 newAddr );
12931303 if (seal ) {
12941304 FAIL_TEST_IF_FALSE (ret2 == MAP_FAILED );
@@ -1319,7 +1329,7 @@ static void test_seal_mremap_expand_fixed(bool seal)
13191329 }
13201330
13211331 /* mremap to move and expand to fixed address */
1322- ret2 = mremap (ptr , page_size , size , MREMAP_MAYMOVE | MREMAP_FIXED ,
1332+ ret2 = sys_mremap (ptr , page_size , size , MREMAP_MAYMOVE | MREMAP_FIXED ,
13231333 newAddr );
13241334 if (seal ) {
13251335 FAIL_TEST_IF_FALSE (ret2 == MAP_FAILED );
@@ -1350,7 +1360,7 @@ static void test_seal_mremap_move_fixed(bool seal)
13501360 }
13511361
13521362 /* mremap to move to fixed address */
1353- ret2 = mremap (ptr , size , size , MREMAP_MAYMOVE | MREMAP_FIXED , newAddr );
1363+ ret2 = sys_mremap (ptr , size , size , MREMAP_MAYMOVE | MREMAP_FIXED , newAddr );
13541364 if (seal ) {
13551365 FAIL_TEST_IF_FALSE (ret2 == MAP_FAILED );
13561366 FAIL_TEST_IF_FALSE (errno == EPERM );
@@ -1379,14 +1389,13 @@ static void test_seal_mremap_move_fixed_zero(bool seal)
13791389 /*
13801390 * MREMAP_FIXED can move the mapping to zero address
13811391 */
1382- ret2 = mremap (ptr , size , 2 * page_size , MREMAP_MAYMOVE | MREMAP_FIXED ,
1392+ ret2 = sys_mremap (ptr , size , 2 * page_size , MREMAP_MAYMOVE | MREMAP_FIXED ,
13831393 0 );
13841394 if (seal ) {
13851395 FAIL_TEST_IF_FALSE (ret2 == MAP_FAILED );
13861396 FAIL_TEST_IF_FALSE (errno == EPERM );
13871397 } else {
13881398 FAIL_TEST_IF_FALSE (ret2 == 0 );
1389-
13901399 }
13911400
13921401 REPORT_TEST_PASS ();
@@ -1409,21 +1418,21 @@ static void test_seal_mremap_move_dontunmap(bool seal)
14091418 }
14101419
14111420 /* mremap to move, and don't unmap src addr. */
1412- ret2 = mremap (ptr , size , size , MREMAP_MAYMOVE | MREMAP_DONTUNMAP , 0 );
1421+ ret2 = sys_mremap (ptr , size , size , MREMAP_MAYMOVE | MREMAP_DONTUNMAP , 0 );
14131422 if (seal ) {
14141423 FAIL_TEST_IF_FALSE (ret2 == MAP_FAILED );
14151424 FAIL_TEST_IF_FALSE (errno == EPERM );
14161425 } else {
1426+ /* kernel will allocate a new address */
14171427 FAIL_TEST_IF_FALSE (ret2 != MAP_FAILED );
1418-
14191428 }
14201429
14211430 REPORT_TEST_PASS ();
14221431}
14231432
14241433static void test_seal_mremap_move_dontunmap_anyaddr (bool seal )
14251434{
1426- void * ptr ;
1435+ void * ptr , * ptr2 ;
14271436 unsigned long page_size = getpagesize ();
14281437 unsigned long size = 4 * page_size ;
14291438 int ret ;
@@ -1438,24 +1447,30 @@ static void test_seal_mremap_move_dontunmap_anyaddr(bool seal)
14381447 }
14391448
14401449 /*
1441- * The 0xdeaddead should not have effect on dest addr
1442- * when MREMAP_DONTUNMAP is set .
1450+ * The new address is any address that not allocated.
1451+ * use allocate/free to similate that .
14431452 */
1444- ret2 = mremap (ptr , size , size , MREMAP_MAYMOVE | MREMAP_DONTUNMAP ,
1445- 0xdeaddead );
1453+ setup_single_address (size , & ptr2 );
1454+ FAIL_TEST_IF_FALSE (ptr2 != (void * )-1 );
1455+ ret = sys_munmap (ptr2 , size );
1456+ FAIL_TEST_IF_FALSE (!ret );
1457+
1458+ /*
1459+ * remap to any address.
1460+ */
1461+ ret2 = sys_mremap (ptr , size , size , MREMAP_MAYMOVE | MREMAP_DONTUNMAP ,
1462+ (void * ) ptr2 );
14461463 if (seal ) {
14471464 FAIL_TEST_IF_FALSE (ret2 == MAP_FAILED );
14481465 FAIL_TEST_IF_FALSE (errno == EPERM );
14491466 } else {
1450- FAIL_TEST_IF_FALSE (ret2 != MAP_FAILED );
1451- FAIL_TEST_IF_FALSE ((long )ret2 != 0xdeaddead );
1452-
1467+ /* remap success and return ptr2 */
1468+ FAIL_TEST_IF_FALSE (ret2 == ptr2 );
14531469 }
14541470
14551471 REPORT_TEST_PASS ();
14561472}
14571473
1458-
14591474static void test_seal_merge_and_split (void )
14601475{
14611476 void * ptr ;
0 commit comments