Subversion Repositories Kolibri OS

Rev

Rev 1066 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
854 serge 1
 
2
 
2971 Serge 3
#define LOAD_BASE       0x00100000
4
5
897 serge 6
 
2971 Serge 7
 
1066 serge 8
#define master_tab      (page_tabs+(page_tabs>>10))
897 serge 9
 
928 serge 10
#define sel_tss         0x08
897 serge 11
 
928 serge 12
#define sel_os_stack    0x10
897 serge 13
 
928 serge 14
15
#define sel_app_code    0x23
16
 
17
18
#define sel_srv_code    0x31
19
 
20
21
22
 
23
 
1066 serge 24
 
25
26
 
27
 
854 serge 28
#define CALLER ((addr_t) __builtin_return_address(0))
29
 
30
extern void panic_printf(char *fmt, ...) __attribute__((noreturn));
31
 
32
#ifdef CONFIG_DEBUG
33
 
34
# define panic(format, ...) \
35
 
36
		__FILE__, __LINE__, ##__VA_ARGS__);
37
38
#	define ASSERT(expr) \
39
 
40
			panic("assertion failed (%s), caller=%p\n", #expr, CALLER); \
41
		}
42
43
#define DBG(format,...) printf(format,##__VA_ARGS__)
862 serge 44
 
45
#else
46
 
854 serge 47
#	define panic(format, ...) \
862 serge 48
 
854 serge 49
50
# define ASSERT(expr)
51
 
52
# define DBG(format,...)
862 serge 53
 
54
# define PANIC(expr)   \
55
 
888 serge 56
         panic_printf("Kernel panic in %s() at %s:%u: " \
57
                      "assertion failed (%s)",__func__ ,__FILE__,__LINE__, \
58
                       #expr); \
59
      };
60
61
#endif
62
 
854 serge 63
64
 
65
 
66
    eflags_t tmp;
67
	asm volatile (
2971 Serge 68
    "pushfl\n\t"
854 serge 69
    "popl %0\n\t"
886 serge 70
    "cli\n"
71
    : "=r" (tmp));
2971 Serge 72
    return tmp;
928 serge 73
}
2971 Serge 74
854 serge 75
static inline void safe_sti(eflags_t efl)
76
 
77
	asm volatile (
78
    "pushl %0\n\t"
79
    "popfl\n"
886 serge 80
    : : "r" (efl));
81
}
1066 serge 82
854 serge 83
static inline index_t fnzb(u32_t arg)
859 serge 84
 
1066 serge 85
    count_t n;
859 serge 86
    asm volatile (
2971 Serge 87
    "xorl %0, %0 \n\t"
928 serge 88
    "bsr %1, %0"
89
    :"=&r"(n) :"r"(arg) );
2971 Serge 90
	return n;
928 serge 91
}
859 serge 92
93
static inline index_t _bsf(u32_t arg)
94
 
1066 serge 95
    count_t n;
859 serge 96
    asm volatile (
2971 Serge 97
    "xorl %0, %0 \n\t"
928 serge 98
    "bsf %1, %0"
99
    :"=&r" (n) :"r"(arg));
2971 Serge 100
	return n;
928 serge 101
}
859 serge 102
103
static inline void _bts(u32_t *data, count_t val)
104
 
105
    asm volatile (
106
    "bts %0, %1 \n\t"
928 serge 107
    ::"g"(data), "r"(val):"cc");
108
}
109
859 serge 110
extern inline void _btr(u32_t *data, count_t val)
111
 
889 serge 112
    asm volatile (
859 serge 113
    "btr %0, %1 \n\t"
928 serge 114
    ::"g"(data), "r"(val):"cc");
115
}
116
859 serge 117
extern inline void* load_file(const char *path, size_t *size)
889 serge 118
 
119
     void* retval;
120
     size_t tmp;
121
122
     __asm__ __volatile__ (
123
 
124
     "call _load_file@4     \n\t"
125
     :"=eax" (retval), "=ebx"(tmp)
126
     :"a" (path) );
127
128
     if(size)
129
 
130
     return retval;
131
};
132
133
134
 
135
 
928 serge 136
  ipc_start       dd ?
137
  ipc_size    dd ?
138
  event_mask      dd ?
139
  debugger_slot   dd ?
140
          dd ?
141
  keyboard_mode   db ?
142
          db 3   dup(?)
143
  dir_table       dd ?
144
  dbg_event_mem   dd ?
145
  dbg_regs:
146
  dbg_regs.dr0    dd ?
147
  dbg_regs.dr1    dd ?
148
  dbg_regs.dr2    dd ?
149
  dbg_regs.dr3    dd ?
150
  dbg_regs.dr7    dd ?
151
  wnd_caption     dd ?
152
  wnd_clientbox   BOX
153
*/
154
155
//extern __fastcall void* load_file(const char *path, size_t *size);
156
 
889 serge 157
928 serge 158
 
159
 
160
    u32_t    edi;
161
    u32_t    esi;
162
    u32_t    ebp;
163
    u32_t    tmp;                    // esp
164
    u32_t    ebx;
165
    u32_t    edx;
166
    u32_t    ecx;
167
    u32_t    eax;
168
    addr_t   retaddr;
169
    addr_t   eip;
170
    u32_t    cs;
171
    u32_t    eflags;
172
    addr_t   esp;
173
    u32_t    ss;                    // 14*4
174
175
    u32_t    tid;                   // thread id
176
 
177
178
    addr_t   pdir;                  //
179
 
180
    u32_t    thr_flags;             // process is runnable only if zero
181
 
182
    int      ticks_left;            // number of scheduling ticks left */
183
 
184
185
    u32_t    user_time;             // user time in ticks
186
 
187
188
}thr_t;
189
 
190
#define EFL_IF      0x0200
191
 
192
#define EFL_IOPL2   0x2000
193
#define EFL_IOPL3   0x3000
194
195
typedef struct
996 serge 196
 
197
  u32_t      handle;
198
  u32_t      io_code;
199
  void       *input;
200
  int        inp_size;
201
  void       *output;
202
  int        out_size;
203
}ioctl_t;
204
205
206
 
207
 
1066 serge 208
    u32_t code;
996 serge 209
    union
210
    {
211
        struct                          /* window event    */
212
        {
213
            u32_t  win;                 /* window handle   */
214
            u32_t  val1;
2971 Serge 215
            u32_t  val2;
216
            u16_t  x;                   /* cursor x        */
217
            u16_t  y;                   /* cursor y        */
218
            u32_t  unused;
219
        };
220
1066 serge 221
        struct                          /* realtime io     */
996 serge 222
 
223
            u32_t  sender;              /* service handler */
224
            u32_t  stream;              /* io stream id, if present  */
2971 Serge 225
            addr_t offset;
226
            size_t size;
227
        };
228
996 serge 229
        struct                          /* ipc event       */
230
 
231
            u32_t  sender;
232
            u32_t   io_code;
2971 Serge 233
            addr_t *input;
996 serge 234
            size_t  inp_size;
235
            addr_t *output;
236
            size_t  out_size;
237
        };
238
    };
239
}event_t;
240
241
242
 
243