Changeset 5a5269d in mainline for kernel/arch


Ignore:
Timestamp:
2019-07-02T12:03:55Z (6 years ago)
Author:
GitHub <noreply@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
98c4c16
Parents:
aca97582
git-author:
Jiří Zárevúcky <zarevucky.jiri@…> (2019-07-02 12:03:55)
git-committer:
GitHub <noreply@…> (2019-07-02 12:03:55)
Message:

Change type of uspace pointers in kernel from pointer type to numeric (#170)

From kernel's perspective, userspace addresses are not valid pointers,
and can only be used in calls to copy_to/from_uspace().
Therefore, we change the type of those arguments and variables to
uspace_addr_t which is an alias for sysarg_t.

This allows the compiler to catch accidental direct accesses to
userspace addresses.

Additionally, to avoid losing the type information in code,
a macro uspace_ptr(type) is used that translates to uspace_addr_t.
I makes no functional difference, but allows keeping the type information
in code in case we implement some sort of static checking for it in the future.

However, ccheck doesn't like that, so instead of using uspace_ptr(char),
we use uspace_ptr_char which is defined as
#define uspace_ptr_char uspace_ptr(char).

Location:
kernel/arch
Files:
16 edited

Legend:

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

    raca97582 r5a5269d  
    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/src/debug/stacktrace.c

    raca97582 r5a5269d  
    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/userspace.c

    raca97582 r5a5269d  
    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

    raca97582 r5a5269d  
    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

    raca97582 r5a5269d  
    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/src/arm64.c

    raca97582 r5a5269d  
    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. */
  • kernel/arch/arm64/src/debug/stacktrace.c

    raca97582 r5a5269d  
    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/src/debug/stacktrace.c

    raca97582 r5a5269d  
    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/userspace.c

    raca97582 r5a5269d  
    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/src/ia64.c

    raca97582 r5a5269d  
    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/mips32/src/mips32.c

    raca97582 r5a5269d  
    167167        cp0_status_write(cp0_status_read() | (cp0_status_exl_exception_bit |
    168168            cp0_status_um_bit | cp0_status_ie_enabled_bit));
    169         cp0_epc_write((uintptr_t) kernel_uarg->uspace_entry);
    170         userspace_asm(((uintptr_t) kernel_uarg->uspace_stack +
    171             kernel_uarg->uspace_stack_size),
    172             (uintptr_t) kernel_uarg->uspace_uarg,
    173             (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);
    174174
    175175        while (true)
  • kernel/arch/ppc32/src/debug/stacktrace.c

    raca97582 r5a5269d  
    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

    raca97582 r5a5269d  
    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/src/riscv64.c

    raca97582 r5a5269d  
    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/src/sun4u/sparc64.c

    raca97582 r5a5269d  
    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

    raca97582 r5a5269d  
    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.