Вот кто мне может объяснить.

Имеем такие объявления:
Код:
#define S_IFMT		0170000	/* file type mask */
#define S_IFLNK		0110000	/* symbolic link */
#define S_IFREG		0100000	/* or just 000000, regular */
#define S_IFBLK 	0060000	/* block special */
#define S_IFDIR 	0040000	/* directory */
#define S_IFCHR 	0020000	/* character special */
#define S_IFPIPE 	0010000	/* pipe */
и в коде ядра всякую целочисленную арифметику (в основном арифметические & | и сравнения) между этими константами (казалось бы не влезающими в int16) и 16bit int.
За каким-то хреном в итоге в ASM:
S_IFREG=0100000 транслируется в 0x8000,
S_IFPIPE=0010000 транслируется в 0x1000
S_IFCHR=0020000 транслируется в 0x2000
и т.п.
Теряюсь в догадках. Какого хека?