xref: /haiku/src/system/libroot/os/arch/x86/compatibility.c (revision 899e0ef82b5624ace2ccfa5f5a58c8ebee54aaef)
1 /*
2  * Copyright 2005-2008, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 //!	This file includes some known R5 syscalls
7 
8 #include <errno.h>
9 #include <sys/resource.h>
10 #include <sys/stat.h>
11 
12 #include <SupportDefs.h>
13 #include <errno_private.h>
14 #include <fs_info.h>
15 #include <fs_volume.h>
16 #include <PCI.h>
17 
18 #include <syscalls.h>
19 
20 
21 int _kset_mon_limit_(int num);
22 int _kset_fd_limit_(int num);
23 int _klock_node_(int fd);
24 int _kunlock_node_(int fd);
25 int _kget_cpu_state_(int cpuNum);
26 int _kset_cpu_state_(int cpuNum, int state);
27 int _kstatfs_(dev_t device, void *whatever, int fd, const char *path, fs_info *info);
28 int mount(const char *filesystem, const char *where, const char *device, ulong flags,
29 	void *parms, int len);
30 int unmount(const char *path);
31 long get_nth_pci_info(long index, pci_info *info);
32 
33 
34 int
35 _kset_mon_limit_(int num)
36 {
37 	struct rlimit rl;
38 	if (num < 1)
39 		return EINVAL;
40 	rl.rlim_cur = num;
41 	rl.rlim_max = RLIM_SAVED_MAX;
42 	if (setrlimit(RLIMIT_NOVMON, &rl) < 0)
43 		return errno;
44 	return B_OK;
45 }
46 
47 
48 int
49 _kset_fd_limit_(int num)
50 {
51 	struct rlimit rl;
52 	if (num < 1)
53 		return EINVAL;
54 	rl.rlim_cur = num;
55 	rl.rlim_max = RLIM_SAVED_MAX;
56 	if (setrlimit(RLIMIT_NOFILE, &rl) < 0)
57 		return errno;
58 	return B_OK;
59 }
60 
61 
62 int
63 _klock_node_(int fd)
64 {
65 	return _kern_lock_node(fd);
66 }
67 
68 
69 int
70 _kunlock_node_(int fd)
71 {
72 	return _kern_unlock_node(fd);
73 }
74 
75 
76 int
77 _kget_cpu_state_(int cpuNum)
78 {
79 	return _kern_cpu_enabled(cpuNum);
80 }
81 
82 
83 int
84 _kset_cpu_state_(int cpuNum, int state)
85 {
86 	return _kern_set_cpu_enabled(cpuNum, state != 0);
87 }
88 
89 
90 int
91 _kstatfs_(dev_t device, void *whatever, int fd, const char *path, fs_info *info)
92 {
93 	if (device < 0) {
94 		if (fd >= 0) {
95 			struct stat stat;
96 			if (fstat(fd, &stat) < 0)
97 				return -1;
98 
99 			device = stat.st_dev;
100 		} else if (path != NULL)
101 			device = dev_for_path(path);
102 	}
103 	if (device < 0)
104 		return B_ERROR;
105 
106 	return fs_stat_dev(device, info);
107 }
108 
109 
110 int
111 mount(const char *filesystem, const char *where, const char *device, ulong flags,
112 	void *parms, int len)
113 {
114 	status_t err;
115 	uint32 mountFlags = 0;
116 
117 	if (flags & 1)
118 		mountFlags |= B_MOUNT_READ_ONLY;
119 
120 	// we don't support passing (binary) parameters
121 	if (parms != NULL || len != 0 || flags & ~1) {
122 		__set_errno(B_BAD_VALUE);
123 		return -1;
124 	}
125 
126 	err = fs_mount_volume(where, device, filesystem, mountFlags, NULL);
127 	if (err < B_OK) {
128 		__set_errno(err);
129 		return -1;
130 	}
131 	return 0;
132 }
133 
134 
135 int
136 unmount(const char *path)
137 {
138 	status_t err;
139 
140 	err = fs_unmount_volume(path, 0);
141 	if (err < B_OK) {
142 		__set_errno(err);
143 		return -1;
144 	}
145 	return 0;
146 }
147 
148 
149 long get_nth_pci_info(long index,pci_info *info)
150 {
151 	return B_ERROR;
152 }
153