]>
Commit | Line | Data |
---|---|---|
ada7c492 A |
1 | /* |
2 | * Copyright (c) 2013 Apple Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_LICENSE_HEADER_START@ | |
5 | * | |
6 | * This file contains Original Code and/or Modifications of Original Code | |
7 | * as defined in and that are subject to the Apple Public Source License | |
8 | * Version 2.0 (the 'License'). You may not use this file except in | |
9 | * compliance with the License. Please obtain a copy of the License at | |
10 | * http://www.opensource.apple.com/apsl/ and read it before using this | |
11 | * file. | |
12 | * | |
13 | * The Original Code and all software distributed under the License are | |
14 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
15 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, | |
16 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
17 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. | |
18 | * Please see the License for the specific language governing rights and | |
19 | * limitations under the License. | |
20 | * | |
21 | * @APPLE_LICENSE_HEADER_END@ | |
22 | */ | |
23 | ||
24 | #include <limits.h> | |
25 | #include <stdint.h> | |
26 | #include <stdlib.h> | |
27 | #include <machine/cpu_capabilities.h> | |
28 | ||
29 | #include <_simple.h> | |
30 | ||
31 | #include <platform/string.h> | |
32 | #include <platform/compat.h> | |
33 | ||
34 | __attribute__ ((visibility ("hidden"))) | |
35 | uintptr_t commpage_pfz_base=0; | |
36 | ||
37 | __attribute__ ((visibility ("hidden"))) | |
38 | void | |
39 | __pfz_setup(const char *apple[]) | |
40 | { | |
41 | const char *p = _simple_getenv(apple, "pfz"); | |
42 | if (p != NULL) { | |
43 | const char *q; | |
44 | ||
45 | /* We are given hex starting with 0x */ | |
46 | if (p[0] != '0' || p[1] != 'x') { | |
47 | goto __pfz_setup_clear; | |
48 | } | |
49 | ||
50 | for (q = p + 2; *q; q++) { | |
51 | commpage_pfz_base <<= 4; // *= 16 | |
52 | ||
53 | if ('0' <= *q && *q <= '9') { | |
54 | commpage_pfz_base += *q - '0'; | |
55 | } else if ('a' <= *q && *q <= 'f') { | |
56 | commpage_pfz_base += *q - 'a' + 10; | |
57 | } else if ('A' <= *q && *q <= 'F') { | |
58 | commpage_pfz_base += *q - 'A' + 10; | |
59 | } else { | |
60 | commpage_pfz_base=0; | |
61 | goto __pfz_setup_clear; | |
62 | } | |
63 | } | |
64 | ||
65 | __pfz_setup_clear: | |
66 | bzero((void *)((uintptr_t)p - 4), strlen(p) + 4); | |
67 | } | |
68 | ||
69 | if (commpage_pfz_base == 0) { | |
70 | commpage_pfz_base = _COMM_PAGE_TEXT_START; | |
71 | } | |
72 | } |