Print this page
    
OS-5673 move some "simple" syscalls in-kernel
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Approved by: Patrick Mooney <patrick.mooney@joyent.com>
OS-5607 lxbrand move unixbench syscalls to IKE
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
OS-5545 lxbrand move mount(2) emulation into kernel
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Ryan Zezeski <ryan.zezeski@joyent.com>
OS-5583 lxbrand convert lseek to IKE
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Approved by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-5480 zvol device resets mode/grp on reboot, breaks MapR
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
OS-5451 comm page should not break i86xpv
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-5410 move access into kernel
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
OS-5356 su reports getcwd() error in LX zone
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
OS-5259 lxbrand mmap(2) should heed personality
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Cody Mello <melloc@joyent.com>
OS-3925 lxbrand in-kernel link(2) and linkat(2)
OS-5094 lxbrand link to symlink failure
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-4104 lxbrand convert stat syscalls to IKE
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-4665 LX brand want devfs which allows symlinks to devices in root of /dev
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Alex Wilson <alex.wilson@joyent.com>
OS-4830 lxbrand convert select/poll to IKE
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
OS-4680 lxbrand use IKE close(2) when AIO not present
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-4695 lxbrand move epoll_create in-kernel
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-4637 lxbrand can't handle the auxv truth
OS-4640 lxbrand centos is sensitive about auxv contents
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Alex Wilson <alex.wilson@joyent.com>
OS-4002 ionice requirements not met on lx ubuntu64 14.04.003
OS-4587 lx: ubuntu 15.04 - Failed at step IOPRIO spawning /bin/systemd-tmpfiles: Function not implemented
OS-4571 lxbrand allow manipulation of uname release and version
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-4474 lxbrand missing prctl(PR_SET_PDEATHSIG) support
OS-4476 lxbrand convert prctl to IKE
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-4475 rkt run needs syncfs
OS-4469 journald needs fallocate(2) syscall
OS-4398 lxbrand async connect(3) should appear more successful
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
OS-4323 stub out cgroup fs
OS-4320 lxbrand convert getdents to IKE
OS-4282 lxbrand segfault in lx_getdents
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-4256 centos 7 systemd stops after failing to mount sysfs
OS-4115 lxbrand expose getrandom(2)
OS-4098 move open, close and fcntl into the kernel
OS-4084 getrlimit kills performance, move into kernel
OS-4082 move remaining vsyscall/vdso functions into the kernel
OS-3892 lxbrand mispronounces ENOLCK and ENOSTR
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-3926 lxbrand in-kernel fchownat(2), fchown(2), lchown(2), chown(2) and 16-bit ID counterparts
OS-3920 lxbrand use native *at(2) system calls for LX emulation
OS-3955 lxbrand in-kernel clock_gettime(2)
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-3924 lxbrand in-kernel mkdir(2) and mkdirat(2)
OS-3920 lxbrand use native *at(2) system calls for LX emulation
OS-3923 lxbrand in-kernel chmod(2), fchmod(2) and fchmodat(2)
OS-3920 lxbrand use native *at(2) system calls for LX emulation
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-3561 lxbrand emulation library should execute on alternate stack
OS-3558 lxbrand add support for full in-kernel syscall handling
OS-3545 lx_syscall_regs should not walk stack
OS-3868 many LTP testcases now hang
OS-3901 lxbrand lx_recvmsg fails to translate control messages when 64-bit
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Bryan Cantrill <bryan@joyent.com>
OS-3820 lxbrand ptrace(2): the next generation
OS-3685 lxbrand PTRACE_O_TRACEFORK race condition
OS-3834 lxbrand 64-bit strace(1) reports 64-bit process as using x32 ABI
OS-3794 lxbrand panic on init signal death
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Bryan Cantrill <bryan@joyent.com>
OS-3613 lxbrand convert ioctl to IKE
OS-3532 lx has trouble listing interfaces in java
OS-3576 lxbrand race in ioctl(FIONBIO) emulation
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
OS-3551 lxbrand read syscall path is 1/2 the speed of native
OS-3137 lxbrand pipe does not pollnotify when end is closed
OS-2834 ship lx brand
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/uts/intel/Makefile.files
          +++ new/usr/src/uts/intel/Makefile.files
   1    1  #
   2    2  # CDDL HEADER START
   3    3  #
   4    4  # The contents of this file are subject to the terms of the
   5    5  # Common Development and Distribution License (the "License").
   6    6  # You may not use this file except in compliance with the License.
   7    7  #
   8    8  # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9    9  # or http://www.opensolaris.org/os/licensing.
  10   10  # See the License for the specific language governing permissions
  11   11  # and limitations under the License.
  12   12  #
  13   13  # When distributing Covered Code, include this CDDL HEADER in each
  
    | 
      ↓ open down ↓ | 
    13 lines elided | 
    
      ↑ open up ↑ | 
  
  14   14  # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15  # If applicable, add the following below this CDDL HEADER, with the
  16   16  # fields enclosed by brackets "[]" replaced with your own identifying
  17   17  # information: Portions Copyright [yyyy] [name of copyright owner]
  18   18  #
  19   19  # CDDL HEADER END
  20   20  #
  21   21  
  22   22  #
  23   23  # Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
  24      -# Copyright (c) 2013, Joyent, Inc. All rights reserved.
       24 +# Copyright 2016, Joyent, Inc.
  25   25  # Copyright 2016 Nexenta Systems, Inc.
  26   26  #
  27   27  
  28   28  #
  29   29  #       This Makefile defines all file modules and build rules for the
  30   30  # directory uts/intel and its children. These are the source files which
  31   31  # are specific to x86 processor architectures.
  32   32  #
  33   33  
  34   34  #
  35   35  #       Core (unix) objects
  36   36  #
  37   37  CORE_OBJS +=            \
  38   38          arch_kdi.o      \
       39 +        comm_page_util.o \
  39   40          copy.o          \
  40   41          copy_subr.o     \
  41   42          cpc_subr.o      \
  42   43          ddi_arch.o      \
  43   44          ddi_i86.o       \
  44   45          ddi_i86_asm.o   \
  45   46          desctbls.o      \
  46   47          desctbls_asm.o  \
  47   48          exception.o     \
  48   49          float.o         \
  49   50          fmsmb.o         \
  50   51          fpu.o           \
  51   52          i86_subr.o      \
  52   53          lock_prim.o     \
  53   54          ovbcopy.o       \
  54   55          polled_io.o     \
  55   56          sseblk.o        \
  56   57          sundep.o        \
  57   58          swtch.o         \
  58   59          sysi86.o
  59   60  
  60   61  #
  61   62  # 64-bit multiply/divide compiler helper routines
  62   63  # used only for ia32
  63   64  #
  64   65  
  65   66  SPECIAL_OBJS_32 +=      \
  66   67          muldiv.o
  67   68  
  68   69  #
  69   70  #       Generic-unix Module
  70   71  #
  71   72  GENUNIX_OBJS +=         \
  72   73          archdep.o       \
  73   74          getcontext.o    \
  74   75          install_utrap.o \
  75   76          lwp_private.o   \
  76   77          prom_enter.o    \
  77   78          prom_exit.o     \
  78   79          prom_panic.o    \
  79   80          sendsig.o       \
  80   81          syscall.o
  81   82  
  82   83  
  83   84  #
  84   85  #       PROM Routines
  85   86  #
  86   87  GENUNIX_OBJS +=         \
  87   88          prom_env.o      \
  88   89          prom_emul.o     \
  89   90          prom_getchar.o  \
  90   91          prom_init.o     \
  91   92          prom_node.o     \
  92   93          prom_printf.o   \
  
    | 
      ↓ open down ↓ | 
    44 lines elided | 
    
      ↑ open up ↑ | 
  
  93   94          prom_prop.o     \
  94   95          prom_putchar.o  \
  95   96          prom_reboot.o   \
  96   97          prom_version.o
  97   98  
  98   99  #
  99  100  #       file system modules
 100  101  #
 101  102  CORE_OBJS +=            \
 102  103          prmachdep.o
      104 + 
      105 +LX_CGROUP_OBJS +=       \
      106 +        cgrps_node.o    \
      107 +        cgrps_vfsops.o  \
      108 +        cgrps_vnops.o
 103  109  
      110 +LX_DEVFS_OBJS +=        \
      111 +        lxd_attrdb.o    \
      112 +        lxd_node.o      \
      113 +        lxd_vfsops.o    \
      114 +        lxd_vnops.o
      115 +
      116 +LX_PROC_OBJS += \
      117 +        lx_prsubr.o     \
      118 +        lx_prvfsops.o   \
      119 +        lx_prvnops.o
      120 +
      121 +LX_SYS_OBJS +=  \
      122 +        lx_syssubr.o    \
      123 +        lx_sysvfsops.o  \
      124 +        lx_sysvnops.o
      125 +
      126 +LX_AUTOFS_OBJS +=       \
      127 +        lx_autofs.o
      128 +
 104  129  #
 105  130  #       ZFS file system module
 106  131  #
 107  132  ZFS_OBJS +=             \
 108  133          spa_boot.o
 109  134  
 110  135  #
 111  136  #       Decompression code
 112  137  #
 113  138  CORE_OBJS += decompress.o
 114  139  
 115  140  #
 116  141  #       Microcode utilities
 117  142  #
 118  143  CORE_OBJS += ucode_utils.o
 119  144  
 120  145  #
 121  146  #       Driver modules
 122  147  #
 123  148  AGPGART_OBJS += agpgart.o agp_kstat.o
 124  149  AGPTARGET_OBJS += agptarget.o
 125  150  AMD64GART_OBJS += amd64_gart.o
 126  151  ARCMSR_OBJS += arcmsr.o
 127  152  ATA_OBJS += $(GHD_OBJS) ata_blacklist.o ata_common.o ata_disk.o \
 128  153          ata_dma.o atapi.o atapi_fsm.o ata_debug.o \
 129  154          sil3xxx.o
 130  155  BSCBUS_OBJS += bscbus.o
 131  156  BSCV_OBJS += bscv.o
 132  157  CMDK_OBJS += cmdk.o
 133  158  CMLB_OBJS += cmlb.o
 134  159  CPUNEX_OBJS += cpunex.o
 135  160  DADK_OBJS += dadk.o
 136  161  DCOPY_OBJS += dcopy.o
 137  162  DNET_OBJS += dnet.o dnet_mii.o
 138  163  FD_OBJS += fd.o
 139  164  GDA_OBJS += gda.o
 140  165  GHD_OBJS += ghd.o ghd_debug.o ghd_dma.o ghd_queue.o ghd_scsa.o \
 141  166          ghd_scsi.o ghd_timer.o ghd_waitq.o ghd_gcmd.o
 142  167  I915_OBJS += i915_dma.o i915_drv.o i915_irq.o i915_mem.o \
 143  168          i915_gem.o i915_gem_debug.o i915_gem_tiling.o
 144  169  NSKERN_OBJS += nsc_asm.o
 145  170  PCICFG_OBJS += pcicfg.o
 146  171  PCI_PCINEXUS_OBJS += pci_pci.o
 147  172  PCIEB_OBJS += pcieb_x86.o
 148  173  PIT_BEEP_OBJS += pit_beep.o
 149  174  POWER_OBJS += power.o
 150  175  PCI_AUTOCONFIG_OBJS += pci_autoconfig.o pci_boot.o pcie_nvidia.o \
 151  176                          pci_memlist.o pci_resource.o
 152  177  RADEON_OBJS += r300_cmdbuf.o radeon_cp.o radeon_drv.o \
 153  178                          radeon_state.o radeon_irq.o radeon_mem.o
 154  179  SD_OBJS += sd.o sd_xbuf.o
 155  180  
 156  181  HECI_OBJS +=            \
 157  182          heci_init.o     \
 158  183          heci_intr.o     \
 159  184          heci_interface.o \
 160  185          io_heci.o       \
 161  186          heci_main.o
 162  187  
 163  188  STRATEGY_OBJS += strategy.o
 164  189  UCODE_OBJS += ucode_drv.o
 165  190  VGATEXT_OBJS += vgatext.o vgasubr.o
 166  191  
 167  192  #
 168  193  #       Kernel linker
 169  194  #
 170  195  KRTLD_OBJS +=           \
 171  196          bootfsops.o     \
 172  197          bootrd.o        \
 173  198          ufsops.o        \
 174  199          hsfs.o          \
 175  200          doreloc.o       \
 176  201          kobj_boot.o     \
 177  202          kobj_convrelstr.o \
 178  203          kobj_crt.o      \
 179  204          kobj_isa.o      \
 180  205          kobj_reloc.o
 181  206  
 182  207  #
 183  208  #       misc. modules
 184  209  #
 185  210  ACPICA_OBJS     += dbcmds.o dbdisply.o \
 186  211                     dbexec.o dbfileio.o dbhistry.o dbinput.o dbstats.o \
 187  212                     dbutils.o dbxface.o evevent.o evgpe.o evgpeblk.o \
 188  213                     evmisc.o evregion.o evrgnini.o evsci.o evxface.o \
 189  214                     evxfevnt.o evxfregn.o hwacpi.o hwgpe.o hwregs.o \
 190  215                     hwsleep.o hwtimer.o dsfield.o dsinit.o dsmethod.o \
 191  216                     dsmthdat.o dsobject.o dsopcode.o dsutils.o dswexec.o \
 192  217                     dswload.o dswscope.o dswstate.o exconfig.o exconvrt.o \
 193  218                     excreate.o exdump.o exfield.o exfldio.o exmisc.o \
 194  219                     exmutex.o exnames.o exoparg1.o exoparg2.o exoparg3.o \
 195  220                     exoparg6.o exprep.o exregion.o exresnte.o exresolv.o \
 196  221                     exresop.o exstore.o exstoren.o exstorob.o exsystem.o \
 197  222                     exutils.o psargs.o psopcode.o psparse.o psscope.o \
 198  223                     pstree.o psutils.o pswalk.o psxface.o nsaccess.o \
 199  224                     nsalloc.o nsdump.o nsdumpdv.o nseval.o nsinit.o \
 200  225                     nsload.o nsnames.o nsobject.o nsparse.o nssearch.o \
 201  226                     nsutils.o nswalk.o nsxfeval.o nsxfname.o nsxfobj.o \
 202  227                     rsaddr.o rscalc.o rscreate.o rsdump.o \
 203  228                     rsinfo.o rsio.o rsirq.o rslist.o rsmemory.o rsmisc.o \
 204  229                     rsutils.o rsxface.o tbfadt.o tbfind.o tbinstal.o  \
 205  230                     tbutils.o tbxface.o tbxfroot.o \
 206  231                     utalloc.o utclib.o utcopy.o utdebug.o utdelete.o \
 207  232                     uteval.o utglobal.o utinit.o utmath.o utmisc.o \
 208  233                     utobject.o utresrc.o utxface.o acpica.o acpi_enum.o \
 209  234                     master_ops.o osl.o osl_ml.o acpica_ec.o utcache.o \
 210  235                     utmutex.o utstate.o dmbuffer.o dmnames.o dmobject.o \
 211  236                     dmopcode.o dmresrc.o dmresrcl.o dmresrcs.o dmutils.o \
 212  237                     dmwalk.o psloop.o nspredef.o hwxface.o hwvalid.o \
 213  238                     utlock.o utids.o nsrepair.o nsrepair2.o \
 214  239                     dbmethod.o dbnames.o dsargs.o dscontrol.o dswload2.o \
 215  240                     evglock.o evgpeinit.o evgpeutil.o evxfgpe.o exdebug.o \
 216  241                     hwpci.o utdecode.o utosi.o utxferror.o
 217  242  
 218  243  
 219  244  AGP_OBJS += agpmaster.o
 220  245  FBT_OBJS += fbt.o
 221  246  SDT_OBJS += sdt.o
 222  247  
 223  248  #
 224  249  #       AMD8111 NIC driver module
 225  250  #
 226  251  AMD8111S_OBJS += amd8111s_main.o amd8111s_hw.o
 227  252  
 228  253  #
 229  254  #       Pentium Performance Counter BackEnd module
 230  255  #
 231  256  P123_PCBE_OBJS = p123_pcbe.o
 232  257  
 233  258  #
 234  259  #       Pentium 4 Performance Counter BackEnd module
 235  260  #
 236  261  P4_PCBE_OBJS = p4_pcbe.o
 237  262  
 238  263  #
 239  264  #       AMD Opteron/Athlon64 Performance Counter BackEnd module
 240  265  #
 241  266  OPTERON_PCBE_OBJS = opteron_pcbe.o
 242  267  
 243  268  #
 244  269  #       Intel Core Architecture Performance Counter BackEnd module
 245  270  #
 246  271  CORE_PCBE_OBJS = core_pcbe.o
 247  272  
 248  273  #
 249  274  #       AMR module
 250  275  #
 251  276  AMR_OBJS = amr.o
 252  277  
 253  278  #
 254  279  #       IPMI module
 255  280  IPMI_OBJS +=    ipmi_main.o ipmi.o ipmi_kcs.o
 256  281  
  
    | 
      ↓ open down ↓ | 
    143 lines elided | 
    
      ↑ open up ↑ | 
  
 257  282  #
 258  283  #       IOMMULIB module
 259  284  #
 260  285  IOMMULIB_OBJS = iommulib.o
 261  286  
 262  287  #
 263  288  #       Brand modules
 264  289  #
 265  290  SN1_BRAND_OBJS  =       sn1_brand.o sn1_brand_asm.o
 266  291  S10_BRAND_OBJS  =       s10_brand.o s10_brand_asm.o
      292 +LX_BRAND_OBJS  =                \
      293 +        lx_access.o             \
      294 +        lx_aio.o                \
      295 +        lx_archdep.o            \
      296 +        lx_auxv.o               \
      297 +        lx_brand.o              \
      298 +        lx_brk.o                \
      299 +        lx_chmod.o              \
      300 +        lx_chown.o              \
      301 +        lx_clone.o              \
      302 +        lx_close.o              \
      303 +        lx_cpu.o                \
      304 +        lx_dup.o                \
      305 +        lx_errno.o              \
      306 +        lx_epoll.o              \
      307 +        lx_fadvise.o            \
      308 +        lx_fallocate.o          \
      309 +        lx_fcntl.o              \
      310 +        lx_futex.o              \
      311 +        lx_getcwd.o             \
      312 +        lx_getdents.o           \
      313 +        lx_getpid.o             \
      314 +        lx_getrandom.o          \
      315 +        lx_id.o                 \
      316 +        lx_ioctl.o              \
      317 +        lx_ioprio.o             \
      318 +        lx_kill.o               \
      319 +        lx_link.o               \
      320 +        lx_lseek.o              \
      321 +        lx_misc.o               \
      322 +        lx_miscsys.o            \
      323 +        lx_mkdir.o              \
      324 +        lx_modify_ldt.o         \
      325 +        lx_mount.o              \
      326 +        lx_open.o               \
      327 +        lx_personality.o        \
      328 +        lx_pgrp.o               \
      329 +        lx_pid.o                \
      330 +        lx_pipe.o               \
      331 +        lx_poll.o               \
      332 +        lx_prctl.o              \
      333 +        lx_ptrace.o             \
      334 +        lx_rename.o             \
      335 +        lx_rlimit.o             \
      336 +        lx_rw.o                 \
      337 +        lx_sched.o              \
      338 +        lx_signal.o             \
      339 +        lx_signum.o             \
      340 +        lx_socket.o             \
      341 +        lx_stat.o               \
      342 +        lx_sync.o               \
      343 +        lx_syscall.o            \
      344 +        lx_sysinfo.o            \
      345 +        lx_thread_area.o        \
      346 +        lx_timer.o              \
      347 +        lx_umask.o              \
      348 +        lx_uname.o              \
      349 +        lx_wait.o               \
      350 +        lx_xattr.o
 267  351  
 268  352  #
 269  353  #       special files
 270  354  #
 271  355  MODSTUB_OBJ +=          \
 272  356          modstubs.o
 273  357  
 274  358  BOOTDEV_OBJS +=         \
 275  359          bootdev.o
 276  360  
 277  361  INC_PATH        += -I$(UTSBASE)/intel
 278  362  
 279  363  
 280  364  CPR_INTEL_OBJS +=       cpr_intel.o
 281  365  
 282  366  #
 283  367  # AMD family 0xf memory controller module
 284  368  #
 285  369  include $(SRC)/common/mc/mc-amd/Makefile.mcamd
 286  370  MCAMD_OBJS      += \
 287  371          $(MCAMD_CMN_OBJS) \
 288  372          mcamd_drv.o \
 289  373          mcamd_dimmcfg.o \
 290  374          mcamd_subr.o \
 291  375          mcamd_pcicfg.o
 292  376  
 293  377  #
 294  378  # Intel Nehalem memory controller module
 295  379  #
 296  380  INTEL_NHM_OBJS += \
 297  381          nhm_init.o \
 298  382          mem_addr.o \
 299  383          intel_nhmdrv.o \
 300  384          nhm_pci_cfg.o \
 301  385          dimm_topo.o \
 302  386          intel_nhm.o
 303  387  
 304  388  #
 305  389  # Intel 5000/5100/5400/7300 chipset memory controller hub (MCH) module
 306  390  #
 307  391  INTEL_NB5000_OBJS += \
 308  392          intel_nb5000.o \
 309  393          intel_nbdrv.o \
 310  394          dimm_addr.o \
 311  395          nb_pci_cfg.o \
 312  396          nb5000_init.o
 313  397  
 314  398  #
 315  399  # VMware VMXNET3 virtual network device
 316  400  #
 317  401  VMXNET3S_OBJS = vmxnet3_main.o \
 318  402                  vmxnet3_rx.o \
 319  403                  vmxnet3_tx.o \
 320  404                  vmxnet3_utils.o
 321  405  
 322  406  #
 323  407  # VMware PVSCSI SCSI Controller
 324  408  #
 325  409  PVSCSI_OBJS =   pvscsi.o
  
    | 
      ↓ open down ↓ | 
    49 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX