Subversion Repositories Kolibri OS

Rev

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

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