提交 e2751a96 创建 作者: Frans Kaashoek's avatar Frans Kaashoek

Merge branch 'scale-amd64' of ssh://amsterdam.csail.mit.edu/home/am0/6.828/xv6 into scale-amd64

Conflicts: crange.cc kernel.h
...@@ -13,25 +13,32 @@ MTRACE ?= $(QEMU) ...@@ -13,25 +13,32 @@ MTRACE ?= $(QEMU)
HW ?= qemu HW ?= qemu
O = o.$(HW) O = o.$(HW)
ifndef CONFIG_MK ifdef USE_CLANG
CC = $(TOOLPREFIX)gcc CC = $(TOOLPREFIX)clang
CXX = $(TOOLPREFIX)clang++
CXXFLAGS = -Wno-delete-non-virtual-dtor -Wno-gnu-designator
CFLAGS = -no-integrated-as
else
CC = $(TOOLPREFIX)gcc
CXX = $(TOOLPREFIX)g++ CXX = $(TOOLPREFIX)g++
CXXFLAGS =
CFLAGS =
endif endif
LD = $(TOOLPREFIX)ld LD = $(TOOLPREFIX)ld
NM = $(TOOLPREFIX)nm NM = $(TOOLPREFIX)nm
OBJCOPY = $(TOOLPREFIX)objcopy OBJCOPY = $(TOOLPREFIX)objcopy
STRIP = $(TOOLPREFIX)strip STRIP = $(TOOLPREFIX)strip
COMFLAGS := -static -fno-builtin -fno-strict-aliasing -O2 -Wall \ COMFLAGS = -static -fno-builtin -fno-strict-aliasing -O2 -Wall \
-g -MD -m64 -Werror -fms-extensions -mno-sse \ -g -MD -m64 -Werror -fms-extensions -mno-sse \
-mcmodel=large -mno-red-zone -I$(QEMUSRC) -fno-omit-frame-pointer \ -mcmodel=large -mno-red-zone -I$(QEMUSRC) -fno-omit-frame-pointer \
-DHW_$(HW) -include param.h -include compiler.h -DXV6 \ -DHW_$(HW) -include param.h -include compiler.h -DXV6
-Wno-gnu-designator
COMFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) COMFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
CFLAGS := $(COMFLAGS) -std=c99 CFLAGS := $(COMFLAGS) -std=c99 $(CFLAGS)
CXXFLAGS := $(COMFLAGS) -std=c++0x -Wno-sign-compare -fno-exceptions -fno-rtti CXXFLAGS := $(COMFLAGS) -std=c++0x -Wno-sign-compare -fno-exceptions -fno-rtti $(CXXFLAGS)
ASFLAGS = -m64 -gdwarf-2 -MD ASFLAGS = -m64 -gdwarf-2 -MD
LDFLAGS += -m elf_x86_64 LDFLAGS = -m elf_x86_64
OBJS = \ OBJS = \
bio.o \ bio.o \
...@@ -91,6 +98,7 @@ UPROGS= \ ...@@ -91,6 +98,7 @@ UPROGS= \
_forkexectree \ _forkexectree \
_forkexecbench \ _forkexecbench \
_forktree \ _forktree \
_login \
_ls \ _ls \
_mapbench \ _mapbench \
_maptest \ _maptest \
......
...@@ -36,3 +36,13 @@ ...@@ -36,3 +36,13 @@
download, make, make install gmp-5.0.4, mpfr-3.1.0, and mpc-0.9 download, make, make install gmp-5.0.4, mpfr-3.1.0, and mpc-0.9
for mpfr and mpc: ./configure --with-gmp=/usr/local for mpfr and mpc: ./configure --with-gmp=/usr/local
for gcc: ../configure --target=x86_64-jos-elf --with-gmp=/usr/local/ --with-mpfr=/usr/local --enable-languages=c,c++ --without-headers --disable-nls for gcc: ../configure --target=x86_64-jos-elf --with-gmp=/usr/local/ --with-mpfr=/usr/local --enable-languages=c,c++ --without-headers --disable-nls
* clang
- Version 3.0 or greater is required to build xv6
- http://llvm.org/docs/GettingStarted.html
$ git clone http://llvm.org/git/llvm.git
$ (cd llvm/tools && git clone http://llvm.org/git/clang.git)
$ CC=gcc CXX=g++ ./configure --prefix=[PREFIX] \
--enable-targets=x86_64 --enable-optimized
$ CC=gcc CXX=g++ make && make install
#pragma once
#define _GLIBCXX_VISIBILITY(x)
#define _GLIBCXX_BEGIN_NAMESPACE_VERSION
#define _GLIBCXX_END_NAMESPACE_VERSION
#define _GLIBCXX_BEGIN_EXTERN_C extern "C" {
#define _GLIBCXX_END_EXTERN_C }
#define __glibcxx_assert(x)
#include "atomic_base.h"
#include "atomic_2.h"
template<class T>
struct atomic : public std::__atomic2::__atomic_base<T> {
atomic() = default;
~atomic() = default;
atomic(const atomic&) = delete;
atomic& operator=(const atomic&) = delete;
atomic& operator=(const atomic&) volatile = delete;
constexpr atomic(T v) : std::__atomic2::__atomic_base<T>(v) {}
using std::__atomic2::__atomic_base<T>::operator T;
using std::__atomic2::__atomic_base<T>::operator=;
};
差异被折叠。
// -*- C++ -*- header.
// Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.
// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
// <http://www.gnu.org/licenses/>.
/** @file bits/atomic_base.h
* This is an internal header file, included by other library headers.
* Do not attempt to use it directly. @headername{atomic}
*/
#ifndef _GLIBCXX_ATOMIC_BASE_H
#define _GLIBCXX_ATOMIC_BASE_H 1
#pragma GCC system_header
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
/**
* @defgroup atomics Atomics
*
* Components for performing atomic operations.
* @{
*/
/// Enumeration for memory_order
typedef enum memory_order
{
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_release,
memory_order_acq_rel,
memory_order_seq_cst
} memory_order;
inline memory_order
__calculate_memory_order(memory_order __m)
{
const bool __cond1 = __m == memory_order_release;
const bool __cond2 = __m == memory_order_acq_rel;
memory_order __mo1(__cond1 ? memory_order_relaxed : __m);
memory_order __mo2(__cond2 ? memory_order_acquire : __mo1);
return __mo2;
}
void
atomic_thread_fence(memory_order);
void
atomic_signal_fence(memory_order);
/// kill_dependency
template<typename _Tp>
inline _Tp
kill_dependency(_Tp __y)
{
_Tp __ret(__y);
return __ret;
}
/**
* @brief Base type for atomic_flag.
*
* Base type is POD with data, allowing atomic_flag to derive from
* it and meet the standard layout type requirement. In addition to
* compatibilty with a C interface, this allows different
* implementations of atomic_flag to use the same atomic operation
* functions, via a standard conversion to the __atomic_flag_base
* argument.
*/
_GLIBCXX_BEGIN_EXTERN_C
struct __atomic_flag_base
{
bool _M_i;
};
_GLIBCXX_END_EXTERN_C
#define ATOMIC_FLAG_INIT { false }
// Base types for atomics.
//
// Three nested namespaces for atomic implementation details.
//
// The nested namespace inlined into std:: is determined by the value
// of the _GLIBCXX_ATOMIC_PROPERTY macro and the resulting
// ATOMIC_*_LOCK_FREE macros.
//
// 0 == __atomic0 == Never lock-free
// 1 == __atomic1 == Best available, sometimes lock-free
// 2 == __atomic2 == Always lock-free
namespace __atomic0
{
struct atomic_flag;
template<typename _IntTp>
struct __atomic_base;
}
namespace __atomic2
{
struct atomic_flag;
template<typename _IntTp>
struct __atomic_base;
}
namespace __atomic1
{
using __atomic2::atomic_flag;
using __atomic0::__atomic_base;
}
/// Lock-free Property
#if defined(_GLIBCXX_ATOMIC_BUILTINS_1) && defined(_GLIBCXX_ATOMIC_BUILTINS_2) \
&& defined(_GLIBCXX_ATOMIC_BUILTINS_4) && defined(_GLIBCXX_ATOMIC_BUILTINS_8)
# define _GLIBCXX_ATOMIC_PROPERTY 2
# define _GLIBCXX_ATOMIC_NAMESPACE __atomic2
#elif defined(_GLIBCXX_ATOMIC_BUILTINS_1)
# define _GLIBCXX_ATOMIC_PROPERTY 1
# define _GLIBCXX_ATOMIC_NAMESPACE __atomic1
#else
# define _GLIBCXX_ATOMIC_PROPERTY 0
# define _GLIBCXX_ATOMIC_NAMESPACE __atomic0
#endif
#define ATOMIC_CHAR_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_CHAR16_T_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_CHAR32_T_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_WCHAR_T_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_SHORT_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_INT_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_LONG_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
#define ATOMIC_LLONG_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
inline namespace _GLIBCXX_ATOMIC_NAMESPACE { }
#define ATOMIC_VAR_INIT(_VI) { _VI }
template<typename _Tp>
struct atomic;
template<typename _Tp>
struct atomic<_Tp*>;
// @} group atomics
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
#endif
...@@ -135,7 +135,7 @@ bread(u32 dev, u64 sector, int writer) ...@@ -135,7 +135,7 @@ bread(u32 dev, u64 sector, int writer)
if(!(b->flags & B_VALID)) if(!(b->flags & B_VALID))
iderw(b); iderw(b);
if (writer && !origwriter) { if (writer && !origwriter) {
__sync_fetch_and_and(&b->flags, ~B_BUSY); b->flags &= ~B_BUSY;
cv_wakeup(&b->cv); cv_wakeup(&b->cv);
} }
return b; return b;
...@@ -159,7 +159,7 @@ brelse(struct buf *b, int writer) ...@@ -159,7 +159,7 @@ brelse(struct buf *b, int writer)
if (writer) { if (writer) {
if((b->flags & B_BUSY) == 0) if((b->flags & B_BUSY) == 0)
panic("brelse"); panic("brelse");
__sync_fetch_and_and(&b->flags, ~B_BUSY); b->flags &= ~B_BUSY;
cv_wakeup(&b->cv); cv_wakeup(&b->cv);
} }
// rcu_begin_read() happens in bread // rcu_begin_read() happens in bread
......
#include "gc.hh" #include "gc.hh"
#include "atomic.hh"
struct buf : public rcu_freed { struct buf : public rcu_freed {
int flags; atomic<int> flags;
u32 dev; u32 dev;
u64 sector; u64 sector;
struct buf *prev; // LRU cache list struct buf *prev; // LRU cache list
......
...@@ -3,19 +3,27 @@ extern "C" { ...@@ -3,19 +3,27 @@ extern "C" {
#include "kernel.h" #include "kernel.h"
} }
#include "cpputil.hh"
void * void *
operator new(unsigned long nbytes) operator new(unsigned long nbytes)
{ {
return kmalloc(nbytes); return kmalloc(nbytes);
} }
void *
operator new(unsigned long nbytes, void *buf)
{
return buf;
}
void void
operator delete(void *p) operator delete(void *p)
{ {
kmfree(p); kmfree(p);
} }
extern "C" void void
__cxa_pure_virtual(void) __cxa_pure_virtual(void)
{ {
panic("__cxa_pure_virtual"); panic("__cxa_pure_virtual");
......
...@@ -33,3 +33,10 @@ mkpair(const A &a, const B &b) ...@@ -33,3 +33,10 @@ mkpair(const A &a, const B &b)
{ {
return pair<A, B>(a, b); return pair<A, B>(a, b);
} }
/* C++ runtime */
void *operator new(unsigned long nbytes);
void *operator new(unsigned long nbytes, void *buf);
void operator delete(void *p);
extern "C" void __cxa_pure_virtual(void);
...@@ -10,6 +10,7 @@ extern "C" { ...@@ -10,6 +10,7 @@ extern "C" {
} }
#include "gc.hh" #include "gc.hh"
#include "crange.hh" #include "crange.hh"
#include "cpputil.hh"
// //
// Concurrent atomic range operations using skip lists. An insert may split an // Concurrent atomic range operations using skip lists. An insert may split an
......
...@@ -28,7 +28,7 @@ filealloc(void) ...@@ -28,7 +28,7 @@ filealloc(void)
struct file* struct file*
filedup(struct file *f) filedup(struct file *f)
{ {
if (__sync_fetch_and_add(&f->ref, 1) < 1) if (f->ref++ < 1)
panic("filedup"); panic("filedup");
return f; return f;
} }
...@@ -37,7 +37,7 @@ filedup(struct file *f) ...@@ -37,7 +37,7 @@ filedup(struct file *f)
void void
fileclose(struct file *f) fileclose(struct file *f)
{ {
if (subfetch(&f->ref, 1) > 0) if (--f->ref > 0)
return; return;
if(f->type == file::FD_PIPE) if(f->type == file::FD_PIPE)
......
#include "cpputil.hh" #include "cpputil.hh"
#include "ns.hh" #include "ns.hh"
#include "gc.hh" #include "gc.hh"
#include "atomic.hh"
u64 namehash(const strbuf<DIRSIZ>&); u64 namehash(const strbuf<DIRSIZ>&);
struct file { struct file {
enum { FD_NONE, FD_PIPE, FD_INODE, FD_SOCKET } type; enum { FD_NONE, FD_PIPE, FD_INODE, FD_SOCKET } type;
int ref; // reference count atomic<int> ref; // reference count
char readable; char readable;
char writable; char writable;
......
...@@ -55,8 +55,6 @@ void consoleintr(int(*)(void)); ...@@ -55,8 +55,6 @@ void consoleintr(int(*)(void));
#define assert(c) if (!(c)) { cprintf("%s:%d: ", __FILE__, __LINE__); panic("assertion failure"); } #define assert(c) if (!(c)) { cprintf("%s:%d: ", __FILE__, __LINE__); panic("assertion failure"); }
// crange.c
// e1000.c // e1000.c
extern int e1000irq; extern int e1000irq;
extern int e1000init; extern int e1000init;
......
#include "types.h"
#include "user.h"
static const char *
readpw(void)
{
static char pw[64];
for (int i = 0; i < sizeof(pw); i++) {
int r = read(0, &pw[i], 1);
if (r != 1)
return 0;
if (pw[i] == '\r') {
pw[i] = 0;
} else if (pw[i] == '\n') {
pw[i] = 0;
return pw;
}
}
return 0;
}
int
main(void)
{
const char *pw;
printf(1, "password: ");
pw = readpw();
if (pw && !strcmp(pw, "xv6")) {
static const char *argv[] = { "/sh", 0 };
exec(argv[0], argv);
}
exit();
}
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#if SPINLOCK_DEBUG #if SPINLOCK_DEBUG
#define NHASH 10 #define NHASH 10
#else #else
#define NHASH 100 #define NHASH 30
#endif #endif
class scoped_gc_epoch { class scoped_gc_epoch {
......
...@@ -46,16 +46,18 @@ main(void) ...@@ -46,16 +46,18 @@ main(void)
continue; continue;
} }
if (pid == 0) { if (pid == 0) {
static const char *argv[] = { "sh", 0 }; static const char *argv[] = { "/login", 0 };
close(0); close(0);
close(1); close(1);
close(2); close(2);
dup(ss); dup(ss);
dup(ss); dup(ss);
dup(ss); dup(ss);
exec("sh", argv); exec(argv[0], argv);
exit(); exit();
} }
close(ss); close(ss);
wait();
printf(1, "telnetd: connection closed\n");
} }
} }
...@@ -18,4 +18,5 @@ typedef pme_t pml4e_t; ...@@ -18,4 +18,5 @@ typedef pme_t pml4e_t;
typedef s64 ssize_t; typedef s64 ssize_t;
typedef u64 size_t; typedef u64 size_t;
typedef u64 off_t; typedef u64 off_t;
typedef s64 ptrdiff_t;
#endif #endif
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论