[PATCH 5/6] tools/nolibc: handle all major and minor numbers in makedev() and friends

Thomas Weißschuh posted 6 patches 14 hours ago
[PATCH 5/6] tools/nolibc: handle all major and minor numbers in makedev() and friends
Posted by Thomas Weißschuh 14 hours ago
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