0001
0002
0003
0004
0005
0006
0007 #ifndef _NOLIBC_ARCH_I386_H
0008 #define _NOLIBC_ARCH_I386_H
0009
0010
0011 #define O_RDONLY 0
0012 #define O_WRONLY 1
0013 #define O_RDWR 2
0014 #define O_CREAT 0x40
0015 #define O_EXCL 0x80
0016 #define O_NOCTTY 0x100
0017 #define O_TRUNC 0x200
0018 #define O_APPEND 0x400
0019 #define O_NONBLOCK 0x800
0020 #define O_DIRECTORY 0x10000
0021
0022
0023
0024
0025 struct sys_stat_struct {
0026 unsigned long st_dev;
0027 unsigned long st_ino;
0028 unsigned short st_mode;
0029 unsigned short st_nlink;
0030 unsigned short st_uid;
0031 unsigned short st_gid;
0032
0033 unsigned long st_rdev;
0034 unsigned long st_size;
0035 unsigned long st_blksize;
0036 unsigned long st_blocks;
0037
0038 unsigned long st_atime;
0039 unsigned long st_atime_nsec;
0040 unsigned long st_mtime;
0041 unsigned long st_mtime_nsec;
0042
0043 unsigned long st_ctime;
0044 unsigned long st_ctime_nsec;
0045 unsigned long __unused[2];
0046 };
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064 #define __ARCH_WANT_SYS_OLD_SELECT
0065
0066 #define my_syscall0(num) \
0067 ({ \
0068 long _ret; \
0069 register long _num __asm__ ("eax") = (num); \
0070 \
0071 __asm__ volatile ( \
0072 "int $0x80\n" \
0073 : "=a" (_ret) \
0074 : "0"(_num) \
0075 : "memory", "cc" \
0076 ); \
0077 _ret; \
0078 })
0079
0080 #define my_syscall1(num, arg1) \
0081 ({ \
0082 long _ret; \
0083 register long _num __asm__ ("eax") = (num); \
0084 register long _arg1 __asm__ ("ebx") = (long)(arg1); \
0085 \
0086 __asm__ volatile ( \
0087 "int $0x80\n" \
0088 : "=a" (_ret) \
0089 : "r"(_arg1), \
0090 "0"(_num) \
0091 : "memory", "cc" \
0092 ); \
0093 _ret; \
0094 })
0095
0096 #define my_syscall2(num, arg1, arg2) \
0097 ({ \
0098 long _ret; \
0099 register long _num __asm__ ("eax") = (num); \
0100 register long _arg1 __asm__ ("ebx") = (long)(arg1); \
0101 register long _arg2 __asm__ ("ecx") = (long)(arg2); \
0102 \
0103 __asm__ volatile ( \
0104 "int $0x80\n" \
0105 : "=a" (_ret) \
0106 : "r"(_arg1), "r"(_arg2), \
0107 "0"(_num) \
0108 : "memory", "cc" \
0109 ); \
0110 _ret; \
0111 })
0112
0113 #define my_syscall3(num, arg1, arg2, arg3) \
0114 ({ \
0115 long _ret; \
0116 register long _num __asm__ ("eax") = (num); \
0117 register long _arg1 __asm__ ("ebx") = (long)(arg1); \
0118 register long _arg2 __asm__ ("ecx") = (long)(arg2); \
0119 register long _arg3 __asm__ ("edx") = (long)(arg3); \
0120 \
0121 __asm__ volatile ( \
0122 "int $0x80\n" \
0123 : "=a" (_ret) \
0124 : "r"(_arg1), "r"(_arg2), "r"(_arg3), \
0125 "0"(_num) \
0126 : "memory", "cc" \
0127 ); \
0128 _ret; \
0129 })
0130
0131 #define my_syscall4(num, arg1, arg2, arg3, arg4) \
0132 ({ \
0133 long _ret; \
0134 register long _num __asm__ ("eax") = (num); \
0135 register long _arg1 __asm__ ("ebx") = (long)(arg1); \
0136 register long _arg2 __asm__ ("ecx") = (long)(arg2); \
0137 register long _arg3 __asm__ ("edx") = (long)(arg3); \
0138 register long _arg4 __asm__ ("esi") = (long)(arg4); \
0139 \
0140 __asm__ volatile ( \
0141 "int $0x80\n" \
0142 : "=a" (_ret) \
0143 : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), \
0144 "0"(_num) \
0145 : "memory", "cc" \
0146 ); \
0147 _ret; \
0148 })
0149
0150 #define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) \
0151 ({ \
0152 long _ret; \
0153 register long _num __asm__ ("eax") = (num); \
0154 register long _arg1 __asm__ ("ebx") = (long)(arg1); \
0155 register long _arg2 __asm__ ("ecx") = (long)(arg2); \
0156 register long _arg3 __asm__ ("edx") = (long)(arg3); \
0157 register long _arg4 __asm__ ("esi") = (long)(arg4); \
0158 register long _arg5 __asm__ ("edi") = (long)(arg5); \
0159 \
0160 __asm__ volatile ( \
0161 "int $0x80\n" \
0162 : "=a" (_ret) \
0163 : "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \
0164 "0"(_num) \
0165 : "memory", "cc" \
0166 ); \
0167 _ret; \
0168 })
0169
0170 #define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6) \
0171 ({ \
0172 long _eax = (long)(num); \
0173 long _arg6 = (long)(arg6); \
0174 __asm__ volatile ( \
0175 "pushl %[_arg6]\n\t" \
0176 "pushl %%ebp\n\t" \
0177 "movl 4(%%esp),%%ebp\n\t" \
0178 "int $0x80\n\t" \
0179 "popl %%ebp\n\t" \
0180 "addl $4,%%esp\n\t" \
0181 : "+a"(_eax) \
0182 : "b"(arg1), \
0183 "c"(arg2), \
0184 "d"(arg3), \
0185 "S"(arg4), \
0186 "D"(arg5), \
0187 [_arg6]"m"(_arg6) \
0188 : "memory", "cc" \
0189 ); \
0190 _eax; \
0191 })
0192
0193
0194
0195
0196
0197
0198
0199
0200 __asm__ (".section .text\n"
0201 ".weak _start\n"
0202 "_start:\n"
0203 "pop %eax\n"
0204 "mov %esp, %ebx\n"
0205 "lea 4(%ebx,%eax,4),%ecx\n"
0206 "xor %ebp, %ebp\n"
0207 "and $-16, %esp\n"
0208 "sub $4, %esp\n"
0209 "push %ecx\n"
0210 "push %ebx\n"
0211 "push %eax\n"
0212 "call main\n"
0213 "mov %eax, %ebx\n"
0214 "movl $1, %eax\n"
0215 "int $0x80\n"
0216 "hlt\n"
0217 "");
0218
0219 #endif