Remove the limitation of only handling small major and minor numbers.
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
---
tools/include/nolibc/sys/sysmacros.h | 8 ++++----
tools/testing/selftests/nolibc/nolibc-test.c | 3 +++
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/tools/include/nolibc/sys/sysmacros.h b/tools/include/nolibc/sys/sysmacros.h
index eb4a9197546e..fbae09b934dc 100644
--- a/tools/include/nolibc/sys/sysmacros.h
+++ b/tools/include/nolibc/sys/sysmacros.h
@@ -12,20 +12,20 @@
#include "../std.h"
-/* WARNING, it only deals with the 4096 first majors and 256 first minors */
static __inline__ dev_t makedev(unsigned int maj, unsigned int min)
{
- return ((maj & 0xfff) << 8) | (min & 0xff);
+ return (((dev_t)maj & ~0xfff) << 32) | ((maj & 0xfff) << 8) |
+ (((dev_t)min & ~0xff) << 12) | (min & 0xff);
}
static __inline__ unsigned int major(dev_t dev)
{
- return (dev >> 8) & 0xfff;
+ return ((dev >> 32) & ~0xfff) | ((dev >> 8) & 0xfff);
}
static __inline__ unsigned int minor(dev_t dev)
{
- return dev & 0xff;
+ return ((dev >> 12) & ~0xff) | (dev & 0xff);
}
#endif /* _NOLIBC_SYS_SYSMACROS_H */
diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c
index 90c206a77f1e..900e09c0abac 100644
--- a/tools/testing/selftests/nolibc/nolibc-test.c
+++ b/tools/testing/selftests/nolibc/nolibc-test.c
@@ -1684,6 +1684,9 @@ int run_stdlib(int min, int max)
CASE_TEST(makedev); EXPECT_EQ(1, makedev(0x12, 0x34), 0x1234); break;
CASE_TEST(major); EXPECT_EQ(1, major(0x1234), 0x12); break;
CASE_TEST(minor); EXPECT_EQ(1, minor(0x1234), 0x34); break;
+ CASE_TEST(makedev_big); EXPECT_EQ(1, makedev(0x11223344, 0x55667788), 0x1122355667734488); break;
+ CASE_TEST(major_big); EXPECT_EQ(1, major(0x1122355667734488), 0x11223344); break;
+ CASE_TEST(minor_big); EXPECT_EQ(1, minor(0x1122355667734488), 0x55667788); break;
case __LINE__:
return ret; /* must be last */
--
2.53.0