Changeset 18e0a6c in mainline for arch/ia32/include/asm.h


Ignore:
Timestamp:
2005-06-09T23:43:45Z (20 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
74df77d
Parents:
d896525
Message:

Implement several assembler functions in gcc's asm notation instead of in .s or .S file.
Gain both better speed and size.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/ia32/include/asm.h

    rd896525 r18e0a6c  
    3838
    3939extern void paging_on(void);
    40 extern __address cpu_read_dba(void);
    41 extern void cpu_write_dba(__address dba);
    42 
    43 extern __address cpu_read_cr2(void);
    4440
    4541extern void interrupt_handlers(void);
     
    5551extern void enable_l_apic_in_msr(void);
    5652
    57 extern void halt_cpu(void);
    58 extern void cpu_sleep(void);
     53/** Halt CPU
     54 *
     55 * Halt the current CPU until interrupt event.
     56 */
     57static inline void cpu_halt(void) { __asm__("hlt"); };
     58static inline void cpu_sleep(void) { __asm__("hlt"); };
    5959
    60 static inline void write_dr0(__u32 v);
    61 static inline __u32 read_dr0(void);
     60/** Read CR2
     61 *
     62 * Return value in CR2
     63 *
     64 * @return Value read.
     65 */
     66static inline __u32 read_cr2(void) { __u32 v; __asm__ volatile ("movl %%cr2,%0" : "=r" (v)); return v; }
    6267
    63 inline void write_dr0(__u32 v) { __asm__ volatile ("movl %0,%%dr0\n" : : "r" (v)); }
    64 inline __u32 read_dr0(void) { __u32 v; __asm__ volatile ("movl %%dr0,%0" : "=r" (v)); return v; }
     68/** Write CR3
     69 *
     70 * Write value to CR3.
     71 *
     72 * @param v Value to be written.
     73 */
     74static inline void write_cr3(__u32 v) { __asm__ volatile ("movl %0,%%cr3\n" : : "r" (v)); }
     75
     76/** Read CR3
     77 *
     78 * Return value in CR3
     79 *
     80 * @return Value read.
     81 */
     82static inline __u32 read_cr3(void) { __u32 v; __asm__ volatile ("movl %%cr3,%0" : "=r" (v)); return v; }
     83
     84/** Write DR0
     85 *
     86 * Write value to DR0.
     87 *
     88 * @param v Value to be written.
     89 */
     90static inline void write_dr0(__u32 v) { __asm__ volatile ("movl %0,%%dr0\n" : : "r" (v)); }
     91
     92/** Read DR0
     93 *
     94 * Return value in DR0
     95 *
     96 * @return Value read.
     97 */
     98static inline __u32 read_dr0(void) { __u32 v; __asm__ volatile ("movl %%dr0,%0" : "=r" (v)); return v; }
     99
     100/** Set priority level low
     101 *
     102 * Enable interrupts and return previous
     103 * value of EFLAGS.
     104 */
     105static inline pri_t cpu_priority_low(void) {
     106        pri_t v;
     107        __asm__ volatile (
     108                "pushf\n"
     109                "popl %0\n"
     110                "sti\n"
     111                : "=r" (v)
     112        );
     113        return v;
     114}
     115
     116/** Set priority level high
     117 *
     118 * Disable interrupts and return previous
     119 * value of EFLAGS.
     120 */
     121static inline pri_t cpu_priority_high(void) {
     122        pri_t v;
     123        __asm__ volatile (
     124                "pushf\n"
     125                "popl %0\n"
     126                "cli\n"
     127                : "=r" (v)
     128        );
     129        return v;
     130}
     131
     132/** Restore priority level
     133 *
     134 * Restore EFLAGS.
     135 */
     136static inline void cpu_priority_restore(pri_t pri) {
     137        __asm__ volatile (
     138                "pushl %0\n"
     139                "popf\n"
     140                : : "r" (pri)
     141        );
     142}
     143
     144/** Return raw priority level
     145 *
     146 * Return EFLAFS.
     147 */
     148static inline pri_t cpu_priority_read(void) {
     149        pri_t v;
     150        __asm__ volatile (
     151                "pushf\n"
     152                "popl %0\n"
     153                : "=r" (v)
     154        );
     155        return v;
     156}
    65157
    66158#endif
Note: See TracChangeset for help on using the changeset viewer.