Subversion Repositories Kolibri OS

Rev

Rev 897 | Rev 996 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. #define OS_BASE     0xE0000000
  3. #define IMAGE_BASE  0xE0100000
  4. #define LOAD_BASE   0x00100000
  5.  
  6.  
  7. #define page_tabs   0xDDC00000
  8.  
  9. #define master_tab      (page_tabs+(page_tabs>>10))
  10.  
  11. #define sel_tss         0x08
  12.  
  13. #define sel_os_stack    0x10
  14. #define sel_os_code     0x18
  15.  
  16. #define sel_app_code    0x23
  17. #define sel_app_data    0x2B
  18.  
  19. #define sel_srv_code    0x31
  20. #define sel_srv_stack   0x39
  21.  
  22.  
  23. void printf (const char *format, ...);
  24.  
  25. #define CALLER ((addr_t) __builtin_return_address(0))
  26.  
  27. extern void panic_printf(char *fmt, ...) __attribute__((noreturn));
  28.  
  29. #ifdef CONFIG_DEBUG
  30.  
  31. # define panic(format, ...) \
  32.                 panic_printf("Kernel panic in %s() at %s:%u: " format, __func__, \
  33.                 __FILE__, __LINE__, ##__VA_ARGS__);
  34.  
  35. #       define ASSERT(expr) \
  36.                 if (!(expr)) { \
  37.                         panic("assertion failed (%s), caller=%p\n", #expr, CALLER); \
  38.                 }
  39.  
  40. #define DBG(format,...) printf(format,##__VA_ARGS__)
  41.  
  42. #else
  43.  
  44. #       define panic(format, ...) \
  45.                 panic_printf("Kernel panic: " format, ##__VA_ARGS__);
  46.  
  47. # define ASSERT(expr)
  48.  
  49. # define DBG(format,...)
  50.  
  51. # define PANIC(expr)   \
  52.       if (!(expr)) {   \
  53.          panic_printf("Kernel panic in %s() at %s:%u: " \
  54.                       "assertion failed (%s)",__func__ ,__FILE__,__LINE__, \
  55.                        #expr); \
  56.       };
  57.  
  58. #endif
  59.  
  60.  
  61. static inline eflags_t safe_cli(void)
  62. {
  63.   eflags_t tmp;
  64.         asm volatile (
  65.     "pushfl\n\t"
  66.     "popl %0\n\t"
  67.                 "cli\n"
  68.     : "=r" (tmp));
  69.   return tmp;
  70. }
  71.  
  72. static inline void safe_sti(eflags_t efl)
  73. {
  74.         asm volatile (
  75.     "pushl %0\n\t"
  76.     "popfl\n"
  77.     : : "r" (efl)
  78.         );
  79. }
  80.  
  81. static inline count_t fnzb(u32_t arg)
  82. {
  83.   count_t n;
  84.     asm volatile (
  85.     "xorl %0, %0 \n\t"
  86.                 "bsr %1, %0"
  87.     :"=&r"(n) :"r"(arg) );
  88.         return n;
  89. }
  90.  
  91. static inline count_t _bsf(u32_t arg)
  92. {
  93.   count_t n;
  94.     asm volatile (
  95.     "xorl %0, %0 \n\t"
  96.                 "bsf %1, %0"
  97.     :"=&r" (n) :"r"(arg));
  98.         return n;
  99. }
  100.  
  101. static inline void _bts(u32_t *data, count_t val)
  102. {
  103.     asm volatile (
  104.     "bts %0, %1 \n\t"
  105.     ::"g"(data), "r"(val):"cc");
  106. }
  107.  
  108. extern inline void _btr(u32_t *data, count_t val)
  109. {
  110.     asm volatile (
  111.     "btr %0, %1 \n\t"
  112.     ::"g"(data), "r"(val):"cc");
  113. }
  114.  
  115. extern inline void* load_file(const char *path, size_t *size)
  116. {
  117.      void* retval;
  118.      size_t tmp;
  119.  
  120.      __asm__ __volatile__ (
  121.      "pushl %%eax           \n\t"
  122.      "call _load_file@4     \n\t"
  123.      :"=eax" (retval), "=ebx"(tmp)
  124.      :"a" (path) );
  125.  
  126.      if(size)
  127.         *size = tmp;
  128.      return retval;
  129. };
  130.  
  131.  
  132. /*                            reemain part
  133.   saved_box       BOX
  134.   ipc_start       dd ?
  135.   ipc_size    dd ?
  136.   event_mask      dd ?
  137.   debugger_slot   dd ?
  138.           dd ?
  139.   keyboard_mode   db ?
  140.           db 3   dup(?)
  141.   dir_table       dd ?
  142.   dbg_event_mem   dd ?
  143.   dbg_regs:
  144.   dbg_regs.dr0    dd ?
  145.   dbg_regs.dr1    dd ?
  146.   dbg_regs.dr2    dd ?
  147.   dbg_regs.dr3    dd ?
  148.   dbg_regs.dr7    dd ?
  149.   wnd_caption     dd ?
  150.   wnd_clientbox   BOX
  151. */
  152.  
  153. //extern __fastcall void* load_file(const char *path, size_t *size);
  154.  
  155.  
  156. typedef struct
  157. {
  158.     u32_t    edi;
  159.     u32_t    esi;
  160.     u32_t    ebp;
  161.     u32_t    tmp;                    // esp
  162.     u32_t    ebx;
  163.     u32_t    edx;
  164.     u32_t    ecx;
  165.     u32_t    eax;
  166.     addr_t   retaddr;
  167.     addr_t   eip;
  168.     u32_t    cs;
  169.     u32_t    eflags;
  170.     addr_t   esp;
  171.     u32_t    ss;                    // 14*4
  172.  
  173.     u32_t    tid;                   // thread id
  174.     u32_t    slot;                  // thread slot
  175.  
  176.     addr_t   pdir;                  //
  177.  
  178.     u32_t    thr_flags;             // process is runnable only if zero
  179.  
  180.     int      ticks_left;            // number of scheduling ticks left */
  181.     int      quantum_size;          // quantum size in ticks */
  182.  
  183.     u32_t    user_time;             // user time in ticks
  184.     u32_t    sys_time;              // sys time in ticks
  185.  
  186. }thr_t;
  187.  
  188. #define EFL_IF      0x0200
  189. #define EFL_IOPL1   0x1000
  190. #define EFL_IOPL2   0x2000
  191. #define EFL_IOPL3   0x3000
  192.