• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (c) 2017 The strace developers.
3   * All rights reserved.
4   *
5   * Redistribution and use in source and binary forms, with or without
6   * modification, are permitted provided that the following conditions
7   * are met:
8   * 1. Redistributions of source code must retain the above copyright
9   *    notice, this list of conditions and the following disclaimer.
10   * 2. Redistributions in binary form must reproduce the above copyright
11   *    notice, this list of conditions and the following disclaimer in the
12   *    documentation and/or other materials provided with the distribution.
13   * 3. The name of the author may not be used to endorse or promote products
14   *    derived from this software without specific prior written permission.
15   *
16   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19   * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26   */
27  
28  #include "tests.h"
29  #include <stdint.h>
30  #include <stdio.h>
31  #include <sys/mman.h>
32  #include <unistd.h>
33  #include <asm/unistd.h>
34  
35  static const char *errstr;
36  
37  static long
k_madvise(const kernel_ulong_t addr,const kernel_ulong_t length,const kernel_ulong_t advice)38  k_madvise(const kernel_ulong_t addr,
39  	  const kernel_ulong_t length,
40  	  const kernel_ulong_t advice)
41  {
42  	long rc = syscall(__NR_madvise, addr, length, advice);
43  	errstr = sprintrc(rc);
44  	return rc;
45  }
46  
47  int
main(void)48  main(void)
49  {
50  	const unsigned long length = get_page_size();
51  	void *const addr = tail_alloc(length);
52  	long rc;
53  
54  	rc = madvise(addr, length, MADV_NORMAL);
55  	printf("madvise(%p, %lu, MADV_NORMAL) = %s\n",
56  	       addr, length, sprintrc(rc));
57  
58  	static const kernel_ulong_t advice =
59  		(kernel_ulong_t) 0xfacefeed00000000ULL | MADV_RANDOM;
60  	rc = k_madvise((uintptr_t) addr, length, advice);
61  	printf("madvise(%p, %lu, MADV_RANDOM) = %s\n",
62  	       addr, length, sprintrc(rc));
63  
64  	static const kernel_ulong_t bogus_length =
65  		(kernel_ulong_t) 0xfffffffffffffaceULL;
66  	rc = k_madvise(0, bogus_length, MADV_SEQUENTIAL);
67  	printf("madvise(NULL, %llu, MADV_SEQUENTIAL) = %s\n",
68  	       (unsigned long long) bogus_length, sprintrc(rc));
69  
70  	if (F8ILL_KULONG_SUPPORTED) {
71  		rc = k_madvise(f8ill_ptr_to_kulong(addr), length, MADV_NORMAL);
72  		printf("madvise(%#llx, %lu, MADV_NORMAL) = %s\n",
73  		       (unsigned long long) f8ill_ptr_to_kulong(addr),
74  		       length, sprintrc(rc));
75  	}
76  
77  	puts("+++ exited with 0 +++");
78  	return 0;
79  }
80