1*cfee5d1bSkurt /* OpenBSD host-specific hook definitions.
2*cfee5d1bSkurt Copyright (C) 2005 Free Software Foundation, Inc.
3*cfee5d1bSkurt
4*cfee5d1bSkurt This file is part of GCC.
5*cfee5d1bSkurt
6*cfee5d1bSkurt GCC is free software; you can redistribute it and/or modify it
7*cfee5d1bSkurt under the terms of the GNU General Public License as published
8*cfee5d1bSkurt by the Free Software Foundation; either version 2, or (at your
9*cfee5d1bSkurt option) any later version.
10*cfee5d1bSkurt
11*cfee5d1bSkurt GCC is distributed in the hope that it will be useful, but WITHOUT
12*cfee5d1bSkurt ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13*cfee5d1bSkurt or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14*cfee5d1bSkurt License for more details.
15*cfee5d1bSkurt
16*cfee5d1bSkurt You should have received a copy of the GNU General Public License
17*cfee5d1bSkurt along with GCC; see the file COPYING. If not, write to the
18*cfee5d1bSkurt Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19*cfee5d1bSkurt MA 02111-1307, USA. */
20*cfee5d1bSkurt
21*cfee5d1bSkurt #include <limits.h>
22*cfee5d1bSkurt #include <unistd.h>
23*cfee5d1bSkurt
24*cfee5d1bSkurt #include "config.h"
25*cfee5d1bSkurt #include "system.h"
26*cfee5d1bSkurt #include "coretypes.h"
27*cfee5d1bSkurt #include "hosthooks.h"
28*cfee5d1bSkurt #include "hosthooks-def.h"
29*cfee5d1bSkurt
30*cfee5d1bSkurt #undef HOST_HOOKS_GT_PCH_GET_ADDRESS
31*cfee5d1bSkurt #define HOST_HOOKS_GT_PCH_GET_ADDRESS openbsd_gt_pch_get_address
32*cfee5d1bSkurt
33*cfee5d1bSkurt #undef HOST_HOOKS_GT_PCH_USE_ADDRESS
34*cfee5d1bSkurt #define HOST_HOOKS_GT_PCH_USE_ADDRESS openbsd_gt_pch_use_address
35*cfee5d1bSkurt
36*cfee5d1bSkurt /* Return the address of the PCH address space, if the PCH will fit in it. */
37*cfee5d1bSkurt
38*cfee5d1bSkurt void *
openbsd_gt_pch_get_address(size_t size,int fd ATTRIBUTE_UNUSED)39*cfee5d1bSkurt openbsd_gt_pch_get_address (size_t size, int fd ATTRIBUTE_UNUSED)
40*cfee5d1bSkurt {
41*cfee5d1bSkurt void *base, *addr;
42*cfee5d1bSkurt size_t pgsz;
43*cfee5d1bSkurt
44*cfee5d1bSkurt if (size > INT_MAX)
45*cfee5d1bSkurt return NULL;
46*cfee5d1bSkurt
47*cfee5d1bSkurt pgsz = sysconf(_SC_PAGESIZE);
48*cfee5d1bSkurt if (pgsz == (size_t)-1)
49*cfee5d1bSkurt return NULL;
50*cfee5d1bSkurt
51*cfee5d1bSkurt base = sbrk(0);
52*cfee5d1bSkurt
53*cfee5d1bSkurt /* round up to nearest page */
54*cfee5d1bSkurt base = (void *)(((long)base + (pgsz - 1)) & ~(pgsz - 1));
55*cfee5d1bSkurt if (brk(base) != 0)
56*cfee5d1bSkurt return NULL;
57*cfee5d1bSkurt
58*cfee5d1bSkurt /* attempt to allocate size */
59*cfee5d1bSkurt addr = sbrk(size);
60*cfee5d1bSkurt if (addr == (void *)-1)
61*cfee5d1bSkurt return NULL;
62*cfee5d1bSkurt
63*cfee5d1bSkurt /* deallocate the memory */
64*cfee5d1bSkurt if (brk(base) != 0)
65*cfee5d1bSkurt return NULL;
66*cfee5d1bSkurt
67*cfee5d1bSkurt /* confirm addr is as expected */
68*cfee5d1bSkurt if (addr != base)
69*cfee5d1bSkurt return NULL;
70*cfee5d1bSkurt
71*cfee5d1bSkurt return base;
72*cfee5d1bSkurt }
73*cfee5d1bSkurt
74*cfee5d1bSkurt /* Return 0 if we can reserve the PCH address space. */
75*cfee5d1bSkurt
76*cfee5d1bSkurt int
openbsd_gt_pch_use_address(void * base,size_t size,int fd ATTRIBUTE_UNUSED,size_t off ATTRIBUTE_UNUSED)77*cfee5d1bSkurt openbsd_gt_pch_use_address (void *base, size_t size, int fd ATTRIBUTE_UNUSED, size_t off ATTRIBUTE_UNUSED)
78*cfee5d1bSkurt {
79*cfee5d1bSkurt void *addr;
80*cfee5d1bSkurt
81*cfee5d1bSkurt if (size == 0)
82*cfee5d1bSkurt return -1;
83*cfee5d1bSkurt
84*cfee5d1bSkurt /* sanity check base address */
85*cfee5d1bSkurt addr = sbrk(0);
86*cfee5d1bSkurt if (addr == (void *)-1 || base < addr)
87*cfee5d1bSkurt return -1;
88*cfee5d1bSkurt
89*cfee5d1bSkurt /* set base for sbrk */
90*cfee5d1bSkurt if (brk(base) != 0)
91*cfee5d1bSkurt return -1;
92*cfee5d1bSkurt
93*cfee5d1bSkurt /* attempt to get the memory */
94*cfee5d1bSkurt addr = sbrk(size);
95*cfee5d1bSkurt if (addr == (void *)-1)
96*cfee5d1bSkurt return -1;
97*cfee5d1bSkurt
98*cfee5d1bSkurt /* sanity check the result */
99*cfee5d1bSkurt if (addr != base) {
100*cfee5d1bSkurt brk(base);
101*cfee5d1bSkurt return -1;
102*cfee5d1bSkurt }
103*cfee5d1bSkurt
104*cfee5d1bSkurt return 0;
105*cfee5d1bSkurt }
106*cfee5d1bSkurt
107*cfee5d1bSkurt const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER;
108