Changeset b183ce0a in mainline


Ignore:
Timestamp:
2013-03-24T15:34:29Z (11 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8a26f82
Parents:
b92a0ee (diff), 119b46e (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.
Message:

Merge mainline changes

Files:
8 added
6 deleted
47 edited

Legend:

Unmodified
Added
Removed
  • HelenOS.config

    rb92a0ee rb183ce0a  
    4444% Machine type
    4545@ "msim" MSIM
    46 @ "bgxemul" GXEmul big endian
    47 @ "lgxemul" GXEmul little endian
     46@ "bmalta" MIPS Malta Development Board big endian
     47@ "lmalta" MIPS Malta Development Board little endian
    4848! [PLATFORM=mips32] MACHINE (choice)
    4949
     
    115115! [PLATFORM=arm32&(PROCESSOR=cortex_a8)] PROCESSOR_ARCH (choice)
    116116
     117% CPU type
     118@ "R4000" MIPS R4000
     119! [PLATFORM=mips32&MACHINE=msim] PROCESSOR (choice)
     120
     121% CPU type
     122@ "4Kc" MIPS 4Kc
     123! [PLATFORM=mips32&(MACHINE=bmalta|MACHINE=lmalta)] PROCESSOR (choice)
     124
    117125% RAM disk format
    118126@ "tmpfs" TMPFS image
     
    193201% User space architecture
    194202@ "mips32"
    195 ! [PLATFORM=mips32&(MACHINE=msim|MACHINE=lgxemul)] UARCH (choice)
     203! [PLATFORM=mips32&(MACHINE=msim|MACHINE=lmalta)] UARCH (choice)
    196204
    197205% User space architecture
    198206@ "mips32eb"
    199 ! [PLATFORM=mips32&MACHINE=bgxemul] UARCH (choice)
     207! [PLATFORM=mips32&MACHINE=bmalta] UARCH (choice)
    200208
    201209% User space architecture
     
    270278
    271279% Image format
    272 @ "ecoff"
    273 ! [PLATFORM=mips32&(MACHINE=bgxemul|MACHINE=lgxemul)] IMAGE (choice)
     280@ "elf"
     281! [PLATFORM=mips32&(MACHINE=bmalta|MACHINE=lmalta)] IMAGE (choice)
    274282
    275283% Image format
     
    360368! [PLATFORM=ia32|PLATFORM=amd64|PLATFORM=ia64|PLATFORM=sparc64] CONFIG_FPU (y)
    361369
    362 % FPU support
    363 ! [PLATFORM=mips32&(MACHINE=lgxemul|MACHINE=bgxemul)] CONFIG_FPU (y)
    364 
    365370## armv7 made fpu hardware compulsory
    366371% FPU support
     
    447452@ "generic" Monitor or serial line
    448453@ "none" No output device
    449 ! [PLATFORM=ia32|PLATFORM=amd64|PLATFORM=sparc64|PLATFORM=ppc32|(PLATFORM=ia64&MACHINE=i460GX)|(PLATFORM=mips32&MACHINE=msim)|(PLATFORM=mips64&MACHINE=msim)] CONFIG_HID_OUT (choice)
    450 
    451 % Output device class
    452 @ "generic" Monitor or serial line
    453 @ "monitor" Monitor
    454 @ "serial" Serial line
    455 @ "none" No output device
    456 ! [PLATFORM=mips32&(MACHINE=bgxemul|MACHINE=lgxemul)] CONFIG_HID_OUT (choice)
     454! [PLATFORM=ia32|PLATFORM=amd64|PLATFORM=sparc64|PLATFORM=ppc32|(PLATFORM=ia64&MACHINE=i460GX)|(PLATFORM=mips32&(MACHINE=msim|MACHINE=bmalta|MACHINE=lmalta))|(PLATFORM=mips64&MACHINE=msim)] CONFIG_HID_OUT (choice)
    457455
    458456% PC keyboard support
     
    465463! [(CONFIG_HID_IN=generic|CONFIG_HID_IN=keyboard)&PLATFORM=arm32&MACHINE=integratorcp] CONFIG_PC_KBD (y/n)
    466464
    467 % Support for msim/GXemul keyboard
    468 ! [CONFIG_HID_IN=generic&(PLATFORM=mips32|PLATFORM=mips64)] CONFIG_MIPS_KBD (y/n)
    469 
    470 % Support for msim/GXemul printer
    471 ! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=serial)&(PLATFORM=mips32|PLATFORM=mips64)] CONFIG_MIPS_PRN (y/n)
     465% Support for msim keyboard
     466! [CONFIG_HID_IN=generic&MACHINE=msim] CONFIG_MSIM_KBD (y/n)
     467
     468% Support for msim printer
     469! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=serial)&MACHINE=msim] CONFIG_MSIM_PRN (y/n)
    472470
    473471% Support for VIA CUDA controller
     
    511509
    512510% Dummy serial line input
    513 ! [CONFIG_MIPS_KBD=y|CONFIG_ARM_KBD=y] CONFIG_DSRLNIN (y)
     511! [CONFIG_MSIM_KBD=y|CONFIG_ARM_KBD=y] CONFIG_DSRLNIN (y)
    514512
    515513% Dummy serial line output
    516 ! [CONFIG_MIPS_PRN=y|CONFIG_ARM_PRN=y] CONFIG_DSRLNOUT (y)
     514! [CONFIG_MSIM_PRN=y|CONFIG_ARM_PRN=y] CONFIG_DSRLNOUT (y)
    517515
    518516% Serial line input module
     
    527525% Framebuffer support
    528526! [CONFIG_HID_OUT=generic&(PLATFORM=ia32|PLATFORM=amd64|PLATFORM=ppc32)] CONFIG_FB (y/n)
    529 
    530 % Framebuffer support
    531 ! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=monitor)&PLATFORM=mips32&(MACHINE=lgxemul|MACHINE=bgxemul)] CONFIG_FB (y/n)
    532527
    533528% Framebuffer support
  • boot/arch/mips32/Makefile.inc

    rb92a0ee rb183ce0a  
    2929BFD_ARCH = mips
    3030BITS = 32
    31 EXTRA_CFLAGS = -msoft-float -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mips3 -mabi=32
     31EXTRA_CFLAGS = -msoft-float -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mabi=32
    3232
    33 RD_SRVS_NON_ESSENTIAL += \
    34         $(USPACE_PATH)/srv/bd/gxe_bd/gxe_bd
    35 
    36 ifeq ($(MACHINE),lgxemul)
    37         BFD_NAME = elf32-tradlittlemips
    38         BFD_OUTPUT = ecoff-littlemips
    39         ENDIANESS = LE
    40 endif
    41 ifeq ($(MACHINE),bgxemul)
    42         BFD_NAME = elf32-tradbigmips
    43         BFD_OUTPUT = ecoff-bigmips
    44         ENDIANESS = BE
    45 endif
    4633ifeq ($(MACHINE),msim)
    4734        BFD_NAME = elf32-tradlittlemips
    4835        BFD_OUTPUT = binary
    4936        ENDIANESS = LE
     37        EXTRA_CFLAGS += -march=r4000
    5038endif
     39ifeq ($(MACHINE),lmalta)
     40        BFD_NAME = elf32-tradlittlemips
     41        BFD_OUTPUT = elf32-tradlittlemips
     42        ENDIANESS = LE
     43        EXTRA_CFLAGS += -march=4kc
     44endif
     45ifeq ($(MACHINE),bmalta)
     46        BFD_NAME = elf32-tradbigmips
     47        BFD_OUTPUT = elf32-tradbigmips
     48        ENDIANESS = BE
     49        EXTRA_CFLAGS += -march=4kc
     50endif
     51
    5152
    5253SOURCES = \
  • boot/arch/mips32/_link.ld.in

    rb92a0ee rb183ce0a  
    22
    33SECTIONS {
     4#if defined(MACHINE_msim)
    45        . = 0xbfc00000;
     6#elif defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     7        . = 0x80103000;
     8#endif
    59        .text : {
    610                *(BOOTSTRAP);
  • boot/arch/mips32/include/arch.h

    rb92a0ee rb183ce0a  
    3333#define PAGE_SIZE   (1 << PAGE_WIDTH)
    3434
     35#if defined(MACHINE_msim)
    3536#define CPUMAP_OFFSET    0x00001000
    3637#define STACK_OFFSET     0x00002000
     
    4142#define MSIM_VIDEORAM_ADDRESS  0xb0000000
    4243#define MSIM_DORDER_ADDRESS    0xb0000100
     44#endif
     45
     46#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     47#define CPUMAP_OFFSET    0x00100000
     48#define STACK_OFFSET     0x00101000
     49#define BOOTINFO_OFFSET  0x00102000
     50#define BOOT_OFFSET      0x00200000
     51#define LOADER_OFFSET    0x00103000
     52
     53#define YAMON_SUBR_BASE         PA2KA(0x1fc00500)
     54#define YAMON_SUBR_PRINT_COUNT  (YAMON_SUBR_BASE + 0x4)
     55#endif
    4356
    4457#ifndef __ASM__
    4558        #define PA2KA(addr)    (((uintptr_t) (addr)) + 0x80000000)
     59        #define PA2KSEG(addr)  (((uintptr_t) (addr)) + 0xa0000000)
     60        #define KA2PA(addr)    (((uintptr_t) (addr)) - 0x80000000)
    4661        #define KSEG2PA(addr)  (((uintptr_t) (addr)) - 0xa0000000)
    4762#else
  • boot/arch/mips32/include/types.h

    rb92a0ee rb183ce0a  
    4747
    4848typedef struct {
     49#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     50        uint32_t sdram_size;
     51#endif
    4952        uint32_t cpumap;
    5053        size_t cnt;
  • boot/arch/mips32/src/asm.S

    rb92a0ee rb183ce0a  
    5151        and $a0, $a1, $a0
    5252        mtc0 $a0, $status
     53
     54#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     55        /*
     56         * Remember the size of the SDRAM in bootinfo.
     57         */
     58        la $a0, PA2KA(BOOTINFO_OFFSET)
     59        sw $a3, 0($a0)
     60#endif
    5361       
    5462        /*
  • boot/arch/mips32/src/main.c

    rb92a0ee rb183ce0a  
    6565        for (i = 0; i < COMPONENTS; i++)
    6666                printf(" %p|%p: %s image (%zu/%zu bytes)\n", components[i].start,
    67                     (void *) KSEG2PA(components[i].start), components[i].name,
    68                     components[i].inflated, components[i].size);
     67                    (uintptr_t) components[i].start >= PA2KSEG(0) ?
     68                    (void *) KSEG2PA(components[i].start) :
     69                    (void *) KA2PA(components[i].start),
     70                    components[i].name, components[i].inflated,
     71                    components[i].size);
    6972       
    7073        void *dest[COMPONENTS];
     
    9396       
    9497        for (i = cnt; i > 0; i--) {
     98#ifdef MACHINE_msim
    9599                void *tail = dest[i - 1] + components[i].inflated;
    96100                if (tail >= ((void *) PA2KA(LOADER_OFFSET))) {
     
    99103                        halt();
    100104                }
     105#endif
    101106               
    102107                printf("%s ", components[i - 1].name);
  • boot/arch/mips32/src/putchar.c

    rb92a0ee rb183ce0a  
    3232#include <str.h>
    3333
     34#ifdef PUTCHAR_ADDRESS
     35#undef PUTCHAR_ADDRESS
     36#endif
     37
     38#if defined(MACHINE_msim)
     39#define _putchar(ch)    msim_putchar((ch))
     40static void msim_putchar(const wchar_t ch)
     41{
     42        *((char *) MSIM_VIDEORAM_ADDRESS) = ch;
     43}
     44#endif
     45
     46#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     47#define _putchar(ch)    yamon_putchar((ch))
     48typedef void (**yamon_print_count_ptr_t)(uint32_t, const char *, uint32_t);
     49yamon_print_count_ptr_t yamon_print_count =
     50    (yamon_print_count_ptr_t) YAMON_SUBR_PRINT_COUNT;
     51
     52static void yamon_putchar(const wchar_t wch)
     53{
     54        const char ch = (char) wch;
     55
     56        (*yamon_print_count)(0, &ch, 1);
     57}
     58#endif
     59
    3460void putchar(const wchar_t ch)
    3561{
    3662        if (ascii_check(ch))
    37                 *((char *) MSIM_VIDEORAM_ADDRESS) = ch;
     63                _putchar(ch);
    3864        else
    39                 *((char *) MSIM_VIDEORAM_ADDRESS) = U_SPECIAL;
     65                _putchar(U_SPECIAL);
    4066}
     67
  • contrib/conf/ia32-qe.sh

    rb92a0ee rb183ce0a  
    11#!/bin/sh
     2
     3if [ -z "${QEMU_BINARY}" ] ; then
     4        QEMU_BINARY="`which --tty-only qemu 2> /dev/null`"
     5fi
     6
     7if [ -z "${QEMU_BINARY}" ] ; then
     8        QEMU_BINARY="`which --tty-only qemu-system-i386 2> /dev/null`"
     9fi
     10
     11if [ -z "${QEMU_BINARY}" ] ; then
     12        echo "QEMU binary not found"
     13fi
    214
    315DISK_IMG=hdisk.img
     
    820fi
    921
    10 qemu $@ -m 32 -hda "$DISK_IMG" -cdrom image.iso -boot d
     22"${QEMU_BINARY}" "$@" -m 32 -hda "$DISK_IMG" -cdrom image.iso -boot d
  • contrib/conf/net-qe.sh

    rb92a0ee rb183ce0a  
    11#!/bin/sh
     2
     3if [ -z "${QEMU_BINARY}" ] ; then
     4        QEMU_BINARY="`which --tty-only qemu 2> /dev/null`"
     5fi
     6
     7if [ -z "${QEMU_BINARY}" ] ; then
     8        QEMU_BINARY="`which --tty-only qemu-system-x86_64 2> /dev/null`"
     9fi
     10
     11if [ -z "${QEMU_BINARY}" ] ; then
     12        QEMU_BINARY="`which --tty-only qemu-system-i386 2> /dev/null`"
     13fi
     14
     15if [ -z "${QEMU_BINARY}" ] ; then
     16        echo "QEMU binary not found"
     17fi
    218
    319case "$1" in
    420        ne2k)
    521                shift
    6                 qemu $@ -device ne2k_isa,irq=5,vlan=0 -net user -boot d -redir udp:8080::8080 -redir udp:8081::8081 -redir tcp:8080::8080 -redir tcp:8081::8081 -cdrom image.iso
     22                "${QEMU_BINARY}" "$@" -device ne2k_isa,irq=5,vlan=0 -net user -boot d -redir udp:8080::8080 -redir udp:8081::8081 -redir tcp:8080::8080 -redir tcp:8081::8081 -cdrom image.iso
    723                ;;
    824        e1k)
    925                shift
    10                 qemu $@ -device e1000,vlan=0 -net user -boot d -redir udp:8080::8080 -redir udp:8081::8081 -redir tcp:8080::8080 -redir tcp:8081::8081 -cdrom image.iso
     26                "${QEMU_BINARY}" "$@" -device e1000,vlan=0 -net user -boot d -redir udp:8080::8080 -redir udp:8081::8081 -redir tcp:8080::8080 -redir tcp:8081::8081 -cdrom image.iso
    1127                ;;
    1228        rtl8139)
    1329                shift
    14                 qemu $@ -device rtl8139,vlan=0 -net user -boot d -redir udp:8080::8080 -redir udp:8081::8081 -redir tcp:8080::8080 -redir tcp:8081::8081 -cdrom image.iso
     30                "${QEMU_BINARY}" "$@" -device rtl8139,vlan=0 -net user -boot d -redir udp:8080::8080 -redir udp:8081::8081 -redir tcp:8080::8080 -redir tcp:8081::8081 -cdrom image.iso
    1531                ;;
    1632        *)
  • kernel/arch/mips32/Makefile.inc

    rb92a0ee rb183ce0a  
    2929BFD_ARCH = mips
    3030BFD = binary
    31 GCC_CFLAGS += -msoft-float -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mips3 -mabi=32
     31GCC_CFLAGS += -msoft-float -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mabi=32
    3232
    3333BITS = 32
     
    3636#
    3737
    38 ifeq ($(MACHINE),lgxemul)
    39         BFD_NAME = elf32-tradlittlemips
    40         ENDIANESS = LE
    41 endif
    42 ifeq ($(MACHINE),bgxemul)
    43         BFD_NAME = elf32-tradbigmips
    44         ENDIANESS = BE
    45         GCC_CFLAGS += -D__BE__
    46 endif
    4738ifeq ($(MACHINE),msim)
    4839        BFD_NAME = elf32-tradlittlemips
    4940        ENDIANESS = LE
     41        GCC_CFLAGS += -march=r4000
     42endif
     43ifeq ($(MACHINE),bmalta)
     44        BFD_NAME = elf32-tradbigmips
     45        ENDIANESS = BE
     46        GCC_CFLAGS += -D__BE__ -march=4kc
     47endif
     48ifeq ($(MACHINE),lmalta)
     49        BFD_NAME = elf32-tradlittlemips
     50        ENDIANESS = LE
     51        GCC_CFLAGS += -march=4kc
    5052endif
    5153
     
    6971        arch/$(KARCH)/src/fpu_context.c \
    7072        arch/$(KARCH)/src/ddi/ddi.c \
    71         arch/$(KARCH)/src/smp/dorder.c \
    72         arch/$(KARCH)/src/smp/smp.c
     73        arch/$(KARCH)/src/smp/smp.c \
     74        arch/$(KARCH)/src/machine_func.c
     75
     76ifeq ($(MACHINE),msim)
     77        ARCH_SOURCES += \
     78                arch/$(KARCH)/src/smp/dorder.c
     79endif
     80
     81ifeq ($(MACHINE),$(filter lmalta bmalta,$(MACHINE)))
     82        ARCH_SOURCES += arch/$(KARCH)/src/mach/malta/malta.c
     83endif
     84ifeq ($(MACHINE),msim)
     85        ARCH_SOURCES += arch/$(KARCH)/src/mach/msim/msim.c
     86endif
     87
  • kernel/arch/mips32/_link.ld.in

    rb92a0ee rb183ce0a  
    1010#define mips mips
    1111
     12#if defined(MACHINE_msim)
    1213#define KERNEL_LOAD_ADDRESS 0x80100000
     14#endif
     15
     16#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     17#define KERNEL_LOAD_ADDRESS 0x80200000
     18#endif
    1319
    1420OUTPUT_ARCH(mips)
  • kernel/arch/mips32/include/arch/arch.h

    rb92a0ee rb183ce0a  
    4444extern size_t cpu_count;
    4545
     46#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     47extern size_t sdram_size;
     48#endif
     49
    4650typedef struct {
    4751        void *addr;
     
    5155
    5256typedef struct {
     57#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     58        uint32_t sdram_size;
     59#endif
    5360        uint32_t cpumap;
    5461        size_t cnt;
  • kernel/arch/mips32/include/arch/cp0.h

    rb92a0ee rb183ce0a  
    4545#define cp0_status_im_shift  8
    4646#define cp0_status_im_mask   0xff00
     47
     48#define cp0_cause_ip_shift  8
     49#define cp0_cause_ip_mask   0xff00
    4750
    4851#define cp0_cause_excno(cause)   ((cause >> 2) & 0x1f)
  • kernel/arch/mips32/include/arch/mm/tlb.h

    rb92a0ee rb183ce0a  
    4141#include <trace.h>
    4242
     43#if defined(PROCESSOR_R4000)
    4344#define TLB_ENTRY_COUNT  48
     45#define TLB_INDEX_BITS   6
     46#elif defined(PROCESSOR_4Kc)
     47#define TLB_ENTRY_COUNT  16
     48#define TLB_INDEX_BITS   4
     49#else
     50#error Please define TLB_ENTRY_COUNT for the target processor.
     51#endif
    4452
    45 #define TLB_WIRED               1
    46 #define TLB_KSTACK_WIRED_INDEX  0
     53#define TLB_WIRED               0
    4754
    4855#define TLB_PAGE_MASK_4K    (0x000 << 13)
     
    112119#ifdef __BE__
    113120                unsigned p : 1;
    114                 unsigned : 25;
    115                 unsigned index : 6;
     121                unsigned : 32 - TLB_INDEX_BITS - 1;
     122                unsigned index : TLB_INDEX_BITS;
    116123#else
    117                 unsigned index : 6;
    118                 unsigned : 25;
     124                unsigned index : TLB_INDEX_BITS;
     125                unsigned : 32 - TLB_INDEX_BITS - 1;
    119126                unsigned p : 1;
    120127#endif
  • kernel/arch/mips32/src/exception.c

    rb92a0ee rb183ce0a  
    165165static void interrupt_exception(unsigned int n, istate_t *istate)
    166166{
     167        uint32_t ip;
     168        uint32_t im;
     169
    167170        /* Decode interrupt number and process the interrupt */
    168         uint32_t cause = (cp0_cause_read() >> 8) & 0xff;
     171        ip = (cp0_cause_read() & cp0_cause_ip_mask) >> cp0_cause_ip_shift;
     172        im = (cp0_status_read() & cp0_status_im_mask) >> cp0_status_im_shift;
    169173       
    170174        unsigned int i;
    171175        for (i = 0; i < 8; i++) {
    172                 if (cause & (1 << i)) {
     176
     177                /*
     178                 * The interrupt could only occur if it is unmasked in the
     179                 * status register. On the other hand, an interrupt can be
     180                 * apparently pending even if it is masked, so we need to
     181                 * check both the masked and pending interrupts.
     182                 */
     183                if (im & ip & (1 << i)) {
    173184                        irq_t *irq = irq_dispatch_and_lock(i);
    174185                        if (irq) {
  • kernel/arch/mips32/src/interrupt.c

    rb92a0ee rb183ce0a  
    4545#define IRQ_COUNT   8
    4646#define TIMER_IRQ   7
     47
     48#ifdef MACHINE_msim
    4749#define DORDER_IRQ  5
     50#endif
    4851
    4952function virtual_timer_fnc = NULL;
    5053static irq_t timer_irq;
     54
     55#ifdef MACHINE_msim
    5156static irq_t dorder_irq;
     57#endif
    5258
    5359// TODO: This is SMP unsafe!!!
     
    151157}
    152158
     159#ifdef MACHINE_msim
    153160static irq_ownership_t dorder_claim(irq_t *irq)
    154161{
     
    160167        dorder_ipi_ack(1 << dorder_cpuid());
    161168}
     169#endif
    162170
    163171/* Initialize basic tables for exception dispatching */
     
    176184        cp0_unmask_int(TIMER_IRQ);
    177185       
     186#ifdef MACHINE_msim
    178187        irq_initialize(&dorder_irq);
    179188        dorder_irq.devno = device_assign_devno();
     
    184193       
    185194        cp0_unmask_int(DORDER_IRQ);
     195#endif
    186196}
    187197
  • kernel/arch/mips32/src/mips32.c

    rb92a0ee rb183ce0a  
    4141#include <memstr.h>
    4242#include <userspace.h>
    43 #include <console/console.h>
    4443#include <syscall/syscall.h>
    4544#include <sysinfo/sysinfo.h>
    4645#include <arch/debug.h>
    4746#include <arch/debugger.h>
    48 #include <arch/drivers/msim.h>
    49 #include <genarch/fb/fb.h>
    50 #include <genarch/drivers/dsrln/dsrlnin.h>
    51 #include <genarch/drivers/dsrln/dsrlnout.h>
    52 #include <genarch/srln/srln.h>
     47#include <arch/machine_func.h>
    5348
    5449/* Size of the code jumping to the exception handler code
     
    7065
    7166size_t cpu_count = 0;
     67
     68#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     69size_t sdram_size = 0;
     70#endif
    7271
    7372/** Performs mips32-specific initialization before main_bsp() is called. */
     
    8887                        cpu_count++;
    8988        }
     89
     90#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     91        sdram_size = bootinfo->sdram_size;
     92#endif
     93
     94        /* Initialize machine_ops pointer. */
     95        machine_ops_init();
    9096}
    9197
     
    124130{
    125131        interrupt_init();
    126        
    127 #ifdef CONFIG_FB
    128         /* GXemul framebuffer */
    129         fb_properties_t gxemul_prop = {
    130                 .addr = 0x12000000,
    131                 .offset = 0,
    132                 .x = 640,
    133                 .y = 480,
    134                 .scan = 1920,
    135                 .visual = VISUAL_RGB_8_8_8,
    136         };
    137        
    138         outdev_t *fbdev = fb_init(&gxemul_prop);
    139         if (fbdev)
    140                 stdout_wire(fbdev);
    141 #endif
    142 
    143 #ifdef CONFIG_MIPS_PRN
    144         outdev_t *dsrlndev = dsrlnout_init((ioport8_t *) MSIM_KBD_ADDRESS);
    145         if (dsrlndev)
    146                 stdout_wire(dsrlndev);
    147 #endif
     132
     133        machine_init();
     134        machine_output_init();
    148135}
    149136
     
    158145void arch_post_smp_init(void)
    159146{
    160         static const char *platform;
    161 
    162147        /* Set platform name. */
    163 #ifdef MACHINE_msim
    164         platform = "msim";
    165 #endif
    166 #ifdef MACHINE_bgxemul
    167         platform = "gxemul";
    168 #endif
    169 #ifdef MACHINE_lgxemul
    170         platform = "gxemul";
    171 #endif
    172         sysinfo_set_item_data("platform", NULL, (void *) platform,
    173             str_size(platform));
    174 
    175 #ifdef CONFIG_MIPS_KBD
    176         /*
    177          * Initialize the msim/GXemul keyboard port. Then initialize the serial line
    178          * module and connect it to the msim/GXemul keyboard. Enable keyboard interrupts.
    179          */
    180         dsrlnin_instance_t *dsrlnin_instance
    181             = dsrlnin_init((dsrlnin_t *) MSIM_KBD_ADDRESS, MSIM_KBD_IRQ);
    182         if (dsrlnin_instance) {
    183                 srln_instance_t *srln_instance = srln_init();
    184                 if (srln_instance) {
    185                         indev_t *sink = stdin_wire();
    186                         indev_t *srln = srln_wire(srln_instance, sink);
    187                         dsrlnin_wire(dsrlnin_instance, srln);
    188                         cp0_unmask_int(MSIM_KBD_IRQ);
    189                 }
    190         }
    191        
    192         /*
    193          * This is the necessary evil until the userspace driver is entirely
    194          * self-sufficient.
    195          */
    196         sysinfo_set_item_val("kbd", NULL, true);
    197         sysinfo_set_item_val("kbd.inr", NULL, MSIM_KBD_IRQ);
    198         sysinfo_set_item_val("kbd.address.physical", NULL,
    199             PA2KA(MSIM_KBD_ADDRESS));
    200 #endif
     148        sysinfo_set_item_data("platform", NULL,
     149            (void *) machine_get_platform_name(),
     150            str_size(machine_get_platform_name()));
     151
     152        machine_input_init();
    201153}
    202154
  • kernel/arch/mips32/src/mm/frame.c

    rb92a0ee rb183ce0a  
    4040#include <mm/asid.h>
    4141#include <config.h>
     42#ifdef MACHINE_msim
    4243#include <arch/drivers/msim.h>
     44#endif
     45#include <arch/arch.h>
    4346#include <print.h>
    4447
     
    8487                return false;
    8588#endif
    86        
    87 #if defined(MACHINE_lgxemul) || defined(MACHINE_bgxemul)
    88         /* gxemul devices */
    89         if (overlaps(frame << ZERO_PAGE_WIDTH, ZERO_PAGE_SIZE,
    90             0x10000000, MiB2SIZE(256)))
     89
     90#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     91        if (frame >= (sdram_size >> ZERO_PAGE_WIDTH))
    9192                return false;
    9293#endif
     
    225226                                        if (ZERO_PAGE_VALUE != 0xdeadbeef)
    226227                                                avail = false;
    227 #if defined(MACHINE_lgxemul) || defined(MACHINE_bgxemul)
    228                                         else {
    229                                                 ZERO_PAGE_VALUE_KSEG1(frame) = 0xaabbccdd;
    230                                                 if (ZERO_PAGE_VALUE_KSEG1(frame) != 0xaabbccdd)
    231                                                         avail = false;
    232                                         }
    233 #endif
    234228                                }
    235229                        }
     
    247241        /* Blacklist interrupt vector frame */
    248242        frame_mark_unavailable(0, 1);
     243
     244#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
     245        /* Blacklist memory regions used by YAMON.
     246         *
     247         * The YAMON User's Manual vaguely says the following physical addresses
     248         * are taken by YAMON:
     249         *
     250         * 0x1000       YAMON functions
     251         * 0x5000       YAMON code
     252         *
     253         * These addresses overlap with the beginning of the SDRAM so we need to
     254         * make sure they cannot be allocated.
     255         *
     256         * The User's Manual unfortunately does not say where does the SDRAM
     257         * portion used by YAMON end.
     258         *
     259         * Looking into the YAMON 02.21 sources, it looks like the first free
     260         * address is computed dynamically and depends on the size of the YAMON
     261         * image. From the YAMON binary, it appears to be 0xc0d50 or roughly
     262         * 772 KiB for that particular version.
     263         *
     264         * Linux is linked to 1MiB which seems to be a safe bet and a reasonable
     265         * upper bound for memory taken by YAMON. We will use it too.
     266         */
     267        frame_mark_unavailable(0, 1024 * 1024 / FRAME_SIZE);
     268#endif
    249269       
    250270        /* Cleanup */
  • kernel/arch/mips32/src/mm/tlb.c

    rb92a0ee rb183ce0a  
    4848#include <symtab.h>
    4949
    50 static pte_t *find_mapping_and_check(uintptr_t, int, istate_t *);
     50#define PFN_SHIFT       12
     51#define VPN_SHIFT       12
     52#define ADDR2VPN(a)     ((a) >> VPN_SHIFT)
     53#define ADDR2VPN2(a)    (ADDR2VPN((a)) >> 1)
     54#define VPN2ADDR(vpn)   ((vpn) << VPN_SHIFT)
     55#define VPN22ADDR(vpn2) (VPN2ADDR(vpn2) << 1)
     56#define PFN2ADDR(pfn)   ((pfn) << PFN_SHIFT)
     57
     58#define BANK_SELECT_BIT(a)      (((a) >> PAGE_WIDTH) & 1)
     59       
    5160
    5261/** Initialize TLB.
     
    8493{
    8594        entry_lo_t lo;
    86         entry_hi_t hi;
    87         asid_t asid;
    8895        uintptr_t badvaddr;
     96        uintptr_t page;
    8997        pte_t *pte;
    9098       
    9199        badvaddr = cp0_badvaddr_read();
    92         asid = AS->asid;
    93        
    94         pte = find_mapping_and_check(badvaddr, PF_ACCESS_READ, istate);
    95         if (pte) {
     100        page = ALIGN_DOWN(badvaddr, PAGE_SIZE);
     101
     102        pte = page_mapping_find(AS, page, true);
     103        if (pte && pte->p) {
    96104                /*
    97105                 * Record access to PTE.
     
    99107                pte->a = 1;
    100108
    101                 tlb_prepare_entry_hi(&hi, asid, badvaddr);
    102109                tlb_prepare_entry_lo(&lo, pte->g, pte->p, pte->d,
    103110                    pte->cacheable, pte->pfn);
     
    106113                 * New entry is to be inserted into TLB
    107114                 */
    108                 cp0_entry_hi_write(hi.value);
    109                 if ((badvaddr / PAGE_SIZE) % 2 == 0) {
     115                if (BANK_SELECT_BIT(badvaddr) == 0) {
    110116                        cp0_entry_lo0_write(lo.value);
    111117                        cp0_entry_lo1_write(0);
     
    116122                cp0_pagemask_write(TLB_PAGE_MASK_16K);
    117123                tlbwr();
    118         }
     124                return;
     125        }
     126
     127        (void) as_page_fault(page, PF_ACCESS_READ, istate);
    119128}
    120129
     
    125134void tlb_invalid(istate_t *istate)
    126135{
     136        entry_lo_t lo;
    127137        tlb_index_t index;
    128138        uintptr_t badvaddr;
    129         entry_lo_t lo;
    130         entry_hi_t hi;
     139        uintptr_t page;
    131140        pte_t *pte;
    132 
    133         badvaddr = cp0_badvaddr_read();
    134141
    135142        /*
    136143         * Locate the faulting entry in TLB.
    137144         */
    138         hi.value = cp0_entry_hi_read();
    139         tlb_prepare_entry_hi(&hi, hi.asid, badvaddr);
    140         cp0_entry_hi_write(hi.value);
    141145        tlbp();
    142146        index.value = cp0_index_read();
    143147
     148#if defined(PROCESSOR_4Kc)
     149        /*
     150         * This can happen on a 4Kc when Status.EXL is 1 and there is a TLB miss.
     151         * EXL is 1 when interrupts are disabled. The combination of a TLB miss
     152         * and disabled interrupts is possible in copy_to/from_uspace().
     153         */
     154        if (index.p) {
     155                tlb_refill(istate);
     156                return;
     157        }
     158#endif
     159
    144160        ASSERT(!index.p);
    145161
    146         pte = find_mapping_and_check(badvaddr, PF_ACCESS_READ, istate);
    147         if (pte) {
     162        badvaddr = cp0_badvaddr_read();
     163        page = ALIGN_DOWN(badvaddr, PAGE_SIZE);
     164
     165        pte = page_mapping_find(AS, page, true);
     166        if (pte && pte->p) {
    148167                /*
    149168                 * Read the faulting TLB entry.
     
    162181                 * The entry is to be updated in TLB.
    163182                 */
    164                 if ((badvaddr / PAGE_SIZE) % 2 == 0)
     183                if (BANK_SELECT_BIT(badvaddr) == 0)
    165184                        cp0_entry_lo0_write(lo.value);
    166185                else
    167186                        cp0_entry_lo1_write(lo.value);
    168                 cp0_pagemask_write(TLB_PAGE_MASK_16K);
    169187                tlbwi();
    170         }
     188                return;
     189        }
     190
     191        (void) as_page_fault(page, PF_ACCESS_READ, istate);
    171192}
    172193
     
    177198void tlb_modified(istate_t *istate)
    178199{
     200        entry_lo_t lo;
    179201        tlb_index_t index;
    180202        uintptr_t badvaddr;
    181         entry_lo_t lo;
    182         entry_hi_t hi;
     203        uintptr_t page;
    183204        pte_t *pte;
    184205
    185206        badvaddr = cp0_badvaddr_read();
     207        page = ALIGN_DOWN(badvaddr, PAGE_SIZE);
    186208
    187209        /*
    188210         * Locate the faulting entry in TLB.
    189211         */
    190         hi.value = cp0_entry_hi_read();
    191         tlb_prepare_entry_hi(&hi, hi.asid, badvaddr);
    192         cp0_entry_hi_write(hi.value);
    193212        tlbp();
    194213        index.value = cp0_index_read();
    195214
    196215        /*
    197          * Fail if the entry is not in TLB.
     216         * Emit warning if the entry is not in TLB.
     217         *
     218         * We do not assert on this because this could be a manifestation of
     219         * an emulator bug, such as QEMU Bug #1128935:
     220         * https://bugs.launchpad.net/qemu/+bug/1128935 
    198221         */
    199         ASSERT(!index.p);
    200 
    201         pte = find_mapping_and_check(badvaddr, PF_ACCESS_WRITE, istate);
    202         if (pte) {
     222        if (index.p) {
     223                printf("%s: TLBP failed in exception handler (badvaddr=%#"
     224                    PRIxn ", ASID=%d).\n", __func__, badvaddr,
     225                    AS ? AS->asid : -1);
     226                return;
     227        }
     228
     229        pte = page_mapping_find(AS, page, true);
     230        if (pte && pte->p && pte->w) {
    203231                /*
    204232                 * Read the faulting TLB entry.
     
    218246                 * The entry is to be updated in TLB.
    219247                 */
    220                 if ((badvaddr / PAGE_SIZE) % 2 == 0)
     248                if (BANK_SELECT_BIT(badvaddr) == 0)
    221249                        cp0_entry_lo0_write(lo.value);
    222250                else
    223251                        cp0_entry_lo1_write(lo.value);
    224                 cp0_pagemask_write(TLB_PAGE_MASK_16K);
    225252                tlbwi();
    226         }
    227 }
    228 
    229 /** Try to find PTE for faulting address.
    230  *
    231  * @param badvaddr      Faulting virtual address.
    232  * @param access        Access mode that caused the fault.
    233  * @param istate        Pointer to interrupted state.
    234  *
    235  * @return              PTE on success, NULL otherwise.
    236  */
    237 pte_t *find_mapping_and_check(uintptr_t badvaddr, int access, istate_t *istate)
    238 {
    239         entry_hi_t hi;
    240         pte_t *pte;
    241 
    242         hi.value = cp0_entry_hi_read();
    243 
    244         ASSERT(hi.asid == AS->asid);
    245 
    246         /*
    247          * Check if the mapping exists in page tables.
    248          */     
    249         pte = page_mapping_find(AS, badvaddr, true);
    250         if (pte && pte->p && (pte->w || access != PF_ACCESS_WRITE)) {
    251                 /*
    252                  * Mapping found in page tables.
    253                  * Immediately succeed.
    254                  */
    255                 return pte;
    256         }
    257 
    258         /*
    259          * Mapping not found in page tables.
    260          * Resort to higher-level page fault handler.
    261          */
    262         if (as_page_fault(badvaddr, access, istate) == AS_PF_OK) {
    263                 pte = page_mapping_find(AS, badvaddr, true);
    264                 ASSERT(pte && pte->p);
    265                 ASSERT(pte->w || access != PF_ACCESS_WRITE);
    266                 return pte;
    267         }
    268 
    269         return NULL;
     253                return;
     254        }
     255
     256        (void) as_page_fault(page, PF_ACCESS_WRITE, istate);
    270257}
    271258
     
    284271void tlb_prepare_entry_hi(entry_hi_t *hi, asid_t asid, uintptr_t addr)
    285272{
    286         hi->value = ALIGN_DOWN(addr, PAGE_SIZE * 2);
     273        hi->value = 0;
     274        hi->vpn2 = ADDR2VPN2(ALIGN_DOWN(addr, PAGE_SIZE));
    287275        hi->asid = asid;
    288276}
     
    291279void tlb_print(void)
    292280{
    293         page_mask_t mask;
    294         entry_lo_t lo0, lo1;
     281        page_mask_t mask, mask_save;
     282        entry_lo_t lo0, lo0_save, lo1, lo1_save;
    295283        entry_hi_t hi, hi_save;
    296284        unsigned int i;
    297285
    298286        hi_save.value = cp0_entry_hi_read();
    299        
    300         printf("[nr] [asid] [vpn2] [mask] [gvdc] [pfn ]\n");
     287        lo0_save.value = cp0_entry_lo0_read();
     288        lo1_save.value = cp0_entry_lo1_read();
     289        mask_save.value = cp0_pagemask_read();
     290       
     291        printf("[nr] [asid] [vpn2    ] [mask] [gvdc] [pfn     ]\n");
    301292       
    302293        for (i = 0; i < TLB_ENTRY_COUNT; i++) {
     
    309300                lo1.value = cp0_entry_lo1_read();
    310301               
    311                 printf("%-4u %-6u %#6x %#6x  %1u%1u%1u%1u  %#6x\n",
    312                     i, hi.asid, hi.vpn2, mask.mask,
    313                     lo0.g, lo0.v, lo0.d, lo0.c, lo0.pfn);
    314                 printf("                           %1u%1u%1u%1u  %#6x\n",
    315                     lo1.g, lo1.v, lo1.d, lo1.c, lo1.pfn);
     302                printf("%-4u %-6u %0#10x %-#6x  %1u%1u%1u%1u  %0#10x\n",
     303                    i, hi.asid, VPN22ADDR(hi.vpn2), mask.mask,
     304                    lo0.g, lo0.v, lo0.d, lo0.c, PFN2ADDR(lo0.pfn));
     305                printf("                               %1u%1u%1u%1u  %0#10x\n",
     306                    lo1.g, lo1.v, lo1.d, lo1.c, PFN2ADDR(lo1.pfn));
    316307        }
    317308       
    318309        cp0_entry_hi_write(hi_save.value);
     310        cp0_entry_lo0_write(lo0_save.value);
     311        cp0_entry_lo1_write(lo1_save.value);
     312        cp0_pagemask_write(mask_save.value);
    319313}
    320314
     
    322316void tlb_invalidate_all(void)
    323317{
    324         ipl_t ipl;
    325318        entry_lo_t lo0, lo1;
    326319        entry_hi_t hi_save;
    327320        int i;
    328321
     322        ASSERT(interrupts_disabled());
     323
    329324        hi_save.value = cp0_entry_hi_read();
    330         ipl = interrupts_disable();
    331325
    332326        for (i = TLB_WIRED; i < TLB_ENTRY_COUNT; i++) {
     
    346340        }
    347341       
    348         interrupts_restore(ipl);
    349342        cp0_entry_hi_write(hi_save.value);
    350343}
     
    356349void tlb_invalidate_asid(asid_t asid)
    357350{
    358         ipl_t ipl;
    359351        entry_lo_t lo0, lo1;
    360352        entry_hi_t hi, hi_save;
    361353        int i;
    362354
     355        ASSERT(interrupts_disabled());
    363356        ASSERT(asid != ASID_INVALID);
    364357
    365358        hi_save.value = cp0_entry_hi_read();
    366         ipl = interrupts_disable();
    367359       
    368360        for (i = 0; i < TLB_ENTRY_COUNT; i++) {
     
    386378        }
    387379       
    388         interrupts_restore(ipl);
    389380        cp0_entry_hi_write(hi_save.value);
    390381}
     
    400391{
    401392        unsigned int i;
    402         ipl_t ipl;
    403393        entry_lo_t lo0, lo1;
    404394        entry_hi_t hi, hi_save;
    405395        tlb_index_t index;
     396
     397        ASSERT(interrupts_disabled());
    406398       
    407399        if (asid == ASID_INVALID)
     
    409401
    410402        hi_save.value = cp0_entry_hi_read();
    411         ipl = interrupts_disable();
    412403
    413404        for (i = 0; i < cnt + 1; i += 2) {
    414                 hi.value = 0;
    415405                tlb_prepare_entry_hi(&hi, asid, page + i * PAGE_SIZE);
    416406                cp0_entry_hi_write(hi.value);
     
    439429        }
    440430       
    441         interrupts_restore(ipl);
    442431        cp0_entry_hi_write(hi_save.value);
    443432}
  • kernel/arch/mips64/src/mips64.c

    rb92a0ee rb183ce0a  
    4646#include <arch/debug.h>
    4747#include <arch/debugger.h>
     48#ifdef MACHINE_msim
    4849#include <arch/drivers/msim.h>
     50#endif
    4951#include <genarch/fb/fb.h>
    5052#include <genarch/drivers/dsrln/dsrlnin.h>
     
    125127        interrupt_init();
    126128       
    127 #ifdef CONFIG_MIPS_PRN
     129#ifdef CONFIG_MSIM_PRN
    128130        outdev_t *dsrlndev = dsrlnout_init((ioport8_t *) MSIM_KBD_ADDRESS);
    129131        if (dsrlndev)
     
    151153            str_size(platform));
    152154       
    153 #ifdef CONFIG_MIPS_KBD
    154         /*
    155          * Initialize the msim/GXemul keyboard port. Then initialize the serial line
    156          * module and connect it to the msim/GXemul keyboard. Enable keyboard interrupts.
     155#ifdef CONFIG_MSIM_KBD
     156        /*
     157         * Initialize the msim keyboard port. Then initialize the serial line
     158         * module and connect it to the msim keyboard. Enable keyboard
     159         * interrupts.
    157160         */
    158161        dsrlnin_instance_t *dsrlnin_instance
  • kernel/arch/mips64/src/mm/frame.c

    rb92a0ee rb183ce0a  
    4040#include <mm/asid.h>
    4141#include <config.h>
     42#ifdef MACHINE_msim
    4243#include <arch/drivers/msim.h>
     44#endif
    4345#include <print.h>
    4446
  • kernel/generic/include/mm/tlb.h

    rb92a0ee rb183ce0a  
    7373extern void tlb_shootdown_ipi_recv(void);
    7474#else
    75 #define tlb_shootdown_start(w, x, y, z) (0)
    76 #define tlb_shootdown_finalize(i)       ((i) = (i));
     75#define tlb_shootdown_start(w, x, y, z) interrupts_disable()   
     76#define tlb_shootdown_finalize(i)       (interrupts_restore(i));
    7777#define tlb_shootdown_ipi_recv()
    7878#endif /* CONFIG_SMP */
  • release/Makefile

    rb92a0ee rb183ce0a  
    3333
    3434PROFILES = amd64 arm32/integratorcp arm32/gta02 arm32/beagleboardxm ia32 \
    35     ia64/i460GX ia64/ski mips32/GXemul mips32/msim ppc32 \
    36     sparc64/ultra
     35    ia64/i460GX ia64/ski mips32/msim ppc32 sparc64/ultra
    3736
    3837BZR = bzr
  • tools/autotool.py

    rb92a0ee rb183ce0a  
    224224                cc_args.append("-mabi=32")
    225225               
    226                 if ((config['MACHINE'] == "lgxemul") or (config['MACHINE'] == "msim")):
     226                if ((config['MACHINE'] == "msim") or (config['MACHINE'] == "lmalta")):
    227227                        target = config['PLATFORM']
    228228                        gnu_target = "mipsel-linux-gnu"
    229229               
    230                 if (config['MACHINE'] == "bgxemul"):
     230                if ((config['MACHINE'] == "bmalta")):
    231231                        target = "mips32eb"
    232232                        gnu_target = "mips-linux-gnu"
     
    715715                if (config['COMPILER'] == "gcc_cross"):
    716716                        target, cc_args, gnu_target, clang_target_unused = get_target(config)
    717                                
    718717                        path = "%s/%s/bin" % (cross_prefix, target)
    719718                        prefix = "%s-" % gnu_target
  • uspace/Makefile

    rb92a0ee rb183ce0a  
    9393        srv/bd/sata_bd \
    9494        srv/bd/file_bd \
    95         srv/bd/gxe_bd \
    9695        srv/bd/rd \
    9796        srv/bd/part/guid_part \
  • uspace/app/init/init.c

    rb92a0ee rb183ce0a  
    369369#ifdef CONFIG_START_BD
    370370        srv_start("/srv/ata_bd");
    371         srv_start("/srv/gxe_bd");
    372371#endif
    373372       
  • uspace/app/netecho/netecho.c

    rb92a0ee rb183ce0a  
    243243                if (verbose)
    244244                        printf("accept()\n");
    245                 socket_id = accept(listening_id, (void *) address_buf, &addrlen);
     245                socket_id = accept(listening_id, (void *) address_buf, &addrlen);
    246246                if (socket_id <= 0) {
    247247                        socket_print_error(stderr, socket_id, "Socket accept: ", "\n");
     
    312312                                rc = sendto(socket_id, reply ? reply : data, reply ? reply_length : length, 0, address, addrlen);
    313313                                if (rc != EOK)
    314                                         socket_print_error(stderr, rc, "Socket send: ", "\n");
     314                                        socket_print_error(stderr, rc, "Socket sendto: ", "\n");
    315315                        }
    316316                }
     
    394394                return listening_id;
    395395        }
    396 
     396       
     397        /* Bind the listening socket */
     398        rc = bind(listening_id, address, addrlen);
     399        if (rc != EOK) {
     400                socket_print_error(stderr, rc, "Socket bind: ", "\n");
     401                return rc;
     402        }
     403       
    397404        /* if the stream socket is used */
    398405        if (type == SOCK_STREAM) {
     
    402409                        backlog = 3;
    403410                }
    404 
     411               
    405412                /* Set the backlog */
    406413                rc = listen(listening_id, backlog);
     
    409416                        return rc;
    410417                }
    411         }
    412 
    413         /* Bind the listening socket */
    414         rc = bind(listening_id, address, addrlen);
    415         if (rc != EOK) {
    416                 socket_print_error(stderr, rc, "Socket bind: ", "\n");
    417                 return rc;
    418418        }
    419419
  • uspace/app/nettest3/nettest3.c

    rb92a0ee rb183ce0a  
    6363        port = 7;
    6464
    65         data = (char *)"Hello World!";
     65        data = (char *) "Hello World!";
    6666        size = str_size(data);
    6767
     
    9898
    9999        printf("connect()\n");
    100         rc = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
     100        rc = connect(fd, (struct sockaddr *) &addr, sizeof(addr));
    101101        printf(" -> %d\n", rc);
    102102        if (rc != 0)
     
    115115        } while (rc > 0);
    116116
    117         async_usleep(1000*1000);
     117        async_usleep(1000 * 1000);
    118118
    119119        printf("closesocket()\n");
     
    124124}
    125125
    126 
    127126/** @}
    128127 */
  • uspace/lib/c/arch/mips32/Makefile.common

    rb92a0ee rb183ce0a  
    2727#
    2828
    29 GCC_CFLAGS += -msoft-float -mips3 -mabi=32
     29GCC_CFLAGS += -msoft-float -mabi=32
    3030BASE_LIBS += $(LIBSOFTFLOAT_PREFIX)/libsoftfloat.a
    3131
     
    3434BFD_ARCH = mips
    3535BFD_NAME = elf32-tradlittlemips
     36
     37ifeq ($(MACHINE),msim)
     38        GCC_CFLAGS += -march=r4000
     39endif
     40
     41ifeq ($(MACHINE),lmalta)
     42        GCC_CFLAGS += -march=4kc
     43endif
     44
  • uspace/lib/c/arch/mips32eb/Makefile.common

    rb92a0ee rb183ce0a  
    2727#
    2828
    29 GCC_CFLAGS += -msoft-float -mips3 -mabi=32
     29GCC_CFLAGS += -msoft-float -mabi=32
    3030BASE_LIBS += $(LIBSOFTFLOAT_PREFIX)/libsoftfloat.a
    3131
     
    3434BFD_ARCH = mips
    3535BFD_NAME = elf32-tradbigmips
     36
     37ifeq ($(MACHINE),bmalta)
     38        GCC_CFLAGS += -march=4kc
     39endif
     40
  • uspace/lib/c/generic/async.c

    rb92a0ee rb183ce0a  
    350350static async_client_conn_t client_connection = default_client_connection;
    351351static async_interrupt_handler_t interrupt_received = default_interrupt_received;
    352 static size_t interrupt_handler_stksz = (size_t) -1;
     352static size_t interrupt_handler_stksz = FIBRIL_DFLT_STK_SIZE;
    353353
    354354/** Setter for client_connection function pointer.
     
    375375/** Set the stack size for the interrupt handler notification fibrils.
    376376 *
    377  * @param size Stack size. Use -1 to use the system default stack size.
     377 * @param size Stack size in bytes.
    378378 */
    379379void async_set_interrupt_handler_stack_size(size_t size)
     
    20682068       
    20692069        async_sess_t *sess = exch->sess;
     2070        assert(sess != NULL);
    20702071       
    20712072        atomic_dec(&sess->refcnt);
  • uspace/lib/c/generic/fibril.c

    rb92a0ee rb183ce0a  
    256256 * @param func Implementing function of the new fibril.
    257257 * @param arg Argument to pass to func.
    258  * @param stksz Stack size, -1 for the system default stack size.
     258 * @param stksz Stack size in bytes.
    259259 *
    260260 * @return 0 on failure or TLS of the new fibril.
     
    269269                return 0;
    270270       
    271         size_t stack_size = (stksz == (size_t) -1) ? stack_size_get() : stksz;
     271        size_t stack_size = (stksz == FIBRIL_DFLT_STK_SIZE) ?
     272            stack_size_get() : stksz;
    272273        fibril->stack = as_area_create((void *) -1, stack_size,
    273274            AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE | AS_AREA_GUARD |
  • uspace/lib/c/generic/net/socket_client.c

    rb92a0ee rb183ce0a  
    192192/** Default thread for new connections.
    193193 *
    194  * @param[in] iid       The initial message identifier.
    195  * @param[in] icall     The initial message call structure.
    196  * @param[in] arg       Local argument.
     194 * @param[in] iid   The initial message identifier.
     195 * @param[in] icall The initial message call structure.
     196 * @param[in] arg   Local argument.
     197 *
    197198 */
    198199static void socket_connection(ipc_callid_t iid, ipc_call_t * icall, void *arg)
    199200{
    200         ipc_callid_t callid;
    201         ipc_call_t call;
    202         socket_t *socket;
    203         int rc;
    204 
    205 loop:
    206         callid = async_get_call(&call);
    207 
    208         switch (IPC_GET_IMETHOD(call)) {
    209         case NET_SOCKET_RECEIVED:
    210         case NET_SOCKET_ACCEPTED:
    211         case NET_SOCKET_DATA_FRAGMENT_SIZE:
    212                 fibril_rwlock_read_lock(&socket_globals.lock);
    213 
    214                 /* Find the socket */
    215                 socket = sockets_find(socket_get_sockets(),
    216                     SOCKET_GET_SOCKET_ID(call));
    217                 if (!socket) {
    218                         rc = ENOTSOCK;
    219                         fibril_rwlock_read_unlock(&socket_globals.lock);
    220                         break;
     201        while (true) {
     202                ipc_call_t call;
     203                ipc_callid_t callid = async_get_call(&call);
     204               
     205                if (!IPC_GET_IMETHOD(call)) {
     206                        async_answer_0(callid, 0);
     207                        return;
    221208                }
     209               
     210                int rc;
    222211               
    223212                switch (IPC_GET_IMETHOD(call)) {
    224213                case NET_SOCKET_RECEIVED:
    225                         fibril_mutex_lock(&socket->receive_lock);
    226                         /* Push the number of received packet fragments */
    227                         rc = dyn_fifo_push(&socket->received,
    228                             SOCKET_GET_DATA_FRAGMENTS(call),
    229                             SOCKET_MAX_RECEIVED_SIZE);
    230                         if (rc == EOK) {
    231                                 /* Signal the received packet */
    232                                 fibril_condvar_signal(&socket->receive_signal);
     214                case NET_SOCKET_ACCEPTED:
     215                case NET_SOCKET_DATA_FRAGMENT_SIZE:
     216                        fibril_rwlock_read_lock(&socket_globals.lock);
     217                       
     218                        /* Find the socket */
     219                        socket_t *socket = sockets_find(socket_get_sockets(),
     220                            SOCKET_GET_SOCKET_ID(call));
     221                        if (!socket) {
     222                                rc = ENOTSOCK;
     223                                fibril_rwlock_read_unlock(&socket_globals.lock);
     224                                break;
    233225                        }
    234                         fibril_mutex_unlock(&socket->receive_lock);
     226                       
     227                        switch (IPC_GET_IMETHOD(call)) {
     228                        case NET_SOCKET_RECEIVED:
     229                                fibril_mutex_lock(&socket->receive_lock);
     230                                /* Push the number of received packet fragments */
     231                                rc = dyn_fifo_push(&socket->received,
     232                                    SOCKET_GET_DATA_FRAGMENTS(call),
     233                                    SOCKET_MAX_RECEIVED_SIZE);
     234                                if (rc == EOK) {
     235                                        /* Signal the received packet */
     236                                        fibril_condvar_signal(&socket->receive_signal);
     237                                }
     238                                fibril_mutex_unlock(&socket->receive_lock);
     239                                break;
     240                               
     241                        case NET_SOCKET_ACCEPTED:
     242                                /* Push the new socket identifier */
     243                                fibril_mutex_lock(&socket->accept_lock);
     244                                rc = dyn_fifo_push(&socket->accepted, 1,
     245                                    SOCKET_MAX_ACCEPTED_SIZE);
     246                                if (rc == EOK) {
     247                                        /* Signal the accepted socket */
     248                                        fibril_condvar_signal(&socket->accept_signal);
     249                                }
     250                                fibril_mutex_unlock(&socket->accept_lock);
     251                                break;
     252                       
     253                        default:
     254                                rc = ENOTSUP;
     255                        }
     256                       
     257                        if ((SOCKET_GET_DATA_FRAGMENT_SIZE(call) > 0) &&
     258                            (SOCKET_GET_DATA_FRAGMENT_SIZE(call) !=
     259                            socket->data_fragment_size)) {
     260                                fibril_rwlock_write_lock(&socket->sending_lock);
     261                               
     262                                /* Set the data fragment size */
     263                                socket->data_fragment_size =
     264                                    SOCKET_GET_DATA_FRAGMENT_SIZE(call);
     265                               
     266                                fibril_rwlock_write_unlock(&socket->sending_lock);
     267                        }
     268                       
     269                        fibril_rwlock_read_unlock(&socket_globals.lock);
    235270                        break;
    236 
    237                 case NET_SOCKET_ACCEPTED:
    238                         /* Push the new socket identifier */
    239                         fibril_mutex_lock(&socket->accept_lock);
    240                         rc = dyn_fifo_push(&socket->accepted, 1,
    241                             SOCKET_MAX_ACCEPTED_SIZE);
    242                         if (rc == EOK) {
    243                                 /* Signal the accepted socket */
    244                                 fibril_condvar_signal(&socket->accept_signal);
    245                         }
    246                         fibril_mutex_unlock(&socket->accept_lock);
    247                         break;
    248 
     271                       
    249272                default:
    250273                        rc = ENOTSUP;
    251274                }
    252 
    253                 if ((SOCKET_GET_DATA_FRAGMENT_SIZE(call) > 0) &&
    254                     (SOCKET_GET_DATA_FRAGMENT_SIZE(call) !=
    255                     socket->data_fragment_size)) {
    256                         fibril_rwlock_write_lock(&socket->sending_lock);
    257 
    258                         /* Set the data fragment size */
    259                         socket->data_fragment_size =
    260                             SOCKET_GET_DATA_FRAGMENT_SIZE(call);
    261 
    262                         fibril_rwlock_write_unlock(&socket->sending_lock);
    263                 }
    264 
    265                 fibril_rwlock_read_unlock(&socket_globals.lock);
    266                 break;
    267 
    268         default:
    269                 rc = ENOTSUP;
    270         }
    271 
    272         async_answer_0(callid, (sysarg_t) rc);
    273         goto loop;
     275               
     276                async_answer_0(callid, (sysarg_t) rc);
     277        }
    274278}
    275279
  • uspace/lib/c/include/fibril.h

    rb92a0ee rb183ce0a  
    8686extern void context_restore(context_t *ctx) __attribute__((noreturn));
    8787
     88#define FIBRIL_DFLT_STK_SIZE    0
     89
    8890#define fibril_create(func, arg) \
    89         fibril_create_generic((func), (arg), (size_t) -1)
     91        fibril_create_generic((func), (arg), FIBRIL_DFLT_STK_SIZE)
    9092extern fid_t fibril_create_generic(int (*func)(void *), void *arg, size_t);
    9193extern void fibril_destroy(fid_t fid);
  • uspace/srv/hid/input/Makefile

    rb92a0ee rb183ce0a  
    3939        port/adb_mouse.c \
    4040        port/chardev.c \
    41         port/gxemul.c \
    4241        port/msim.c \
    4342        port/niagara.c \
     
    4847        proto/mousedev.c \
    4948        ctl/apple.c \
    50         ctl/gxe_fb.c \
    5149        ctl/kbdev.c \
    5250        ctl/pc.c \
  • uspace/srv/hid/input/input.c

    rb92a0ee rb183ce0a  
    440440        kbd_add_dev(&msim_port, &stty_ctl);
    441441#endif
    442 #if (defined(MACHINE_lgxemul) || defined(MACHINE_bgxemul)) && defined(CONFIG_FB)
    443         kbd_add_dev(&gxemul_port, &gxe_fb_ctl);
    444 #endif
    445 #if defined(MACHINE_lgxemul) || defined(MACHINE_bgxemul) && !defined(CONFIG_FB)
    446         kbd_add_dev(&gxemul_port, &stty_ctl);
    447 #endif
    448442#if defined(UARCH_ppc32)
    449443        kbd_add_dev(&adb_port, &apple_ctl);
  • uspace/srv/hid/input/kbd_ctl.h

    rb92a0ee rb183ce0a  
    4949
    5050extern kbd_ctl_ops_t apple_ctl;
    51 extern kbd_ctl_ops_t gxe_fb_ctl;
    5251extern kbd_ctl_ops_t kbdev_ctl;
    5352extern kbd_ctl_ops_t pc_ctl;
  • uspace/srv/hid/input/kbd_port.h

    rb92a0ee rb183ce0a  
    5151extern kbd_port_ops_t adb_port;
    5252extern kbd_port_ops_t chardev_port;
    53 extern kbd_port_ops_t gxemul_port;
    5453extern kbd_port_ops_t msim_port;
    5554extern kbd_port_ops_t niagara_port;
  • uspace/srv/net/tcp/conn.c

    rb92a0ee rb183ce0a  
    354354{
    355355        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_conn_find_ref(%p)", sp);
    356 
     356       
     357        log_msg(LOG_DEFAULT, LVL_DEBUG2, "compare conn (f:(%x,%u), l:(%x,%u))",
     358            sp->foreign.addr.ipv4, sp->foreign.port,
     359            sp->local.addr.ipv4, sp->local.port);
     360       
    357361        fibril_mutex_lock(&conn_list_lock);
    358 
     362       
    359363        list_foreach(conn_list, link) {
    360364                tcp_conn_t *conn = list_get_instance(link, tcp_conn_t, link);
    361365                tcp_sockpair_t *csp = &conn->ident;
    362                 log_msg(LOG_DEFAULT, LVL_DEBUG2, "compare with conn (f:(%x,%u), l:(%x,%u))",
     366               
     367                log_msg(LOG_DEFAULT, LVL_DEBUG2, " - with (f:(%x,%u), l:(%x,%u))",
    363368                    csp->foreign.addr.ipv4, csp->foreign.port,
    364369                    csp->local.addr.ipv4, csp->local.port);
     370               
    365371                if (tcp_sockpair_match(sp, csp)) {
    366372                        tcp_conn_addref(conn);
     
    369375                }
    370376        }
    371 
     377       
    372378        fibril_mutex_unlock(&conn_list_lock);
    373379        return NULL;
  • uspace/srv/net/tcp/sock.c

    rb92a0ee rb183ce0a  
    203203{
    204204        int rc;
    205         struct sockaddr *addr;
    206         size_t addr_len;
     205        struct sockaddr_in *addr;
     206        size_t addr_size;
    207207        socket_core_t *sock_core;
    208208        tcp_sockdata_t *socket;
    209 
     209       
    210210        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_bind()");
    211211        log_msg(LOG_DEFAULT, LVL_DEBUG, " - async_data_write_accept");
    212         rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_len);
     212       
     213        addr = NULL;
     214       
     215        rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_size);
    213216        if (rc != EOK) {
    214217                async_answer_0(callid, rc);
    215                 return;
    216         }
    217 
     218                goto out;
     219        }
     220       
     221        if (addr_size != sizeof(struct sockaddr_in)) {
     222                async_answer_0(callid, EINVAL);
     223                goto out;
     224        }
     225       
    218226        log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_bind");
    219227        rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call),
    220             addr, addr_len, TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
     228            addr, addr_size, TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
    221229            last_used_port);
    222230        if (rc != EOK) {
    223231                async_answer_0(callid, rc);
    224                 return;
    225         }
    226 
     232                goto out;
     233        }
     234       
    227235        log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_cores_find");
    228236        sock_core = socket_cores_find(&client->sockets, SOCKET_GET_SOCKET_ID(call));
    229         if (sock_core != NULL) {
    230                 socket = (tcp_sockdata_t *)sock_core->specific_data;
    231                 /* XXX Anything to do? */
    232                 (void) socket;
    233         }
    234 
     237        if (sock_core == NULL) {
     238                async_answer_0(callid, ENOENT);
     239                goto out;
     240        }
     241       
     242        socket = (tcp_sockdata_t *)sock_core->specific_data;
     243        /* XXX Anything to do? */
     244        (void) socket;
     245       
    235246        log_msg(LOG_DEFAULT, LVL_DEBUG, " - success");
    236247        async_answer_0(callid, EOK);
     248       
     249out:
     250        if (addr != NULL)
     251                free(addr);
    237252}
    238253
     
    249264        tcp_sock_lconn_t *lconn;
    250265        int i;
     266        int rc;
    251267
    252268        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_listen()");
     
    268284                return;
    269285        }
    270 
    271         socket = (tcp_sockdata_t *)sock_core->specific_data;
    272 
     286       
     287        if (sock_core->port <= 0) {
     288                rc = socket_bind_free_port(&gsock, sock_core,
     289                    TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
     290                    last_used_port);
     291                if (rc != EOK) {
     292                        async_answer_0(callid, rc);
     293                        return;
     294                }
     295               
     296                last_used_port = sock_core->port;
     297        }
     298       
     299        socket = (tcp_sockdata_t *) sock_core->specific_data;
     300       
    273301        /*
    274302         * Prepare @c backlog listening connections.
    275303         */
    276304        fibril_mutex_lock(&socket->lock);
    277 
     305       
    278306        socket->backlog = backlog;
    279307        socket->lconn = calloc(backlog, sizeof(tcp_conn_t *));
     
    283311                return;
    284312        }
    285 
     313       
    286314        log_msg(LOG_DEFAULT, LVL_DEBUG, " - open connections");
    287 
     315       
    288316        lsocket.addr.ipv4 = TCP_IPV4_ANY;
    289317        lsocket.port = sock_core->port;
    290318        fsocket.addr.ipv4 = TCP_IPV4_ANY;
    291319        fsocket.port = TCP_PORT_ANY;
    292 
     320       
    293321        for (i = 0; i < backlog; i++) {
    294322
     
    362390                        return;
    363391                }
    364 
     392               
    365393                last_used_port = sock_core->port;
    366394        }
     
    441469                return;
    442470        }
     471       
     472        if (sock_core->port <= 0) {
     473                rc = socket_bind_free_port(&gsock, sock_core,
     474                    TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,
     475                    last_used_port);
     476                if (rc != EOK) {
     477                        async_answer_0(callid, rc);
     478                        return;
     479                }
     480               
     481                last_used_port = sock_core->port;
     482        }
    443483
    444484        socket = (tcp_sockdata_t *)sock_core->specific_data;
  • uspace/srv/net/udp/assoc.c

    rb92a0ee rb183ce0a  
    200200/** Set local socket in association.
    201201 *
    202  * @param assoc         Association
    203  * @param fsock         Foreign socket (deeply copied)
     202 * @param assoc Association
     203 * @param lsock Local socket (deeply copied)
     204 *
    204205 */
    205206void udp_assoc_set_local(udp_assoc_t *assoc, udp_sock_t *lsock)
     
    208209        fibril_mutex_lock(&assoc->lock);
    209210        assoc->ident.local = *lsock;
     211        fibril_mutex_unlock(&assoc->lock);
     212}
     213
     214/** Set local port in association.
     215 *
     216 * @param assoc Association
     217 * @param lport Local port
     218 *
     219 */
     220void udp_assoc_set_local_port(udp_assoc_t *assoc, uint16_t lport)
     221{
     222        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_set_local(%p, %" PRIu16 ")", assoc, lport);
     223        fibril_mutex_lock(&assoc->lock);
     224        assoc->ident.local.port = lport;
    210225        fibril_mutex_unlock(&assoc->lock);
    211226}
     
    406421}
    407422
    408 
    409423/**
    410424 * @}
  • uspace/srv/net/udp/assoc.h

    rb92a0ee rb183ce0a  
    4747extern void udp_assoc_set_foreign(udp_assoc_t *, udp_sock_t *);
    4848extern void udp_assoc_set_local(udp_assoc_t *, udp_sock_t *);
     49extern void udp_assoc_set_local_port(udp_assoc_t *, uint16_t);
    4950extern int udp_assoc_send(udp_assoc_t *, udp_sock_t *, udp_msg_t *);
    5051extern int udp_assoc_recv(udp_assoc_t *, udp_msg_t **, udp_sock_t *);
  • uspace/srv/net/udp/sock.c

    rb92a0ee rb183ce0a  
    9090        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_notify_data(%d)", sock_core->socket_id);
    9191        async_exch_t *exch = async_exchange_begin(sock_core->sess);
    92         async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t)sock_core->socket_id,
     92        async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t) sock_core->socket_id,
    9393            UDP_FRAGMENT_SIZE, 0, 0, 1);
    9494        async_exchange_end(exch);
     
    177177                goto out;
    178178        }
    179 
     179       
     180        if (addr_size != sizeof(struct sockaddr_in)) {
     181                async_answer_0(callid, EINVAL);
     182                goto out;
     183        }
     184       
    180185        log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_bind");
    181186        rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call),
     
    186191                goto out;
    187192        }
    188 
    189         if (addr_size != sizeof(struct sockaddr_in)) {
    190                 async_answer_0(callid, EINVAL);
    191                 goto out;
    192         }
    193 
     193       
    194194        log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_cores_find");
    195195        sock_core = socket_cores_find(&client->sockets, SOCKET_GET_SOCKET_ID(call));
     
    249249static void udp_sock_sendto(udp_client_t *client, ipc_callid_t callid, ipc_call_t call)
    250250{
    251         int socket_id;
    252         int fragments;
    253         int index;
    254         struct sockaddr_in *addr;
    255         size_t addr_size;
    256         socket_core_t *sock_core;
    257         udp_sockdata_t *socket;
    258         udp_sock_t fsock, *fsockp;
    259         ipc_call_t answer;
    260         ipc_callid_t wcallid;
    261         size_t length;
    262         uint8_t buffer[UDP_FRAGMENT_SIZE];
    263         udp_error_t urc;
    264         int rc;
    265 
    266251        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_send()");
    267 
    268         addr = NULL;
    269 
     252       
     253        struct sockaddr_in *addr = NULL;
     254        udp_sock_t fsock;
     255        udp_sock_t *fsock_ptr;
     256       
    270257        if (IPC_GET_IMETHOD(call) == NET_SOCKET_SENDTO) {
    271                 rc = async_data_write_accept((void **) &addr, false,
     258                size_t addr_size;
     259                int rc = async_data_write_accept((void **) &addr, false,
    272260                    0, 0, 0, &addr_size);
    273261                if (rc != EOK) {
     
    275263                        goto out;
    276264                }
    277 
     265               
    278266                if (addr_size != sizeof(struct sockaddr_in)) {
    279267                        async_answer_0(callid, EINVAL);
    280268                        goto out;
    281269                }
    282 
     270               
    283271                fsock.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr);
    284272                fsock.port = uint16_t_be2host(addr->sin_port);
    285                 fsockp = &fsock;
    286         } else {
    287                 fsockp = NULL;
    288         }
    289 
    290         socket_id = SOCKET_GET_SOCKET_ID(call);
    291         fragments = SOCKET_GET_DATA_FRAGMENTS(call);
     273                fsock_ptr = &fsock;
     274        } else
     275                fsock_ptr = NULL;
     276       
     277        int socket_id = SOCKET_GET_SOCKET_ID(call);
     278       
    292279        SOCKET_GET_FLAGS(call);
    293 
    294         sock_core = socket_cores_find(&client->sockets, socket_id);
     280       
     281        socket_core_t *sock_core =
     282            socket_cores_find(&client->sockets, socket_id);
    295283        if (sock_core == NULL) {
    296284                async_answer_0(callid, ENOTSOCK);
    297285                goto out;
    298286        }
    299 
    300         if (sock_core->port == 0) {
     287       
     288        udp_sockdata_t *socket =
     289            (udp_sockdata_t *) sock_core->specific_data;
     290       
     291        if (sock_core->port <= 0) {
    301292                /* Implicitly bind socket to port */
    302                 rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call),
    303                     addr, addr_size, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END,
    304                     last_used_port);
     293                int rc = socket_bind_free_port(&gsock, sock_core,
     294                    UDP_FREE_PORTS_START, UDP_FREE_PORTS_END, last_used_port);
    305295                if (rc != EOK) {
    306296                        async_answer_0(callid, rc);
    307297                        goto out;
    308298                }
    309         }
    310 
    311         socket = (udp_sockdata_t *)sock_core->specific_data;
     299               
     300                assert(sock_core->port > 0);
     301               
     302                udp_error_t urc = udp_uc_set_local_port(socket->assoc,
     303                    sock_core->port);
     304               
     305                if (urc != UDP_EOK) {
     306                        // TODO: better error handling
     307                        async_answer_0(callid, EINTR);
     308                        goto out;
     309                }
     310               
     311                last_used_port = sock_core->port;
     312        }
     313       
    312314        fibril_mutex_lock(&socket->lock);
    313 
     315       
    314316        if (socket->assoc->ident.local.addr.ipv4 == UDP_IPV4_ANY) {
    315317                /* Determine local IP address */
    316318                inet_addr_t loc_addr, rem_addr;
    317 
    318                 rem_addr.ipv4 = fsockp ? fsock.addr.ipv4 :
     319               
     320                rem_addr.ipv4 = fsock_ptr ? fsock.addr.ipv4 :
    319321                    socket->assoc->ident.foreign.addr.ipv4;
    320 
    321                 rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr);
     322               
     323                int rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr);
    322324                if (rc != EOK) {
    323325                        fibril_mutex_unlock(&socket->lock);
     
    327329                        return;
    328330                }
    329 
     331               
    330332                socket->assoc->ident.local.addr.ipv4 = loc_addr.ipv4;
    331333                log_msg(LOG_DEFAULT, LVL_DEBUG, "Local IP address is %x",
    332334                    socket->assoc->ident.local.addr.ipv4);
    333335        }
    334 
    335 
     336       
    336337        assert(socket->assoc != NULL);
    337 
    338         for (index = 0; index < fragments; index++) {
     338       
     339        int fragments = SOCKET_GET_DATA_FRAGMENTS(call);
     340        for (int index = 0; index < fragments; index++) {
     341                ipc_callid_t wcallid;
     342                size_t length;
     343               
    339344                if (!async_data_write_receive(&wcallid, &length)) {
    340345                        fibril_mutex_unlock(&socket->lock);
     
    342347                        goto out;
    343348                }
    344 
     349               
    345350                if (length > UDP_FRAGMENT_SIZE)
    346351                        length = UDP_FRAGMENT_SIZE;
    347 
    348                 rc = async_data_write_finalize(wcallid, buffer, length);
     352               
     353                uint8_t buffer[UDP_FRAGMENT_SIZE];
     354                int rc = async_data_write_finalize(wcallid, buffer, length);
    349355                if (rc != EOK) {
    350356                        fibril_mutex_unlock(&socket->lock);
     
    352358                        goto out;
    353359                }
    354 
    355                 urc = udp_uc_send(socket->assoc, fsockp, buffer, length, 0);
    356 
     360               
     361                udp_error_t urc =
     362                    udp_uc_send(socket->assoc, fsock_ptr, buffer, length, 0);
     363               
    357364                switch (urc) {
    358365                case UDP_EOK:
    359366                        rc = EOK;
    360367                        break;
    361 /*              case TCP_ENOTEXIST:
    362                         rc = ENOTCONN;
    363                         break;
    364                 case TCP_ECLOSING:
    365                         rc = ENOTCONN;
    366                         break;
    367                 case TCP_ERESET:
    368                         rc = ECONNABORTED;
    369                         break;*/
     368                case UDP_ENORES:
     369                        rc = ENOMEM;
     370                        break;
     371                case UDP_EUNSPEC:
     372                        rc = EINVAL;
     373                        break;
     374                case UDP_ENOROUTE:
     375                        rc = EIO;
     376                        break;
    370377                default:
    371378                        assert(false);
    372379                }
    373 
     380               
    374381                if (rc != EOK) {
    375382                        fibril_mutex_unlock(&socket->lock);
     
    378385                }
    379386        }
     387       
     388        ipc_call_t answer;
    380389       
    381390        IPC_SET_ARG1(answer, 0);
     
    526535static void udp_sock_close(udp_client_t *client, ipc_callid_t callid, ipc_call_t call)
    527536{
    528         int socket_id;
    529         socket_core_t *sock_core;
    530         udp_sockdata_t *socket;
    531         int rc;
    532 
    533537        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close()");
    534         socket_id = SOCKET_GET_SOCKET_ID(call);
    535 
    536         sock_core = socket_cores_find(&client->sockets, socket_id);
     538        int socket_id = SOCKET_GET_SOCKET_ID(call);
     539       
     540        socket_core_t *sock_core =
     541            socket_cores_find(&client->sockets, socket_id);
    537542        if (sock_core == NULL) {
    538543                async_answer_0(callid, ENOTSOCK);
    539544                return;
    540545        }
    541 
    542         socket = (udp_sockdata_t *)sock_core->specific_data;
     546       
     547        udp_sockdata_t *socket =
     548            (udp_sockdata_t *) sock_core->specific_data;
    543549        fibril_mutex_lock(&socket->lock);
    544 
    545         rc = socket_destroy(NULL, socket_id, &client->sockets, &gsock,
     550       
     551        int rc = socket_destroy(NULL, socket_id, &client->sockets, &gsock,
    546552            udp_free_sock_data);
    547553        if (rc != EOK) {
     
    550556                return;
    551557        }
    552 
     558       
    553559        fibril_mutex_unlock(&socket->lock);
    554560        async_answer_0(callid, EOK);
     
    583589                            &sock->recv_buffer_lock);
    584590                }
    585 
     591               
    586592                log_msg(LOG_DEFAULT, LVL_DEBUG, "[] call udp_uc_receive()");
    587593                urc = udp_uc_receive(sock->assoc, sock->recv_buffer,
    588594                    UDP_FRAGMENT_SIZE, &rcvd, &xflags, &sock->recv_fsock);
    589595                sock->recv_error = urc;
    590 
     596               
    591597                udp_sock_notify_data(sock->sock_core);
    592 
     598               
    593599                if (urc != UDP_EOK) {
    594600                        fibril_condvar_broadcast(&sock->recv_buffer_cv);
     
    596602                        break;
    597603                }
    598 
     604               
    599605                log_msg(LOG_DEFAULT, LVL_DEBUG, "[] got data - broadcast recv_buffer_cv");
    600 
     606               
    601607                sock->recv_buffer_used = rcvd;
    602608                fibril_mutex_unlock(&sock->recv_buffer_lock);
  • uspace/srv/net/udp/ucall.c

    rb92a0ee rb183ce0a  
    6868{
    6969        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_uc_set_local(%p, %p)", assoc, lsock);
     70       
     71        udp_assoc_set_local(assoc, lsock);
     72        return UDP_EOK;
     73}
    7074
    71         udp_assoc_set_local(assoc, lsock);
     75udp_error_t udp_uc_set_local_port(udp_assoc_t *assoc, uint16_t lport)
     76{
     77        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_uc_set_local(%p, %" PRIu16 ")", assoc, lport);
     78       
     79        udp_assoc_set_local_port(assoc, lport);
    7280        return UDP_EOK;
    7381}
  • uspace/srv/net/udp/ucall.h

    rb92a0ee rb183ce0a  
    4242extern udp_error_t udp_uc_set_foreign(udp_assoc_t *, udp_sock_t *);
    4343extern udp_error_t udp_uc_set_local(udp_assoc_t *, udp_sock_t *);
     44extern udp_error_t udp_uc_set_local_port(udp_assoc_t *, uint16_t);
    4445extern udp_error_t udp_uc_send(udp_assoc_t *, udp_sock_t *, void *, size_t,
    4546    xflags_t);
  • uspace/srv/net/udp/udp_type.h

    rb92a0ee rb183ce0a  
    6666};
    6767
    68 enum tcp_port {
     68enum udp_port {
    6969        UDP_PORT_ANY = 0
    7070};
Note: See TracChangeset for help on using the changeset viewer.