Subversion Repositories Kolibri OS

Rev

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