. = DATA_SEGMENT_ALIGN (0x1000, 0x1000);
.data : { *(.data) }
- .bss : { *(.bss) }
+ .bss : { *(.bss) *(.testEndmem) }
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
#include <string.h>
#include "tests/userprog/boundary.h"
-static char dst[8192];
+/* Together with statements in src/lib/user/user.lds, arranges
+ for the following array to be at the very end of the .bss
+ segment (needed for get_bad_boundary below). */
+static char dst[8192] __attribute__ ((section (".testEndmem,\"aw\",@nobits#")));
/* Returns the beginning of a page. There are at least 2048
modifiable bytes on either side of the pointer returned. */
}
/* Returns an address that is invalid, but the preceding bytes
- * are all valid. Used to position information such that the
- * first byte of the information is valid, but not all the
- * information is valid. */
+ * are all valid (the highest address in the bss segment). Used
+ * to position information such that the first byte of the
+ * information is valid, but not all the information is valid. */
void *
get_bad_boundary (void)
{
char *p = get_bad_boundary () - 1;
*p = 'a';
exec(p);
+
+ /* Note: if this test fails to pass even with the official solutions,
+ it's probably because memory layout has changed and p no longer
+ refers to the proper page boundary. To fix the problem, uncomment
+ the line below to print out the boundary address. In addition,
+ add a printf line in load_segment to print out the address range
+ of each segment. From that, you'll be able to figure out how to
+ modify get_bad_boundary to make things work again. */
+
+ // msg("boundary address: 0x%x", p);
fail ("should have killed process");
}