Changeset e28175d in mainline for kernel/arch


Ignore:
Timestamp:
2020-03-15T10:44:02Z (6 years ago)
Author:
GitHub <noreply@…>
Parents:
b401b33 (diff), 44dde42 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
git-author:
heiducteam <tristanided@…> (2020-03-15 10:44:02)
git-committer:
GitHub <noreply@…> (2020-03-15 10:44:02)
Message:

Merge pull request #1 from HelenOS/master

sync

Location:
kernel/arch
Files:
5 added
8 deleted
37 edited
5 moved

Legend:

Unmodified
Added
Removed
  • kernel/arch/abs32le/src/abs32le.c

    rb401b33 re28175d  
    126126}
    127127
    128 uintptr_t memcpy_from_uspace(void *dst, const void *uspace_src, size_t size)
     128uintptr_t memcpy_from_uspace(void *dst, uspace_addr_t uspace_src, size_t size)
    129129{
    130130        return 0;
    131131}
    132132
    133 uintptr_t memcpy_to_uspace(void *uspace_dst, const void *src, size_t size)
     133uintptr_t memcpy_to_uspace(uspace_addr_t uspace_dst, const void *src, size_t size)
    134134{
    135135        return 0;
  • kernel/arch/amd64/include/arch/interrupt.h

    rb401b33 re28175d  
    8484#define VECTOR_DEBUG_IPI          (IVT_FREEBASE + 2)
    8585
    86 extern void (*disable_irqs_function)(uint16_t);
    87 extern void (*enable_irqs_function)(uint16_t);
    88 extern void (*eoi_function)(unsigned int);
    89 extern const char *irqs_info;
    90 
    9186extern void interrupt_init(void);
    92 extern void trap_virtual_enable_irqs(uint16_t);
    93 extern void trap_virtual_disable_irqs(uint16_t);
    9487
    9588#endif
  • kernel/arch/amd64/include/arch/mm/page.h

    rb401b33 re28175d  
    3737
    3838#include <arch/mm/frame.h>
    39 #include <trace.h>
    4039
    4140#define PAGE_WIDTH  FRAME_WIDTH
     
    164163#ifndef __ASSEMBLER__
    165164
     165#include <arch/interrupt.h>
    166166#include <mm/mm.h>
    167 #include <arch/interrupt.h>
     167#include <trace.h>
    168168#include <typedefs.h>
    169169
  • kernel/arch/amd64/src/amd64.c

    rb401b33 re28175d  
    6060#include <arch/vreg.h>
    6161#include <arch/kseg.h>
     62#include <genarch/pic/pic_ops.h>
    6263
    6364#ifdef CONFIG_SMP
     
    123124                    (i8259_t *) I8259_PIC1_BASE, IVT_IRQBASE);
    124125
    125                 /*
    126                  * Set the enable/disable IRQs handlers.
    127                  * Set the End-of-Interrupt handler.
    128                  */
    129                 enable_irqs_function = pic_enable_irqs;
    130                 disable_irqs_function = pic_disable_irqs;
    131                 eoi_function = pic_eoi;
    132                 irqs_info = "i8259";
     126                /* Set PIC operations. */
     127                pic_ops = &i8259_pic_ops;
    133128        }
    134129}
     
    209204                        indev_t *kbrd = kbrd_wire(kbrd_instance, sink);
    210205                        i8042_wire(i8042_instance, kbrd);
    211                         trap_virtual_enable_irqs(1 << IRQ_KBD);
    212                         trap_virtual_enable_irqs(1 << IRQ_MOUSE);
     206                        pic_ops->enable_irqs(1 << IRQ_KBD);
     207                        pic_ops->enable_irqs(1 << IRQ_MOUSE);
    213208                }
    214209        }
     
    235230                        indev_t *srln = srln_wire(srln_instance, sink);
    236231                        ns16550_wire(ns16550_instance, srln);
    237                         trap_virtual_enable_irqs(1 << IRQ_NS16550);
     232                        pic_ops->enable_irqs(1 << IRQ_NS16550);
    238233                }
    239234#endif
     
    246241#endif
    247242
    248         if (irqs_info != NULL)
    249                 sysinfo_set_item_val(irqs_info, NULL, true);
     243        sysinfo_set_item_val(pic_ops->get_name(), NULL, true);
    250244}
    251245
  • kernel/arch/amd64/src/debug/stacktrace.c

    rb401b33 re28175d  
    6969bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
    7070{
    71         return !copy_from_uspace((void *) prev,
    72             (uint64_t *) ctx->fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));
     71        return !copy_from_uspace(prev,
     72            ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_FP_PREV, sizeof(*prev));
    7373}
    7474
    7575bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
    7676{
    77         return !copy_from_uspace((void *) ra,
    78             (uint64_t *) ctx->fp + FRAME_OFFSET_RA, sizeof(*ra));
     77        return !copy_from_uspace(ra,
     78            ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_RA, sizeof(*ra));
    7979}
    8080
  • kernel/arch/amd64/src/interrupt.c

    rb401b33 re28175d  
    3838#include <panic.h>
    3939#include <genarch/drivers/i8259/i8259.h>
     40#include <genarch/pic/pic_ops.h>
    4041#include <halt.h>
    4142#include <cpu.h>
     
    5758 * Interrupt and exception dispatching.
    5859 */
    59 
    60 void (*disable_irqs_function)(uint16_t irqmask) = NULL;
    61 void (*enable_irqs_function)(uint16_t irqmask) = NULL;
    62 void (*eoi_function)(unsigned int) = NULL;
    63 const char *irqs_info = NULL;
     60pic_ops_t *pic_ops = NULL;
    6461
    6562void istate_decode(istate_t *istate)
     
    8986            "r14=%0#18" PRIx64 "\tr15=%0#18" PRIx64 "\n",
    9087            istate->r12, istate->r13, istate->r14, istate->r15);
    91 }
    92 
    93 static void trap_virtual_eoi(unsigned int irq)
    94 {
    95         if (eoi_function)
    96                 eoi_function(irq);
    97         else
    98                 panic("No eoi_function.");
    99 
    10088}
    10189
     
    157145static void tlb_shootdown_ipi(unsigned int n, istate_t *istate)
    158146{
    159         trap_virtual_eoi(0);
     147        pic_ops->eoi(0);
    160148        tlb_shootdown_ipi_recv();
    161149}
     
    182170                if (irq->preack) {
    183171                        /* Send EOI before processing the interrupt */
    184                         trap_virtual_eoi(inum);
     172                        pic_ops->eoi(inum);
    185173                        ack = true;
    186174                }
     
    195183
    196184        if (!ack)
    197                 trap_virtual_eoi(inum);
     185                pic_ops->eoi(inum);
    198186}
    199187
     
    201189{
    202190        unsigned int inum = n - IVT_IRQBASE;
    203         if (!pic_is_spurious(inum)) {
     191        if (!pic_ops->is_spurious(inum)) {
    204192                /* This is actually not a spurious IRQ, so proceed as usual. */
    205193                irq_interrupt(n, istate);
    206194                return;
    207195        }
    208         pic_handle_spurious(n);
     196        pic_ops->handle_spurious(n);
    209197#ifdef CONFIG_DEBUG
    210198        log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u", CPU->id,
     
    242230}
    243231
    244 void trap_virtual_enable_irqs(uint16_t irqmask)
    245 {
    246         if (enable_irqs_function)
    247                 enable_irqs_function(irqmask);
    248         else
    249                 panic("No enable_irqs_function.");
    250 }
    251 
    252 void trap_virtual_disable_irqs(uint16_t irqmask)
    253 {
    254         if (disable_irqs_function)
    255                 disable_irqs_function(irqmask);
    256         else
    257                 panic("No disable_irqs_function.");
    258 }
    259 
    260232/** @}
    261233 */
  • kernel/arch/amd64/src/userspace.c

    rb401b33 re28175d  
    6666            "iretq\n"
    6767            :: [udata_des] "i" (GDT_SELECTOR(UDATA_DES) | PL_USER),
    68               [stack_top] "r" ((uint8_t *) kernel_uarg->uspace_stack +
     68              [stack_top] "r" (kernel_uarg->uspace_stack +
    6969              kernel_uarg->uspace_stack_size),
    7070              [rflags] "r" (rflags),
  • kernel/arch/arm32/src/debug/stacktrace.c

    rb401b33 re28175d  
    6868bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
    6969{
    70         return !copy_from_uspace((void *) prev,
    71             (uint32_t *) ctx->fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));
     70        return !copy_from_uspace(prev,
     71            ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_FP_PREV, sizeof(*prev));
    7272}
    7373
    7474bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
    7575{
    76         return !copy_from_uspace((void *) ra,
    77             (uint32_t *) ctx->fp + FRAME_OFFSET_RA, sizeof(*ra));
     76        return !copy_from_uspace(ra,
     77            ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_RA, sizeof(*ra));
    7878}
    7979
  • kernel/arch/arm32/src/userspace.c

    rb401b33 re28175d  
    7171
    7272        /* set first parameter */
    73         ustate.r0 = (uintptr_t) kernel_uarg->uspace_uarg;
     73        ustate.r0 = kernel_uarg->uspace_uarg;
    7474
    7575        /* %r1 is defined to hold pcb_ptr - set it to 0 */
     
    9393
    9494        /* set user stack */
    95         ustate.sp = ((uint32_t) kernel_uarg->uspace_stack) +
     95        ustate.sp = kernel_uarg->uspace_stack +
    9696            kernel_uarg->uspace_stack_size;
    9797
    9898        /* set where uspace execution starts */
    99         ustate.pc = (uintptr_t) kernel_uarg->uspace_entry;
     99        ustate.pc = kernel_uarg->uspace_entry;
    100100
    101101        /* status register in user mode */
  • kernel/arch/arm64/meson.build

    rb401b33 re28175d  
    2727#
    2828
    29 ARCH_SOURCES = \
    30         arch/$(UARCH)/src/entryjmp.S \
    31         arch/$(UARCH)/src/fibril.S \
    32         arch/$(UARCH)/src/stacktrace.c \
    33         arch/$(UARCH)/src/stacktrace_asm.S \
    34         arch/$(UARCH)/src/syscall.c \
    35         arch/$(UARCH)/src/tls.c \
    36         arch/$(UARCH)/src/thread_entry.S
     29arch_src += files(
     30        'src/arm64.c',
     31        'src/asm.S',
     32        'src/context.S',
     33        'src/cpu/cpu.c',
     34        'src/debug/stacktrace.c',
     35        'src/debug/stacktrace_asm.S',
     36        'src/exception.c',
     37        'src/fpu.S',
     38        'src/fpu_context.c',
     39        'src/interrupt.c',
     40        'src/machine_func.c',
     41        'src/mm/as.c',
     42        'src/mm/frame.c',
     43        'src/mm/km.c',
     44        'src/mm/page.c',
     45        'src/mm/tlb.c',
     46        'src/smc.c',
     47        'src/smp/ipi.c',
     48        'src/smp/smp.c',
     49        'src/start.S',
     50)
    3751
    38 ARCH_AUTOCHECK_HEADERS = \
    39         arch/$(UARCH)/include/libarch/fibril_context.h
     52if MACHINE == 'virt'
     53        arch_src += files('src/mach/virt/virt.c')
     54endif
     55
     56_check_headers = [
     57        'include/arch/context_struct.h',
     58        'include/arch/fpu_context_struct.h',
     59        'include/arch/istate_struct.h',
     60]
     61
     62foreach h : _check_headers
     63        arch_src += [ autocheck.process(h) ]
     64endforeach
  • kernel/arch/arm64/src/arm64.c

    rb401b33 re28175d  
    156156
    157157        /* Set program entry. */
    158         ELR_EL1_write((uint64_t) kernel_uarg->uspace_entry);
     158        ELR_EL1_write(kernel_uarg->uspace_entry);
    159159
    160160        /* Set user stack. */
    161         SP_EL0_write(((uint64_t) kernel_uarg->uspace_stack +
    162             kernel_uarg->uspace_stack_size));
     161        SP_EL0_write(kernel_uarg->uspace_stack +
     162            kernel_uarg->uspace_stack_size);
    163163
    164164        /* Clear Thread ID register. */
     
    167167        asm volatile (
    168168            /*
    169              * Clear all general-purpose registers, except x0 that holds an
    170              * argument for the user space.
     169             * Reset the kernel stack to its base value.
     170             *
     171             * Clear all general-purpose registers,
     172             * except x0 that holds an argument for
     173             * the user space.
    171174             */
     175            "mov sp, %[kstack]\n"
    172176            "mov x0, %[uspace_uarg]\n"
    173177            "mov x1, #0\n"
     
    202206            "mov x30, #0\n"
    203207            "eret\n"
    204             :: [uspace_uarg] "r" (kernel_uarg->uspace_uarg)
     208            :: [uspace_uarg] "r" (kernel_uarg->uspace_uarg),
     209              [kstack] "r" (((uint64_t) (THREAD->kstack)) +
     210              MEM_STACK_SIZE - SP_DELTA)
    205211        );
    206212
  • kernel/arch/arm64/src/debug/stacktrace.c

    rb401b33 re28175d  
    6868bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
    6969{
    70         return !copy_from_uspace((void *) prev,
    71             (uint64_t *) ctx->fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));
     70        return !copy_from_uspace(prev,
     71            ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_FP_PREV, sizeof(*prev));
    7272}
    7373
    7474bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
    7575{
    76         return !copy_from_uspace((void *) ra,
    77             (uint64_t *) ctx->fp + FRAME_OFFSET_RA, sizeof(*ra));
     76        return !copy_from_uspace(ra,
     77            ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_RA, sizeof(*ra));
    7878}
    7979
  • kernel/arch/ia32/include/arch/interrupt.h

    rb401b33 re28175d  
    8888#define VECTOR_DEBUG_IPI          (IVT_FREEBASE + 2)
    8989
    90 extern void (*disable_irqs_function)(uint16_t);
    91 extern void (*enable_irqs_function)(uint16_t);
    92 extern void (*eoi_function)(unsigned int);
    93 extern const char *irqs_info;
    94 
    9590extern void interrupt_init(void);
    96 extern void trap_virtual_enable_irqs(uint16_t);
    97 extern void trap_virtual_disable_irqs(uint16_t);
    9891
    9992#endif
  • kernel/arch/ia32/include/arch/mm/page.h

    rb401b33 re28175d  
    3838#include <arch/mm/frame.h>
    3939#include <stdbool.h>
    40 #include <trace.h>
    4140
    4241#define PAGE_WIDTH  FRAME_WIDTH
     
    147146#include <arch/interrupt.h>
    148147#include <stddef.h>
     148#include <trace.h>
    149149
    150150/* Page fault error codes. */
  • kernel/arch/ia32/include/arch/smp/apic.h

    rb401b33 re28175d  
    4343#include <cpu.h>
    4444#include <stdint.h>
     45#include <genarch/pic/pic_ops.h>
    4546
    4647#define FIXED  (0 << 0)
     
    347348} io_apic_id_t;
    348349
     350extern pic_ops_t apic_pic_ops;
     351
    349352extern volatile uint32_t *l_apic;
    350353extern volatile uint32_t *io_apic;
  • kernel/arch/ia32/src/debug/stacktrace.c

    rb401b33 re28175d  
    6767bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
    6868{
    69         return !copy_from_uspace((void *) prev,
    70             (uint32_t *) ctx->fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));
     69        return !copy_from_uspace(prev,
     70            ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_FP_PREV, sizeof(*prev));
    7171}
    7272
    7373bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
    7474{
    75         return !copy_from_uspace((void *) ra,
    76             (uint32_t *) ctx->fp + FRAME_OFFSET_RA, sizeof(*ra));
     75        return !copy_from_uspace(ra,
     76            ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_RA, sizeof(*ra));
    7777}
    7878
  • kernel/arch/ia32/src/drivers/i8254.c

    rb401b33 re28175d  
    9696{
    9797        pio_write_8(CLK_PORT4, 0x36);
    98         pic_disable_irqs(1 << IRQ_CLK);
     98        i8259_disable_irqs(1 << IRQ_CLK);
    9999        pio_write_8(CLK_PORT1, (CLK_CONST / HZ) & 0xf);
    100100        pio_write_8(CLK_PORT1, (CLK_CONST / HZ) >> 8);
    101         pic_enable_irqs(1 << IRQ_CLK);
     101        i8259_enable_irqs(1 << IRQ_CLK);
    102102}
    103103
  • kernel/arch/ia32/src/ia32.c

    rb401b33 re28175d  
    5858#include <genarch/multiboot/multiboot.h>
    5959#include <genarch/multiboot/multiboot2.h>
     60#include <genarch/pic/pic_ops.h>
    6061#include <arch/pm.h>
    6162#include <arch/vreg.h>
     
    112113                    (i8259_t *) I8259_PIC1_BASE, IVT_IRQBASE);
    113114
    114                 /*
    115                  * Set the enable/disable IRQs handlers.
    116                  * Set the End-of-Interrupt handler.
    117                  */
    118                 enable_irqs_function = pic_enable_irqs;
    119                 disable_irqs_function = pic_disable_irqs;
    120                 eoi_function = pic_eoi;
    121                 irqs_info = "i8259";
     115                /* Set PIC operations. */
     116                pic_ops = &i8259_pic_ops;
    122117        }
    123118}
     
    194189                        indev_t *kbrd = kbrd_wire(kbrd_instance, sink);
    195190                        i8042_wire(i8042_instance, kbrd);
    196                         trap_virtual_enable_irqs(1 << IRQ_KBD);
    197                         trap_virtual_enable_irqs(1 << IRQ_MOUSE);
     191                        pic_ops->enable_irqs(1 << IRQ_KBD);
     192                        pic_ops->enable_irqs(1 << IRQ_MOUSE);
    198193                }
    199194        }
     
    220215                        indev_t *srln = srln_wire(srln_instance, sink);
    221216                        ns16550_wire(ns16550_instance, srln);
    222                         trap_virtual_enable_irqs(1 << IRQ_NS16550);
     217                        pic_ops->enable_irqs(1 << IRQ_NS16550);
    223218                }
    224219#endif
     
    231226#endif
    232227
    233         if (irqs_info != NULL)
    234                 sysinfo_set_item_val(irqs_info, NULL, true);
     228        sysinfo_set_item_val(pic_ops->get_name(), NULL, true);
    235229}
    236230
  • kernel/arch/ia32/src/interrupt.c

    rb401b33 re28175d  
    4040#include <panic.h>
    4141#include <genarch/drivers/i8259/i8259.h>
     42#include <genarch/pic/pic_ops.h>
    4243#include <halt.h>
    4344#include <cpu.h>
     
    6162 */
    6263
    63 void (*disable_irqs_function)(uint16_t irqmask) = NULL;
    64 void (*enable_irqs_function)(uint16_t irqmask) = NULL;
    65 void (*eoi_function)(unsigned int) = NULL;
    66 const char *irqs_info = NULL;
     64pic_ops_t *pic_ops = NULL;
    6765
    6866void istate_decode(istate_t *istate)
     
    8886            istate_from_uspace(istate) ? istate->esp :
    8987            (uint32_t) &istate->esp);
    90 }
    91 
    92 static void trap_virtual_eoi(unsigned int inum)
    93 {
    94         if (eoi_function)
    95                 eoi_function(inum);
    96         else
    97                 panic("No eoi_function.");
    98 
    9988}
    10089
     
    179168    istate_t *istate __attribute__((unused)))
    180169{
    181         trap_virtual_eoi(0);
     170        pic_ops->eoi(0);
    182171        tlb_shootdown_ipi_recv();
    183172}
     
    202191                if (irq->preack) {
    203192                        /* Send EOI before processing the interrupt */
    204                         trap_virtual_eoi(inum);
     193                        pic_ops->eoi(inum);
    205194                        ack = true;
    206195                }
     
    215204
    216205        if (!ack)
    217                 trap_virtual_eoi(inum);
     206                pic_ops->eoi(inum);
    218207}
    219208
     
    221210{
    222211        unsigned int inum = n - IVT_IRQBASE;
    223         if (!pic_is_spurious(inum)) {
     212        if (!pic_ops->is_spurious(inum)) {
    224213                /* This is actually not a spurious IRQ, so proceed as usual. */
    225214                irq_interrupt(n, istate);
    226215                return;
    227216        }
    228         pic_handle_spurious(n);
     217        pic_ops->handle_spurious(n);
    229218#ifdef CONFIG_DEBUG
    230219        log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u", CPU->id,
     
    264253}
    265254
    266 void trap_virtual_enable_irqs(uint16_t irqmask)
    267 {
    268         if (enable_irqs_function)
    269                 enable_irqs_function(irqmask);
    270         else
    271                 panic("No enable_irqs_function.");
    272 }
    273 
    274 void trap_virtual_disable_irqs(uint16_t irqmask)
    275 {
    276         if (disable_irqs_function)
    277                 disable_irqs_function(irqmask);
    278         else
    279                 panic("No disable_irqs_function.");
    280 }
    281 
    282255/** @}
    283256 */
  • kernel/arch/ia32/src/smp/apic.c

    rb401b33 re28175d  
    4747#include <arch.h>
    4848#include <ddi/irq.h>
     49#include <genarch/pic/pic_ops.h>
    4950
    5051#ifdef CONFIG_SMP
     
    6364 */
    6465
     66static const char *apic_get_name(void);
     67static bool l_apic_is_spurious(unsigned int);
     68static void l_apic_handle_spurious(unsigned int);
     69
     70pic_ops_t apic_pic_ops = {
     71        .get_name = apic_get_name,
     72        .enable_irqs = io_apic_enable_irqs,
     73        .disable_irqs = io_apic_disable_irqs,
     74        .eoi = l_apic_eoi,
     75        .is_spurious = l_apic_is_spurious,
     76        .handle_spurious = l_apic_handle_spurious,
     77};
     78
    6579/*
    6680 * These variables either stay configured as initilalized, or are changed by
     
    125139#endif /* LAPIC_VERBOSE */
    126140
     141const char *apic_get_name(void)
     142{
     143        return "apic";
     144}
     145
     146bool l_apic_is_spurious(unsigned int n)
     147{
     148        return n == VECTOR_APIC_SPUR;
     149}
     150
     151void l_apic_handle_spurious(unsigned int n)
     152{
     153}
     154
    127155/** APIC spurious interrupt handler.
    128156 *
     
    134162    istate_t *istate __attribute__((unused)))
    135163{
    136 #ifdef CONFIG_DEBUG
    137         log(LF_ARCH, LVL_DEBUG, "cpu%u: APIC spurious interrupt", CPU->id);
    138 #endif
    139164}
    140165
     
    175200            (iroutine_t) apic_spurious);
    176201
    177         enable_irqs_function = io_apic_enable_irqs;
    178         disable_irqs_function = io_apic_disable_irqs;
    179         eoi_function = l_apic_eoi;
    180         irqs_info = "apic";
     202        pic_ops = &apic_pic_ops;
    181203
    182204        /*
  • kernel/arch/ia32/src/smp/smp.c

    rb401b33 re28175d  
    130130        pio_write_8((ioport8_t *) 0x71, 0xa);
    131131
    132         pic_disable_irqs(0xffff);
     132        i8259_disable_irqs(0xffff);
    133133        apic_init();
    134134
  • kernel/arch/ia32/src/userspace.c

    rb401b33 re28175d  
    7070            : [eflags_mask] "i" (~EFLAGS_NT),
    7171              [udata_des] "i" (GDT_SELECTOR(UDATA_DES) | PL_USER),
    72               [stack_top] "r" ((uint8_t *) kernel_uarg->uspace_stack +
     72              [stack_top] "r" (kernel_uarg->uspace_stack +
    7373              kernel_uarg->uspace_stack_size),
    7474              [eflags] "r" ((eflags & ~(EFLAGS_NT)) | EFLAGS_IF),
  • kernel/arch/ia64/include/arch/interrupt.h

    rb401b33 re28175d  
    9292extern void disabled_fp_register(unsigned int, istate_t *);
    9393
    94 extern void trap_virtual_enable_irqs(uint16_t);
    95 
    9694void exception_init(void);
    9795#endif
  • kernel/arch/ia64/include/arch/istate.h

    rb401b33 re28175d  
    7171_NO_TRACE static inline int istate_from_uspace(istate_t *istate)
    7272{
    73         return (istate->cr_iip) < 0xe000000000000000ULL;
     73        return istate->cr_ipsr.cpl == PSR_CPL_USER;
    7474}
    7575
  • kernel/arch/ia64/include/arch/mm/page.h

    rb401b33 re28175d  
    3838
    3939#include <arch/mm/frame.h>
     40#include <arch/register.h>
    4041
    4142#ifndef __ASSEMBLER__
     
    7677
    7778/** Privilege Levels. Only the most and the least privileged ones are ever used. */
    78 #define PL_KERNEL  0x00
    79 #define PL_USER    0x03
     79#define PL_KERNEL  PSR_CPL_KERNEL
     80#define PL_USER    PSR_CPL_USER
    8081
    8182/* Access Rigths. Only certain combinations are used by the kernel. */
  • kernel/arch/ia64/include/arch/register.h

    rb401b33 re28175d  
    5757#define PSR_RT_MASK   (1 << 27)
    5858#define PSR_IT_MASK   (1 << 36)
     59
     60#define PSR_CPL_USER   3
     61#define PSR_CPL_KERNEL 0
    5962
    6063#define PSR_CPL_SHIFT         32
  • kernel/arch/ia64/src/ia64.c

    rb401b33 re28175d  
    244244         * uspace_stack_size / 2 bytes.
    245245         */
    246         switch_to_userspace((uintptr_t) kernel_uarg->uspace_entry,
    247             ((uintptr_t) kernel_uarg->uspace_stack) +
     246        switch_to_userspace(kernel_uarg->uspace_entry,
     247            kernel_uarg->uspace_stack +
    248248            kernel_uarg->uspace_stack_size / 2 -
    249249            ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT),
    250             ((uintptr_t) kernel_uarg->uspace_stack) +
     250            kernel_uarg->uspace_stack +
    251251            kernel_uarg->uspace_stack_size / 2,
    252             (uintptr_t) kernel_uarg->uspace_uarg, psr.value, rsc.value);
     252            kernel_uarg->uspace_uarg, psr.value, rsc.value);
    253253
    254254        while (true)
  • kernel/arch/ia64/src/interrupt.c

    rb401b33 re28175d  
    301301}
    302302
    303 void trap_virtual_enable_irqs(uint16_t irqmask)
    304 {
    305 }
    306 
    307303void exception_init(void)
    308304{
  • kernel/arch/ia64/src/mm/tlb.c

    rb401b33 re28175d  
    464464}
    465465
    466 static bool is_kernel_fault(uintptr_t va)
     466static bool is_kernel_fault(istate_t *istate, uintptr_t va)
    467467{
    468468        region_register_t rr;
     469
     470        if (istate_from_uspace(istate))
     471                return false;
    469472
    470473        rr.word = rr_read(VA2VRN(va));
     
    484487        pte_t t;
    485488
     489        assert(istate_from_uspace(istate));
     490
    486491        va = istate->cr_ifa; /* faulting address */
    487 
    488         assert(!is_kernel_fault(va));
    489492
    490493        bool found = page_mapping_find(AS, va, true, &t);
     
    587590        as_t *as = AS;
    588591
    589         if (is_kernel_fault(va)) {
     592        if (is_kernel_fault(istate, va)) {
    590593                if (va < end_of_identity) {
    591594                        /*
     
    648651        va = istate->cr_ifa;  /* faulting address */
    649652
    650         if (is_kernel_fault(va))
     653        if (is_kernel_fault(istate, va))
    651654                as = AS_KERNEL;
    652655
     
    680683        pte_t t;
    681684
     685        assert(istate_from_uspace(istate));
     686
    682687        va = istate->cr_ifa;  /* faulting address */
    683 
    684         assert(!is_kernel_fault(va));
    685688
    686689        bool found = page_mapping_find(AS, va, true, &t);
     
    716719        va = istate->cr_ifa;  /* faulting address */
    717720
    718         if (is_kernel_fault(va))
     721        if (is_kernel_fault(istate, va))
    719722                as = AS_KERNEL;
    720723
     
    752755        pte_t t;
    753756
     757        assert(istate_from_uspace(istate));
     758
    754759        va = istate->cr_ifa;  /* faulting address */
    755 
    756         assert(!is_kernel_fault(va));
    757760
    758761        /*
     
    779782        pte_t t;
    780783
     784        assert(istate_from_uspace(istate));
     785
    781786        va = istate->cr_ifa;  /* faulting address */
    782 
    783         assert(!is_kernel_fault(va));
    784787
    785788        bool found = page_mapping_find(AS, va, true, &t);
  • kernel/arch/mips32/meson.build

    rb401b33 re28175d  
    11#
    22# Copyright (c) 2005 Martin Decky
    3 # Copyright (c) 2007 Jakub Jermar
    43# All rights reserved.
    54#
     
    2827#
    2928
    30 USPACE_PREFIX = ../..
    31 ROOT_PATH = $(USPACE_PREFIX)/..
    32 CONFIG_MAKEFILE = $(ROOT_PATH)/Makefile.config
     29arch_src += files(
     30        'src/start.S',
     31        'src/context.S',
     32        'src/mips32.c',
     33        'src/asm.S',
     34        'src/exception.c',
     35        'src/interrupt.c',
     36        'src/cache.c',
     37        'src/debugger.c',
     38        'src/cpu/cpu.c',
     39        'src/debug/stacktrace.c',
     40        'src/debug/stacktrace_asm.S',
     41        'src/mm/km.c',
     42        'src/mm/frame.c',
     43        'src/mm/page.c',
     44        'src/mm/tlb.c',
     45        'src/mm/as.c',
     46        'src/fpu_context.c',
     47        'src/smc.c',
     48        'src/smp/smp.c',
     49        'src/machine_func.c',
     50)
    3351
    34 include $(CONFIG_MAKEFILE)
     52if MACHINE == 'lmalta' or MACHINE == 'bmalta'
     53        arch_src += files('src/mach/malta/malta.c')
    3554
    36 ifeq ($(UARCH),ia64)
    37         # IA64 has a peculiar linker script with a fixed data segment address.
    38         # Because the loader is a separate nonrelocatable binary in the same
    39         # address space as the application, we provide a modified copy of
    40         # the default linker script to work around that.
    41         EXTRA_LDFLAGS = -T elf64_ia64_loader.x
    42 else
    43         # On all other architectures, we can simply move the text segment.
    44         EXTRA_LDFLAGS = -Wl,-Ttext-segment=0x70000000
     55elif MACHINE == 'msim'
     56        arch_src += files(
     57                'src/mach/msim/msim.c',
     58                'src/mach/msim/dorder.c',
     59        )
     60
    4561endif
    4662
    47 BINARY = loader
    48 STATIC_NEEDED = y
    4963
    50 GENERIC_SOURCES = \
    51         main.c
     64_check_headers = [
     65        'include/arch/istate_struct.h',
     66        'include/arch/context_struct.h',
     67        'include/arch/fpu_context_struct.h',
     68]
    5269
    53 SOURCES = \
    54         $(GENERIC_SOURCES) \
    55         $(ARCH_SOURCES)
    56 
    57 include $(USPACE_PREFIX)/Makefile.common
     70foreach h : _check_headers
     71        arch_src += [ autocheck.process(h) ]
     72endforeach
  • kernel/arch/mips32/src/mach/malta/malta.c

    rb401b33 re28175d  
    7575{
    7676        uint8_t isa_irq = host2uint32_t_le(pio_read_32(GT64120_PCI0_INTACK));
    77         if (pic_is_spurious(isa_irq)) {
    78                 pic_handle_spurious(isa_irq);
     77        if (i8259_is_spurious(isa_irq)) {
     78                i8259_handle_spurious(isa_irq);
    7979#ifdef CONFIG_DEBUG
    8080                log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u",
     
    9393#endif
    9494        }
    95         pic_eoi(isa_irq);
     95        i8259_eoi(isa_irq);
    9696}
    9797
     
    146146                        indev_t *srln = srln_wire(srln_instance, sink);
    147147                        ns16550_wire(tty_instance, srln);
    148                         pic_enable_irqs(1 << TTY_ISA_IRQ);
     148                        i8259_enable_irqs(1 << TTY_ISA_IRQ);
    149149                }
    150150        }
  • kernel/arch/mips32/src/mips32.c

    rb401b33 re28175d  
    7171arch_ops_t *arch_ops = &mips32_ops;
    7272
    73 /*
    74  * Why the linker moves the variable 64K away in assembler
    75  * when not in .text section?
    76  */
    77 
    7873/* Stack pointer saved when entering user mode */
    79 uintptr_t supervisor_sp __attribute__((section(".text")));
     74// FIXME: This won't work with SMP unless thread creation is globally serialized.
     75uintptr_t supervisor_sp;
    8076
    8177size_t cpu_count = 0;
     
    171167        cp0_status_write(cp0_status_read() | (cp0_status_exl_exception_bit |
    172168            cp0_status_um_bit | cp0_status_ie_enabled_bit));
    173         cp0_epc_write((uintptr_t) kernel_uarg->uspace_entry);
    174         userspace_asm(((uintptr_t) kernel_uarg->uspace_stack +
    175             kernel_uarg->uspace_stack_size),
    176             (uintptr_t) kernel_uarg->uspace_uarg,
    177             (uintptr_t) kernel_uarg->uspace_entry);
     169        cp0_epc_write(kernel_uarg->uspace_entry);
     170        userspace_asm(kernel_uarg->uspace_stack +
     171            kernel_uarg->uspace_stack_size,
     172            kernel_uarg->uspace_uarg,
     173            kernel_uarg->uspace_entry);
    178174
    179175        while (true)
  • kernel/arch/ppc32/include/arch/mm/page.h

    rb401b33 re28175d  
    3737
    3838#include <arch/mm/frame.h>
    39 #include <trace.h>
    4039
    4140#define PAGE_WIDTH  FRAME_WIDTH
     
    150149#include <mm/mm.h>
    151150#include <arch/interrupt.h>
     151#include <trace.h>
    152152
    153153/** Page Table Entry. */
  • kernel/arch/ppc32/meson.build

    rb401b33 re28175d  
    2727#
    2828
    29 # TODO: We need to implement DWARF unwinding and get rid of this flag.
    30 COMMON_CFLAGS += -fno-omit-frame-pointer -Wl,-z,max-page-size=0x1000
     29arch_src += files(
     30        'src/context.S',
     31        'src/debug/stacktrace.c',
     32        'src/debug/stacktrace_asm.S',
     33        'src/fpu_context.S',
     34        'src/boot/boot.S',
     35        'src/ppc32.c',
     36        'src/dummy.S',
     37        'src/exception.S',
     38        'src/interrupt.c',
     39        'src/asm.S',
     40        'src/cpu/cpu.c',
     41        'src/proc/scheduler.c',
     42        'src/smc.c',
     43        'src/mm/km.c',
     44        'src/mm/as.c',
     45        'src/mm/frame.c',
     46        'src/mm/page.c',
     47        'src/mm/pht.c',
     48        'src/mm/tlb.c',
     49        'src/drivers/pic.c',
     50)
    3151
    32 # XXX: This architecture requires unoptimized TLS pointer access,
    33 #      as with the GCC option `-mno-tls-direct-seg-refs`.
    34 #      The `amd64-helenos` target defaults to this behavior.
    3552
    36 LDFLAGS += -Wl,--gc-sections
     53_check_headers = [
     54        'include/arch/istate_struct.h',
     55        'include/arch/context_struct.h',
     56        'include/arch/fpu_context_struct.h',
     57]
    3758
    38 ENDIANESS = LE
    39 
    40 BFD_NAME = elf64-x86-64
    41 BFD_ARCH = i386:x86-64
     59foreach h : _check_headers
     60        arch_src += [ autocheck.process(h) ]
     61endforeach
  • kernel/arch/ppc32/src/debug/stacktrace.c

    rb401b33 re28175d  
    6767bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
    6868{
    69         return !copy_from_uspace((void *) prev,
    70             (uint32_t *) ctx->fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));
     69        return !copy_from_uspace(prev,
     70            ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_FP_PREV, sizeof(*prev));
    7171}
    7272
    7373bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
    7474{
    75         return !copy_from_uspace((void *) ra,
    76             (uint32_t *) ctx->fp + FRAME_OFFSET_RA, sizeof(*ra));
     75        return !copy_from_uspace(ra,
     76            ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_RA, sizeof(*ra));
    7777}
    7878
  • kernel/arch/ppc32/src/ppc32.c

    rb401b33 re28175d  
    292292void userspace(uspace_arg_t *kernel_uarg)
    293293{
    294         userspace_asm((uintptr_t) kernel_uarg->uspace_uarg,
    295             (uintptr_t) kernel_uarg->uspace_stack +
     294        userspace_asm(kernel_uarg->uspace_uarg,
     295            kernel_uarg->uspace_stack +
    296296            kernel_uarg->uspace_stack_size - SP_DELTA,
    297             (uintptr_t) kernel_uarg->uspace_entry);
     297            kernel_uarg->uspace_entry);
    298298
    299299        unreachable();
  • kernel/arch/riscv64/_link.ld.in

    rb401b33 re28175d  
    1616        kernel_load_address = PA2KA(BOOT_OFFSET);
    1717
    18         .image (PA2KA(BOOT_OFFSET) + SIZEOF_HEADERS) : AT (SIZEOF_HEADERS) {
     18        .image (PA2KA(BOOT_OFFSET) + SIZEOF_HEADERS) : AT (BOOT_OFFSET + SIZEOF_HEADERS) {
    1919                ktext_start = .;
    2020                *(K_TEXT_START);
  • kernel/arch/riscv64/meson.build

    rb401b33 re28175d  
    2727#
    2828
    29 BFD_NAME = elf64-littleriscv
    30 BFD_OUTPUT = $(BFD_NAME)
    31 BFD_ARCH = riscv
     29arch_src += files(
     30        'src/boot/boot.S',
     31        'src/asm.S',
     32        'src/context.S',
     33        'src/debug/stacktrace.c',
     34        'src/drivers/ucb.c',
     35        'src/proc/scheduler.c',
     36        'src/proc/task.c',
     37        'src/proc/thread.c',
     38        'src/riscv64.c',
     39        'src/userspace.c',
     40        'src/smc.c',
     41        'src/cpu/cpu.c',
     42        'src/mm/km.c',
     43        'src/mm/as.c',
     44        'src/mm/frame.c',
     45        'src/mm/page.c',
     46        'src/mm/tlb.c',
     47)
    3248
    33 BITS = 64
    34 ENDIANESS = LE
    35 EXTRA_CFLAGS = -mcmodel=medany
    3649
    37 SOURCES = \
    38         arch/$(BARCH)/src/asm.S \
    39         arch/$(BARCH)/src/main.c \
    40         arch/$(BARCH)/src/ucb.c \
    41         arch/$(BARCH)/src/putchar.c \
    42         $(COMPS).o \
    43         generic/src/memstr.c \
    44         generic/src/printf_core.c \
    45         generic/src/vprintf.c \
    46         generic/src/printf.c \
    47         generic/src/str.c \
    48         generic/src/version.c \
    49         generic/src/inflate.c \
    50         generic/src/gzip.c \
    51         generic/src/tar.c \
    52         generic/src/kernel.c \
    53         generic/src/payload.c
     50_check_headers = [
     51        'include/arch/istate_struct.h',
     52        'include/arch/context_struct.h',
     53]
     54
     55foreach h : _check_headers
     56        arch_src += [ autocheck.process(h) ]
     57endforeach
  • kernel/arch/riscv64/src/riscv64.c

    rb401b33 re28175d  
    143143}
    144144
    145 uintptr_t memcpy_from_uspace(void *dst, const void *uspace_src, size_t size)
     145uintptr_t memcpy_from_uspace(void *dst, uspace_addr_t uspace_src, size_t size)
    146146{
    147147        return 0;
    148148}
    149149
    150 uintptr_t memcpy_to_uspace(void *uspace_dst, const void *src, size_t size)
     150uintptr_t memcpy_to_uspace(uspace_addr_t uspace_dst, const void *src, size_t size)
    151151{
    152152        return 0;
  • kernel/arch/sparc64/meson.build

    rb401b33 re28175d  
    2727#
    2828
    29 COMMON_CFLAGS += -msoft-float -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mabi=32
    30 AS_PROLOG = .module softfloat;
    31 
    32 BITS = 32
    33 
    34 ## Accepted MACHINEs
    35 #
    36 
    37 ifeq ($(MACHINE),msim)
    38         ENDIANESS = LE
    39         COMMON_CFLAGS += -march=r4000
    40 endif
    41 ifeq ($(MACHINE),bmalta)
    42         ENDIANESS = BE
    43         COMMON_CFLAGS += -D__BE__ -march=4kc
    44 endif
    45 ifeq ($(MACHINE),lmalta)
    46         ENDIANESS = LE
    47         COMMON_CFLAGS += -march=4kc
     29if PROCESSOR == 'us' or PROCESSOR == 'us3'
     30        USARCH = 'sun4u'
     31elif PROCESSOR == 'sun4v'
     32        USARCH = 'sun4v'
     33else
     34        error('Unknown PROCESSOR: ' + PROCESSOR)
    4835endif
    4936
    50 ARCH_SOURCES = \
    51         arch/$(KARCH)/src/start.S \
    52         arch/$(KARCH)/src/context.S \
    53         arch/$(KARCH)/src/mips32.c \
    54         arch/$(KARCH)/src/asm.S \
    55         arch/$(KARCH)/src/exception.c \
    56         arch/$(KARCH)/src/interrupt.c \
    57         arch/$(KARCH)/src/cache.c \
    58         arch/$(KARCH)/src/debugger.c \
    59         arch/$(KARCH)/src/cpu/cpu.c \
    60         arch/$(KARCH)/src/debug/stacktrace.c \
    61         arch/$(KARCH)/src/debug/stacktrace_asm.S \
    62         arch/$(KARCH)/src/mm/km.c \
    63         arch/$(KARCH)/src/mm/frame.c \
    64         arch/$(KARCH)/src/mm/page.c \
    65         arch/$(KARCH)/src/mm/tlb.c \
    66         arch/$(KARCH)/src/mm/as.c \
    67         arch/$(KARCH)/src/fpu_context.c \
    68         arch/$(KARCH)/src/smc.c \
    69         arch/$(KARCH)/src/smp/smp.c \
    70         arch/$(KARCH)/src/machine_func.c
     37arch_src += files(
     38        'src/sparc64.c',
     39        'src/cpu' / USARCH / 'cpu.c',
     40        'src/debug/stacktrace.c',
     41        'src/debug/stacktrace_asm.S',
     42        'src/asm.S',
     43        'src' / USARCH / 'asm.S',
     44        'src/console.c',
     45        'src/context.S',
     46        'src/fpu_context.c',
     47        'src/dummy.S',
     48        'src/mm' / USARCH / 'km.c',
     49        'src/mm' / USARCH / 'as.c',
     50        'src/mm' / USARCH / 'frame.c',
     51        'src/mm/page.c',
     52        'src/mm' / USARCH / 'tlb.c',
     53        'src' / USARCH / 'sparc64.c',
     54        'src' / USARCH / 'start.S',
     55        'src/proc' / USARCH / 'scheduler.c',
     56        'src/proc/thread.c',
     57        'src/smc.c',
     58        'src/trap' / USARCH / 'mmu.S',
     59        'src/trap' / USARCH / 'trap_table.S',
     60        'src/trap/trap.c',
     61        'src/trap/exception.c',
     62        'src/trap/interrupt.c',
     63        'src/drivers/tick.c',
     64        'src/drivers/kbd.c',
     65        'src/drivers/tty.c',
     66        'src/drivers/pci.c',
     67        'src/trap' / USARCH / 'interrupt.c',
     68)
    7169
    72 ifeq ($(MACHINE),$(filter lmalta bmalta,$(MACHINE)))
    73         ARCH_SOURCES += arch/$(KARCH)/src/mach/malta/malta.c
     70if USARCH == 'sun4v'
     71        arch_src += files(
     72                'src/drivers/niagara.c',
     73                'src/sun4v/md.c',
     74        )
    7475endif
    7576
    76 ifeq ($(MACHINE),msim)
    77         ARCH_SOURCES += \
    78                 arch/$(KARCH)/src/mach/msim/msim.c \
    79                 arch/$(KARCH)/src/mach/msim/dorder.c
     77if CONFIG_FB
     78        arch_src += files(
     79                'src/drivers/scr.c',
     80        )
    8081endif
    8182
    82 ARCH_AUTOCHECK_HEADERS = \
    83         arch/$(KARCH)/include/arch/istate_struct.h \
    84         arch/$(KARCH)/include/arch/context_struct.h \
    85         arch/$(KARCH)/include/arch/fpu_context_struct.h
     83if CONFIG_SMP
     84        arch_src += files(
     85                'src/smp' / USARCH / 'smp.c',
     86                'src/smp' / USARCH / 'ipi.c',
     87        )
     88endif
     89
     90if CONFIG_TSB
     91        arch_src += files(
     92                'src/mm' / USARCH / 'tsb.c',
     93        )
     94endif
     95
     96
     97_check_headers = [
     98        'include/arch/istate_struct.h',
     99        'include/arch/context_struct.h',
     100]
     101
     102foreach h : _check_headers
     103        arch_src += [ autocheck.process(h) ]
     104endforeach
  • kernel/arch/sparc64/src/sun4u/sparc64.c

    rb401b33 re28175d  
    163163{
    164164        (void) interrupts_disable();
    165         switch_to_userspace((uintptr_t) kernel_uarg->uspace_entry,
    166             ((uintptr_t) kernel_uarg->uspace_stack) +
     165        switch_to_userspace(kernel_uarg->uspace_entry,
     166            kernel_uarg->uspace_stack +
    167167            kernel_uarg->uspace_stack_size -
    168168            (ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT) + STACK_BIAS),
    169             (uintptr_t) kernel_uarg->uspace_uarg);
     169            kernel_uarg->uspace_uarg);
    170170
    171171        /* Not reached */
  • kernel/arch/sparc64/src/sun4v/sparc64.c

    rb401b33 re28175d  
    161161{
    162162        (void) interrupts_disable();
    163         switch_to_userspace((uintptr_t) kernel_uarg->uspace_entry,
    164             ((uintptr_t) kernel_uarg->uspace_stack) +
     163        switch_to_userspace(kernel_uarg->uspace_entry,
     164            kernel_uarg->uspace_stack +
    165165            kernel_uarg->uspace_stack_size -
    166166            (ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT) + STACK_BIAS),
    167             (uintptr_t) kernel_uarg->uspace_uarg);
     167            kernel_uarg->uspace_uarg);
    168168
    169169        /* Not reached */
Note: See TracChangeset for help on using the changeset viewer.