mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 22:51:35 +00:00
Merge branch 'linux-2.6'
This commit is contained in:
commit
c2a7dcad9f
14
Documentation/ABI/testing/sysfs-kernel-uids
Normal file
14
Documentation/ABI/testing/sysfs-kernel-uids
Normal file
@ -0,0 +1,14 @@
|
||||
What: /sys/kernel/uids/<uid>/cpu_shares
|
||||
Date: December 2007
|
||||
Contact: Dhaval Giani <dhaval@linux.vnet.ibm.com>
|
||||
Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
|
||||
Description:
|
||||
The /sys/kernel/uids/<uid>/cpu_shares tunable is used
|
||||
to set the cpu bandwidth a user is allowed. This is a
|
||||
propotional value. What that means is that if there
|
||||
are two users logged in, each with an equal number of
|
||||
shares, then they will get equal CPU bandwidth. Another
|
||||
example would be, if User A has shares = 1024 and user
|
||||
B has shares = 2048, User B will get twice the CPU
|
||||
bandwidth user A will. For more details refer
|
||||
Documentation/sched-design-CFS.txt
|
@ -1,5 +1,3 @@
|
||||
This is an explanation of what i2c is, and what is supported in this package.
|
||||
|
||||
I2C and SMBus
|
||||
=============
|
||||
|
||||
@ -33,52 +31,17 @@ When we talk about I2C, we use the following terms:
|
||||
Client
|
||||
|
||||
An Algorithm driver contains general code that can be used for a whole class
|
||||
of I2C adapters. Each specific adapter driver depends on one algorithm
|
||||
driver.
|
||||
of I2C adapters. Each specific adapter driver either depends on one algorithm
|
||||
driver, or includes its own implementation.
|
||||
|
||||
A Driver driver (yes, this sounds ridiculous, sorry) contains the general
|
||||
code to access some type of device. Each detected device gets its own
|
||||
data in the Client structure. Usually, Driver and Client are more closely
|
||||
integrated than Algorithm and Adapter.
|
||||
|
||||
For a given configuration, you will need a driver for your I2C bus (usually
|
||||
a separate Adapter and Algorithm driver), and drivers for your I2C devices
|
||||
(usually one driver for each device). There are no I2C device drivers
|
||||
in this package. See the lm_sensors project http://www.lm-sensors.nu
|
||||
for device drivers.
|
||||
For a given configuration, you will need a driver for your I2C bus, and
|
||||
drivers for your I2C devices (usually one driver for each device).
|
||||
|
||||
At this time, Linux only operates I2C (or SMBus) in master mode; you can't
|
||||
use these APIs to make a Linux system behave as a slave/device, either to
|
||||
speak a custom protocol or to emulate some other device.
|
||||
|
||||
|
||||
Included Bus Drivers
|
||||
====================
|
||||
Note that only stable drivers are patched into the kernel by 'mkpatch'.
|
||||
|
||||
|
||||
Base modules
|
||||
------------
|
||||
|
||||
i2c-core: The basic I2C code, including the /proc/bus/i2c* interface
|
||||
i2c-dev: The /dev/i2c-* interface
|
||||
i2c-proc: The /proc/sys/dev/sensors interface for device (client) drivers
|
||||
|
||||
Algorithm drivers
|
||||
-----------------
|
||||
|
||||
i2c-algo-bit: A bit-banging algorithm
|
||||
i2c-algo-pcf: A PCF 8584 style algorithm
|
||||
i2c-algo-ibm_ocp: An algorithm for the I2C device in IBM 4xx processors (NOT BUILT BY DEFAULT)
|
||||
|
||||
Adapter drivers
|
||||
---------------
|
||||
|
||||
i2c-elektor: Elektor ISA card (uses i2c-algo-pcf)
|
||||
i2c-elv: ELV parallel port adapter (uses i2c-algo-bit)
|
||||
i2c-pcf-epp: PCF8584 on a EPP parallel port (uses i2c-algo-pcf) (NOT mkpatched)
|
||||
i2c-philips-par: Philips style parallel port adapter (uses i2c-algo-bit)
|
||||
i2c-adap-ibm_ocp: IBM 4xx processor I2C device (uses i2c-algo-ibm_ocp) (NOT BUILT BY DEFAULT)
|
||||
i2c-pport: Primitive parallel port adapter (uses i2c-algo-bit)
|
||||
i2c-velleman: Velleman K8000 parallel port adapter (uses i2c-algo-bit)
|
||||
|
||||
|
@ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a
|
||||
fork. So if you have any comments or updates for this file, please try
|
||||
to update the original English file first.
|
||||
|
||||
Last Updated: 2007/09/23
|
||||
Last Updated: 2007/11/16
|
||||
==================================
|
||||
これは、
|
||||
linux-2.6.23/Documentation/HOWTO
|
||||
linux-2.6.24/Documentation/HOWTO
|
||||
の和訳です。
|
||||
|
||||
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
|
||||
翻訳日: 2007/09/19
|
||||
翻訳日: 2007/11/10
|
||||
翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
|
||||
校正者: 松倉さん <nbh--mats at nifty dot com>
|
||||
小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
|
||||
@ -110,7 +110,7 @@ Linux カーネルソースツリーは幅広い範囲のドキュメントを
|
||||
新しいドキュメントファイルも追加することを勧めます。
|
||||
カーネルの変更が、カーネルがユーザ空間に公開しているインターフェイスの
|
||||
変更を引き起こす場合、その変更を説明するマニュアルページのパッチや情報
|
||||
をマニュアルページのメンテナ mtk-manpages@gmx.net に送ることを勧めま
|
||||
をマニュアルページのメンテナ mtk.manpages@gmail.com に送ることを勧めま
|
||||
す。
|
||||
|
||||
以下はカーネルソースツリーに含まれている読んでおくべきファイルの一覧で
|
||||
|
@ -1,6 +1,6 @@
|
||||
NOTE:
|
||||
This is a version of Documentation/HOWTO translated into korean
|
||||
This document is maintained by minchan Kim < minchan.kim@gmail.com>
|
||||
This document is maintained by minchan Kim <minchan.kim@gmail.com>
|
||||
If you find any difference between this document and the original file or
|
||||
a problem with the translation, please contact the maintainer of this file.
|
||||
|
||||
@ -14,7 +14,7 @@ try to update the original English file first.
|
||||
Documentation/HOWTO
|
||||
의 한글 번역입니다.
|
||||
|
||||
역자: 김민찬 <minchan.kim@gmail.com >
|
||||
역자: 김민찬 <minchan.kim@gmail.com>
|
||||
감수: 이제이미 <jamee.lee@samsung.com>
|
||||
==================================
|
||||
|
||||
@ -23,11 +23,11 @@ Documentation/HOWTO
|
||||
|
||||
이 문서는 커널 개발에 있어 가장 중요한 문서이다. 이 문서는
|
||||
리눅스 커널 개발자가 되는 법과 리눅스 커널 개발 커뮤니티와 일하는
|
||||
법을 담고있다. 커널 프로그래밍의기술적인 측면과 관련된 내용들은
|
||||
포함하지 않으려고 하였지만 올바으로 여러분을 안내하는 데 도움이
|
||||
법을 담고있다. 커널 프로그래밍의 기술적인 측면과 관련된 내용들은
|
||||
포함하지 않으려고 하였지만 올바른 길로 여러분을 안내하는 데는 도움이
|
||||
될 것이다.
|
||||
|
||||
이 문서에서 오래된 것을 발견하면 문서의 아래쪽에 나열된 메인트너에게
|
||||
이 문서에서 오래된 것을 발견하면 문서의 아래쪽에 나열된 메인테이너에게
|
||||
패치를 보내달라.
|
||||
|
||||
|
||||
@ -36,12 +36,12 @@ Documentation/HOWTO
|
||||
|
||||
자, 여러분은 리눅스 커널 개발자가 되는 법을 배우고 싶은가? 아니면
|
||||
상사로부터"이 장치를 위한 리눅스 드라이버를 작성하시오"라는 말을
|
||||
들었는가? 이 문서는 여러분이 겪게 될 과정과 커뮤니티와 일하는 법을
|
||||
조언하여 여러분의 목적을 달성하기 위해 필요한 것 모두를 알려주는
|
||||
것이다.
|
||||
들었는가? 이 문서의 목적은 여러분이 겪게 될 과정과 커뮤니티와 협력하는
|
||||
법을 조언하여 여러분의 목적을 달성하기 위해 필요한 것 모두를 알려주기
|
||||
위함이다.
|
||||
|
||||
커널은 대부분은 C로 작성되었어고 몇몇 아키텍쳐의 의존적인 부분은
|
||||
어셈블리로 작성되었다. 커널 개발을 위해 C를 잘 이해하고 있어야 한다.
|
||||
커널은 대부분은 C로 작성되어 있고 몇몇 아키텍쳐의 의존적인 부분은
|
||||
어셈블리로 작성되어 있다. 커널 개발을 위해 C를 잘 이해하고 있어야 한다.
|
||||
여러분이 특정 아키텍쳐의 low-level 개발을 할 것이 아니라면
|
||||
어셈블리(특정 아키텍쳐)는 잘 알아야 할 필요는 없다.
|
||||
다음의 참고서적들은 기본에 충실한 C 교육이나 수년간의 경험에 견주지는
|
||||
@ -59,11 +59,11 @@ Documentation/HOWTO
|
||||
어떤 참고문서도 있지 않다. 정보를 얻기 위해서는 gcc info (`info gcc`)페이지를
|
||||
살펴보라.
|
||||
|
||||
여러분은 기존의 개발 커뮤니티와 일하는 법을 배우려고 하고 있다는 것을
|
||||
기억하라. 코딩, 스타일, 절차에 관한 훌륭한 표준을 가진 사람들이 모인
|
||||
여러분은 기존의 개발 커뮤니티와 협력하는 법을 배우려고 하고 있다는 것을
|
||||
기억하라. 코딩, 스타일, 함수에 관한 훌륭한 표준을 가진 사람들이 모인
|
||||
다양한 그룹이 있다. 이 표준들은 오랜동안 크고 지역적으로 분산된 팀들에
|
||||
의해 가장 좋은 방법으로 일하기위하여 찾은 것을 기초로 만들어져왔다.
|
||||
그 표준들은 문서화가 잘 되어 있기 때문에 가능한한 미리 많은 표준들에
|
||||
의해 가장 좋은 방법으로 일하기 위하여 찾은 것을 기초로 만들어져 왔다.
|
||||
그 표준들은 문서화가 잘 되어있기 때문에 가능한한 미리 많은 표준들에
|
||||
관하여 배우려고 시도하라. 다른 사람들은 여러분이나 여러분의 회사가
|
||||
일하는 방식에 적응하는 것을 원하지는 않는다.
|
||||
|
||||
@ -73,7 +73,7 @@ Documentation/HOWTO
|
||||
|
||||
리눅스 커널 소스 코드는 GPL로 배포(release)되었다. 소스트리의 메인
|
||||
디렉토리에 있는 라이센스에 관하여 상세하게 쓰여 있는 COPYING이라는
|
||||
파일을 봐라.여러분이 라이센스에 관한 더 깊은 문제를 가지고 있다면
|
||||
파일을 봐라. 여러분이 라이센스에 관한 더 깊은 문제를 가지고 있다면
|
||||
리눅스 커널 메일링 리스트에 묻지말고 변호사와 연락하라. 메일링
|
||||
리스트들에 있는 사람들은 변호사가 아니기 때문에 법적 문제에 관하여
|
||||
그들의 말에 의지해서는 안된다.
|
||||
@ -85,12 +85,12 @@ GPL에 관한 잦은 질문들과 답변들은 다음을 참조하라.
|
||||
문서
|
||||
----
|
||||
|
||||
리눅스 커널 소스 트리는 커널 커뮤니티와 일하는 법을 배우기 위한 많은
|
||||
귀중한 문서들을 가지고 있다. 새로운 기능들이 커널에 들어가게 될 때,
|
||||
리눅스 커널 소스 트리는 커널 커뮤니티와 협력하는 법을 배우기위해 훌륭한
|
||||
다양한 문서들을 가지고 있다. 새로운 기능들이 커널에 들어가게 될 때,
|
||||
그 기능을 어떻게 사용하는지에 관한 설명을 위하여 새로운 문서 파일을
|
||||
추가하는 것을 권장한다. 커널이 유저스페이스로 노출하는 인터페이스를
|
||||
변경하게 되면 변경을 설명하는 메뉴얼 페이지들에 대한 패치나 정보를
|
||||
mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
||||
mtk.manpages@gmail.com의 메인테이너에게 보낼 것을 권장한다.
|
||||
|
||||
다음은 커널 소스 트리에 있는 읽어야 할 파일들의 리스트이다.
|
||||
README
|
||||
@ -105,7 +105,7 @@ mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
||||
Documentation/CodingStyle
|
||||
이 문서는 리눅스 커널 코딩 스타일과 그렇게 한 몇몇 이유를 설명한다.
|
||||
모든 새로운 코드는 이 문서에 가이드라인들을 따라야 한다. 대부분의
|
||||
메인트너들은 이 규칙을 따르는 패치들만을 받아들일 것이고 많은 사람들이
|
||||
메인테이너들은 이 규칙을 따르는 패치들만을 받아들일 것이고 많은 사람들이
|
||||
그 패치가 올바른 스타일일 경우만 코드를 검토할 것이다.
|
||||
|
||||
Documentation/SubmittingPatches
|
||||
@ -115,9 +115,10 @@ mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
||||
- Email 내용들
|
||||
- Email 양식
|
||||
- 그것을 누구에게 보낼지
|
||||
이러한 규칙들을 따르는 것이 성공을 보장하진 않는다(왜냐하면 모든
|
||||
패치들은 내용과 스타일에 관하여 면밀히 검토되기 때문이다).
|
||||
그러나 규칙을 따르지 않는다면 거의 성공하지도 못할 것이다.
|
||||
이러한 규칙들을 따르는 것이 성공(역자주: 패치가 받아들여 지는 것)을
|
||||
보장하진 않는다(왜냐하면 모든 패치들은 내용과 스타일에 관하여
|
||||
면밀히 검토되기 때문이다). 그러나 규칙을 따르지 않는다면 거의
|
||||
성공하지도 못할 것이다.
|
||||
|
||||
올바른 패치들을 만드는 법에 관한 훌륭한 다른 문서들이 있다.
|
||||
"The Perfect Patch"
|
||||
@ -126,13 +127,13 @@ mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
||||
http://linux.yyz.us/patch-format.html
|
||||
|
||||
Documentation/stable_api_nonsense.txt
|
||||
이 문서는 의도적으로 커널이 변하지 않는 API를 갖지 않도록 결정한
|
||||
이 문서는 의도적으로 커널이 불변하는 API를 갖지 않도록 결정한
|
||||
이유를 설명하며 다음과 같은 것들을 포함한다.
|
||||
- 서브시스템 shim-layer(호환성을 위해?)
|
||||
- 운영 체제들 간의 드라이버 이식성
|
||||
- 운영체제들간의 드라이버 이식성
|
||||
- 커널 소스 트리내에 빠른 변화를 늦추는 것(또는 빠른 변화를 막는 것)
|
||||
이 문서는 리눅스 개발 철학을 이해하는데 필수적이며 다른 운영체제에서
|
||||
리눅스로 옮겨오는 사람들에게는 매우 중요하다.
|
||||
리눅스로 전향하는 사람들에게는 매우 중요하다.
|
||||
|
||||
|
||||
Documentation/SecurityBugs
|
||||
@ -141,10 +142,10 @@ mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
||||
도와 달라.
|
||||
|
||||
Documentation/ManagementStyle
|
||||
이 문서는 리눅스 커널 메인트너들이 어떻게 그들의 방법론의 정신을
|
||||
어떻게 공유하고 운영하는지를 설명한다. 이것은 커널 개발에 입문하는
|
||||
이 문서는 리눅스 커널 메인테이너들이 그들의 방법론에 녹아 있는
|
||||
정신을 어떻게 공유하고 운영하는지를 설명한다. 이것은 커널 개발에 입문하는
|
||||
모든 사람들(또는 커널 개발에 작은 호기심이라도 있는 사람들)이
|
||||
읽어야 할 중요한 문서이다. 왜냐하면 이 문서는 커널 메인트너들의
|
||||
읽어야 할 중요한 문서이다. 왜냐하면 이 문서는 커널 메인테이너들의
|
||||
독특한 행동에 관하여 흔히 있는 오해들과 혼란들을 해소하고 있기
|
||||
때문이다.
|
||||
|
||||
@ -160,7 +161,7 @@ mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
||||
|
||||
Documentation/applying-patches.txt
|
||||
패치가 무엇이며 그것을 커널의 다른 개발 브랜치들에 어떻게
|
||||
적용하는지에 관하여 자세히 설명 하고 있는 좋은 입문서이다.
|
||||
적용하는지에 관하여 자세히 설명하고 있는 좋은 입문서이다.
|
||||
|
||||
커널은 소스 코드 그 자체에서 자동적으로 만들어질 수 있는 많은 문서들을
|
||||
가지고 있다. 이것은 커널 내의 API에 대한 모든 설명, 그리고 락킹을
|
||||
@ -192,7 +193,7 @@ Documentation/DocBook/ 디렉토리 내에서 만들어지며 PDF, Postscript, H
|
||||
여러분이 어디서 시작해야 할진 모르지만 커널 개발 커뮤니티에 참여할 수
|
||||
있는 일들을 찾길 원한다면 리눅스 커널 Janitor 프로젝트를 살펴봐라.
|
||||
http://janitor.kernelnewbies.org/
|
||||
그곳은 시작하기에 아주 딱 좋은 곳이다. 그곳은 리눅스 커널 소스 트리내에
|
||||
그곳은 시작하기에 훌륭한 장소이다. 그곳은 리눅스 커널 소스 트리내에
|
||||
간단히 정리되고 수정될 수 있는 문제들에 관하여 설명한다. 여러분은 이
|
||||
프로젝트를 대표하는 개발자들과 일하면서 자신의 패치를 리눅스 커널 트리에
|
||||
반영하기 위한 기본적인 것들을 배우게 될것이며 여러분이 아직 아이디어를
|
||||
@ -212,7 +213,7 @@ Documentation/DocBook/ 디렉토리 내에서 만들어지며 PDF, Postscript, H
|
||||
것은 Linux Cross-Reference project이며 그것은 자기 참조 방식이며
|
||||
소스코드를 인덱스된 웹 페이지들의 형태로 보여준다. 최신의 멋진 커널
|
||||
코드 저장소는 다음을 통하여 참조할 수 있다.
|
||||
http://sosdg.org/~coywolf/lxr/
|
||||
http://users.sosdg.org/~qiyong/lxr/
|
||||
|
||||
|
||||
개발 프로세스
|
||||
@ -233,44 +234,45 @@ Documentation/DocBook/ 디렉토리 내에서 만들어지며 PDF, Postscript, H
|
||||
2.6.x 커널들은 Linux Torvalds가 관리하며 kernel.org의 pub/linux/kernel/v2.6/
|
||||
디렉토리에서 참조될 수 있다.개발 프로세스는 다음과 같다.
|
||||
- 새로운 커널이 배포되자마자 2주의 시간이 주어진다. 이 기간동은
|
||||
메인트너들은 큰 diff들을 Linus에게 제출할 수 있다. 대개 이 패치들은
|
||||
메인테이너들은 큰 diff들을 Linus에게 제출할 수 있다. 대개 이 패치들은
|
||||
몇 주 동안 -mm 커널내에 이미 있었던 것들이다. 큰 변경들을 제출하는 데
|
||||
선호되는 방법은 git(커널의 소스 관리 툴, 더 많은 정보들은 http://git.or.cz/
|
||||
에서 참조할 수 있다)를 사용하는 것이지만 순수한 패치파일의 형식으로 보내도
|
||||
에서 참조할 수 있다)를 사용하는 것이지만 순수한 패치파일의 형식으로 보내는
|
||||
것도 무관하다.
|
||||
- 2주 후에 -rc1 커널이 배포되며 지금부터는 전체 커널의 안정성에 영향을
|
||||
미칠수 있는 새로운 기능들을 포함하지 않는 패치들만을 추가될 수 있다.
|
||||
미칠수 있는 새로운 기능들을 포함하지 않는 패치들만이 추가될 수 있다.
|
||||
완전히 새로운 드라이버(혹은 파일시스템)는 -rc1 이후에만 받아들여진다는
|
||||
것을 기억해라. 왜냐하면 변경이 자체내에서만 발생하고 추가된 코드가
|
||||
드라이버 외부의 다른 부분에는 영향을 주지 않으므로 그런 변경은
|
||||
퇴보(regression)를 일으킬 만한 위험을 가지고 있지 않기 때문이다. -rc1이
|
||||
회귀(역자주: 이전에는 존재하지 않았지만 새로운 기능추가나 변경으로 인해
|
||||
생겨난 버그)를 일으킬 만한 위험을 가지고 있지 않기 때문이다. -rc1이
|
||||
배포된 이후에 git를 사용하여 패치들을 Linus에게 보낼수 있지만 패치들은
|
||||
공식적인 메일링 리스트로 보내서 검토를 받을 필요가 있다.
|
||||
- 새로운 -rc는 Linus는 현재 git tree가 테스트 하기에 충분히 안정된 상태에
|
||||
- 새로운 -rc는 Linus가 현재 git tree가 테스트 하기에 충분히 안정된 상태에
|
||||
있다고 판단될 때마다 배포된다. 목표는 새로운 -rc 커널을 매주 배포하는
|
||||
것이다.
|
||||
- 이러한 프로세스는 커널이 "준비"되었다고 여겨질때까지 계속된다.
|
||||
- 이러한 프로세스는 커널이 "준비(ready)"되었다고 여겨질때까지 계속된다.
|
||||
프로세스는 대체로 6주간 지속된다.
|
||||
- 각 -rc 배포에 있는 알려진 퇴보의 목록들은 다음 URI에 남겨진다.
|
||||
- 각 -rc 배포에 있는 알려진 회귀의 목록들은 다음 URI에 남겨진다.
|
||||
http://kernelnewbies.org/known_regressions
|
||||
|
||||
커널 배포에 있어서 언급할만한 가치가 있는 리눅스 커널 메일링 리스트의
|
||||
Andrew Morton의 글이 있다.
|
||||
"커널이 언제 배포될지는 아무로 모른다. 왜냐하면 배포는 알려진
|
||||
"커널이 언제 배포될지는 아무도 모른다. 왜냐하면 배포는 알려진
|
||||
버그의 상황에 따라 배포되는 것이지 미리정해 놓은 시간에 따라
|
||||
배포되는 것은 아니기 때문이다."
|
||||
배포되는 것은 아니기 때문이다."
|
||||
|
||||
2.6.x.y - 안정 커널 트리
|
||||
------------------------
|
||||
|
||||
4 자리 숫자로 이루어진 버젼의 커널들은 -stable 커널들이다. 그것들은 2.6.x
|
||||
커널에서 발견된 큰 퇴보들이나 보안 문제들 중 비교적 작고 중요한 수정들을
|
||||
커널에서 발견된 큰 회귀들이나 보안 문제들 중 비교적 작고 중요한 수정들을
|
||||
포함한다.
|
||||
|
||||
이것은 가장 최근의 안정적인 커널을 원하는 사용자에게 추천되는 브랜치이며,
|
||||
개발/실험적 버젼을 테스트하는 것을 돕는데는 별로 관심이 없다.
|
||||
개발/실험적 버젼을 테스트하는 것을 돕고자 하는 사용자들과는 별로 관련이 없다.
|
||||
|
||||
어떤 2.6.x.y 커널도 사용가능하지 않다면 그때는 가장 높은 숫자의 2.6.x
|
||||
어떤 2.6.x.y 커널도 사용할 수 없다면 그때는 가장 높은 숫자의 2.6.x
|
||||
커널이 현재의 안정 커널이다.
|
||||
|
||||
2.6.x.y는 "stable" 팀<stable@kernel.org>에 의해 관리되며 거의 매번 격주로
|
||||
@ -294,7 +296,7 @@ Andrew Morton에 의해 배포된 실험적인 커널 패치들이다. Andrew는
|
||||
서브시스템 커널 트리와 패치들을 가져와서 리눅스 커널 메일링 리스트로
|
||||
온 많은 패치들과 한데 묶는다. 이 트리는 새로운 기능들과 패치들을 위한
|
||||
장소를 제공하는 역할을 한다. 하나의 패치가 -mm에 한동안 있으면서 그 가치가
|
||||
증명되게 되면 Andrew나 서브시스템 메인트너는 그것을 메인라인에 포함시키기
|
||||
증명되게 되면 Andrew나 서브시스템 메인테이너는 그것을 메인라인에 포함시키기
|
||||
위하여 Linus에게 보낸다.
|
||||
|
||||
커널 트리에 포함하고 싶은 모든 새로운 패치들은 Linus에게 보내지기 전에
|
||||
@ -327,7 +329,7 @@ Andrew Morton에 의해 배포된 실험적인 커널 패치들이다. Andrew는
|
||||
- ACPI development tree, Len Brown <len.brown@intel.com >
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
|
||||
|
||||
- Block development tree, Jens Axboe <axboe@suse.de>
|
||||
- Block development tree, Jens Axboe <jens.axboe@oracle.com>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
|
||||
|
||||
- DRM development tree, Dave Airlie <airlied@linux.ie>
|
||||
@ -367,8 +369,8 @@ bugzilla.kernel.org는 리눅스 커널 개발자들이 커널의 버그를 추
|
||||
kernel bugzilla를 사용하는 자세한 방법은 다음을 참조하라.
|
||||
http://test.kernel.org/bugzilla/faq.html
|
||||
|
||||
메인 커널 소스 디렉토리에 있는 REPORTING-BUGS 파일은 커널 버그일 것 같은
|
||||
것을 보고하는는 법에 관한 좋은 템플릿이고 문제를 추적하기 위해서 커널
|
||||
메인 커널 소스 디렉토리에 있는 REPORTING-BUGS 파일은 커널 버그라고 생각되는
|
||||
것을 보고하는 방법에 관한 좋은 템플릿이며 문제를 추적하기 위해서 커널
|
||||
개발자들이 필요로 하는 정보가 무엇들인지를 상세히 설명하고 있다.
|
||||
|
||||
|
||||
@ -383,7 +385,7 @@ kernel bugzilla를 사용하는 자세한 방법은 다음을 참조하라.
|
||||
점수를 얻을 수 있는 가장 좋은 방법중의 하나이다. 왜냐하면 많은 사람들은
|
||||
다른 사람들의 버그들을 수정하기 위하여 시간을 낭비하지 않기 때문이다.
|
||||
|
||||
이미 보고된 버그 리포트들을 가지고 작업하기 위해서 http://bugzilla.kernelorg를
|
||||
이미 보고된 버그 리포트들을 가지고 작업하기 위해서 http://bugzilla.kernel.org를
|
||||
참조하라. 여러분이 앞으로 생겨날 버그 리포트들의 조언자가 되길 원한다면
|
||||
bugme-new 메일링 리스트나(새로운 버그 리포트들만이 이곳에서 메일로 전해진다)
|
||||
bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메일로 전해진다)
|
||||
@ -404,8 +406,8 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
||||
웹상의 많은 다른 곳에도 메일링 리스트의 아카이브들이 있다.
|
||||
이러한 아카이브들을 찾으려면 검색 엔진을 사용하라. 예를 들어:
|
||||
http://dir.gmane.org/gmane.linux.kernel
|
||||
여러분이 새로운 문제에 관해 리스트에 올리기 전에 말하고 싶은 주제에 대한
|
||||
것을 아카이브에서 먼저 찾기를 강력히 권장한다. 이미 상세하게 토론된 많은
|
||||
여러분이 새로운 문제에 관해 리스트에 올리기 전에 말하고 싶은 주제에 관한
|
||||
것을 아카이브에서 먼저 찾아보기를 강력히 권장한다. 이미 상세하게 토론된 많은
|
||||
것들이 메일링 리스트의 아카이브에 기록되어 있다.
|
||||
|
||||
각각의 커널 서브시스템들의 대부분은 자신들의 개발에 관한 노력들로 이루어진
|
||||
@ -443,7 +445,7 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
||||
무엇보다도 메일링 리스트의 다른 구독자들에게 보여주려 한다는 것을 기억하라.
|
||||
|
||||
|
||||
커뮤니티와 일하는 법
|
||||
커뮤니티와 협력하는 법
|
||||
--------------------
|
||||
|
||||
커널 커뮤니티의 목적은 가능한한 가장 좋은 커널을 제공하는 것이다. 여러분이
|
||||
@ -474,7 +476,7 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
||||
올바른 방향의 해결책으로 이끌어갈 의지가 있다면 받아들여질 것이라는 점을
|
||||
기억하라.
|
||||
|
||||
여러분의 첫 패치에 여러분이 수정해야하는 십여개 정도의 회신이 오는
|
||||
여러분의 첫 패치에 여러분이 수정해야하는 십여개 정도의 회신이 오는
|
||||
경우도 흔하다. 이것은 여러분의 패치가 받아들여지지 않을 것이라는 것을
|
||||
의미하는 것이 아니고 개인적으로 여러분에게 감정이 있어서 그러는 것도
|
||||
아니다. 간단히 여러분의 패치에 제기된 문제들을 수정하고 그것을 다시
|
||||
@ -486,12 +488,12 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
||||
커널 커뮤니티는 가장 전통적인 회사의 개발 환경과는 다르다. 여기에 여러분들의
|
||||
문제를 피하기 위한 목록이 있다.
|
||||
여러분들이 제안한 변경들에 관하여 말할 때 좋은 것들 :
|
||||
- " 이것은 여러 문제들을 해겹합니다."
|
||||
- "이것은 여러 문제들을 해겹합니다."
|
||||
- "이것은 2000 라인의 코드를 제거합니다."
|
||||
- "이것은 내가 말하려는 것에 관해 설명하는 패치입니다."
|
||||
- "나는 5개의 다른 아키텍쳐에서 그것을 테스트했슴으로..."
|
||||
- "여기에 일련의 작은 패치들이 있습음로..."
|
||||
- "이것은 일반적인 머신에서 성능을 향상시키므로..."
|
||||
- "여기에 일련의 작은 패치들이 있슴음로..."
|
||||
- "이것은 일반적인 머신에서 성능을 향상시킴으로..."
|
||||
|
||||
여러분들이 말할 때 피해야 할 좋지 않은 것들 :
|
||||
- "우리를 그것을 AIT/ptx/Solaris에서 이러한 방법으로 했다. 그러므로 그것은 좋은 것임에 틀립없다..."
|
||||
@ -500,7 +502,7 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
||||
- "이것은 우리의 엔터프라이즈 상품 라인을 위한 것이다."
|
||||
- "여기에 나의 생각을 말하고 있는 1000 페이지 설계 문서가 있다."
|
||||
- "나는 6달동안 이것을 했으니..."
|
||||
- "여기세 5000라인 짜리 패치가 있으니..."
|
||||
- "여기에 5000라인 짜리 패치가 있으니..."
|
||||
- "나는 현재 뒤죽박죽인 것을 재작성했다. 그리고 여기에..."
|
||||
- "나는 마감시한을 가지고 있으므로 이 패치는 지금 적용될 필요가 있다."
|
||||
|
||||
@ -510,13 +512,13 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
||||
없다는 것이다. 리눅스 커널의 작업 환경에서는 단지 이메일 주소만
|
||||
알수 있기 때문에 여성과 소수 민족들도 모두 받아들여진다. 국제적으로
|
||||
일하게 되는 측면은 사람의 이름에 근거하여 성별을 추측할 수 없게
|
||||
하기때문에 차별을 없애는 데 도움을 준다. Andrea라는 이름을 가진 남자와
|
||||
하기때문에 차별을 없애는 데 도움을 준다. Andrea라는 이름을 가진 남자와
|
||||
Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅스 커널에서
|
||||
작업하며 생각을 표현해왔던 대부분의 여성들은 긍정적인 경험을 가지고
|
||||
있다.
|
||||
|
||||
언어 장벽은 영어에 익숙하지 않은 몇몇 사람들에게 문제가 될 수도 있다.
|
||||
언어의 훌륭한 구사는 메일링 리스트에서 올바르게 자신의 생각을
|
||||
언어의 훌륭한 구사는 메일링 리스트에서 올바르게 자신의 생각을
|
||||
표현하기 위하여 필요하다. 그래서 여러분은 이메일을 보내기 전에
|
||||
영어를 올바르게 사용하고 있는지를 체크하는 것이 바람직하다.
|
||||
|
||||
@ -524,13 +526,13 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
||||
여러분의 변경을 나누어라
|
||||
------------------------
|
||||
|
||||
리눅스 커널 커뮤니티는 한꺼번에 굉장히 큰 코드의 묶음을 쉽게
|
||||
리눅스 커널 커뮤니티는 한꺼번에 굉장히 큰 코드의 묶음(chunk)을 쉽게
|
||||
받아들이지 않는다. 변경은 적절하게 소개되고, 검토되고, 각각의
|
||||
부분으로 작게 나누어져야 한다. 이것은 회사에서 하는 것과는 정확히
|
||||
반대되는 것이다. 여러분들의 제안은 개발 초기에 일찍이 소개되야 한다.
|
||||
그래서 여러분들은 자신이 하고 있는 것에 관하여 피드백을 받을 수 있게
|
||||
된다. 커뮤니티가 여러분들이 커뮤니티와 함께 일하고 있다는 것을
|
||||
느끼도록 만들고 커뮤니티가 여러분의 기능을 위한 쓰레기 장으로서
|
||||
느끼도록 만들고 커뮤니티가 여러분의 기능을 위한 쓰레기 장으로써
|
||||
사용되지 않고 있다는 것을 느끼게 하자. 그러나 메일링 리스트에 한번에
|
||||
50개의 이메일을 보내지는 말아라. 여러분들의 일련의 패치들은 항상
|
||||
더 작아야 한다.
|
||||
@ -539,7 +541,7 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
||||
|
||||
1) 작은 패치들은 여러분의 패치들이 적용될 수 있는 확률을 높여준다.
|
||||
왜냐하면 다른 사람들은 정확성을 검증하기 위하여 많은 시간과 노력을
|
||||
들이기를 원하지 않는다. 5줄의 패치는 메인트너가 거의 몇 초간 힐끗
|
||||
들이기를 원하지 않는다. 5줄의 패치는 메인테이너가 거의 몇 초간 힐끗
|
||||
보면 적용될 수 있다. 그러나 500 줄의 패치는 정확성을 검토하기 위하여
|
||||
몇시간이 걸릴 수도 있다(걸리는 시간은 패치의 크기 혹은 다른 것에
|
||||
비례하여 기하급수적으로 늘어난다).
|
||||
@ -558,18 +560,18 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
||||
간결하고 가장 뛰어난 답을 보길 원한다. 훌륭한 학생은 이것을 알고
|
||||
마지막으로 답을 얻기 전 중간 과정들을 제출하진 않는다.
|
||||
|
||||
커널 개발도 마찬가지이다. 메인트너들과 검토하는 사람들은 문제를
|
||||
커널 개발도 마찬가지이다. 메인테이너들과 검토하는 사람들은 문제를
|
||||
풀어나가는 과정속에 숨겨진 과정을 보길 원하진 않는다. 그들은
|
||||
간결하고 멋진 답을 보길 원한다."
|
||||
|
||||
커뮤니티와 함께 일하며 뛰어난 답을 찾고 여러분들의 완성되지 않은 일들
|
||||
사이에 균형을 유지해야 하는 어려움이 있을 수 있다. 그러므로 프로세스의
|
||||
초반에 여러분의 일을 향상시키기위한 피드백을 얻는 것 뿐만 아니라
|
||||
커뮤니티와 협력하며 뛰어난 답을 찾는 것과 여러분들의 끝마치지 못한 작업들
|
||||
사이에 균형을 유지해야 하는 것은 어려울지도 모른다. 그러므로 프로세스의
|
||||
초반에 여러분의 작업을 향상시키기위한 피드백을 얻는 것 뿐만 아니라
|
||||
여러분들의 변경들을 작은 묶음으로 유지해서 심지어는 여러분의 작업의
|
||||
모든 부분이 지금은 포함될 준비가 되어있지 않지만 작은 부분은 이미
|
||||
모든 부분이 지금은 포함될 준비가 되어있지 않지만 작은 부분은 벌써
|
||||
받아들여질 수 있도록 유지하는 것이 바람직하다.
|
||||
|
||||
또한 완성되지 않았고 "나중에 수정될 것이다." 와 같은 것들은 포함하는
|
||||
또한 완성되지 않았고 "나중에 수정될 것이다." 와 같은 것들을 포함하는
|
||||
패치들은 받아들여지지 않을 것이라는 점을 유념하라.
|
||||
|
||||
변경을 정당화해라
|
||||
@ -577,7 +579,7 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
||||
|
||||
여러분들의 나누어진 패치들을 리눅스 커뮤니티가 왜 반영해야 하는지를
|
||||
알도록 하는 것은 매우 중요하다. 새로운 기능들이 필요하고 유용하다는
|
||||
것은 반드시 그에 맞는 이유가 있어야 한다.
|
||||
것은 반드시 그에 합당한 이유가 있어야 한다.
|
||||
|
||||
|
||||
변경을 문서화해라
|
||||
@ -588,7 +590,7 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
||||
것이다. 그리고 항상 그 내용을 보길 원하는 모든 사람들을 위해 보존될
|
||||
것이다. 패치는 완벽하게 다음과 같은 내용들을 포함하여 설명해야 한다.
|
||||
- 변경이 왜 필요한지
|
||||
- 패치에 관한 전체 설계 어프로치
|
||||
- 패치에 관한 전체 설계 접근(approach)
|
||||
- 구현 상세들
|
||||
- 테스트 결과들
|
||||
|
||||
@ -600,7 +602,7 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
||||
|
||||
|
||||
이 모든 것을 하는 것은 매우 어려운 일이다. 완벽히 소화하는 데는 적어도 몇년이
|
||||
걸릴 수도 있다. 많은 인내와 결의가 필요한 계속되는 개선의 과정이다. 그러나
|
||||
걸릴 수도 있다. 많은 인내와 결심이 필요한 계속되는 개선의 과정이다. 그러나
|
||||
가능한한 포기하지 말라. 많은 사람들은 이전부터 해왔던 것이고 그 사람들도
|
||||
정확하게 여러분들이 지금 서 있는 그 곳부터 시작했었다.
|
||||
|
||||
@ -620,4 +622,4 @@ David A. Wheeler, Junio Hamano, Michael Kerrisk, and Alex Shepard에게도 감
|
||||
|
||||
|
||||
|
||||
메인트너: Greg Kroah-Hartman <greg@kroah.com>
|
||||
메인테이너: Greg Kroah-Hartman <greg@kroah.com>
|
||||
|
195
Documentation/ko_KR/stable_api_nonsense.txt
Normal file
195
Documentation/ko_KR/stable_api_nonsense.txt
Normal file
@ -0,0 +1,195 @@
|
||||
NOTE:
|
||||
This is a version of Documentation/stable_api_nonsense.txt translated
|
||||
into korean
|
||||
This document is maintained by barrios <minchan.kim@gmail.com>
|
||||
If you find any difference between this document and the original file or
|
||||
a problem with the translation, please contact the maintainer of this file.
|
||||
|
||||
Please also note that the purpose of this file is to be easier to
|
||||
read for non English (read: korean) speakers and is not intended as
|
||||
a fork. So if you have any comments or updates for this file please
|
||||
try to update the original English file first.
|
||||
|
||||
==================================
|
||||
이 문서는
|
||||
Documentation/stable_api_nonsense.txt
|
||||
의 한글 번역입니다.
|
||||
|
||||
역자: 김민찬 <minchan.kim@gmail.com>
|
||||
감수: 이제이미 <jamee.lee@samsung.com>
|
||||
==================================
|
||||
|
||||
리눅스 커널 드라이버 인터페이스
|
||||
(여러분들의 모든 질문에 대한 답 그리고 다른 몇가지)
|
||||
|
||||
Greg Kroah-Hartman <greg@kroah.com>
|
||||
|
||||
이 문서는 리눅스가 왜 바이너리 커널 인터페이스를 갖지 않는지, 왜 변하지
|
||||
않는(stable) 커널 인터페이스를 갖지 않는지를 설명하기 위해 쓰여졌다.
|
||||
이 문서는 커널과 유저공간 사이의 인터페이스가 아니라 커널 내부의
|
||||
인터페이스들을 설명하고 있다는 것을 유념하라. 커널과 유저공간 사이의
|
||||
인터페이스는 응용프로그램이 사용하는 syscall 인터페이스이다. 그 인터페이스는
|
||||
오랫동안 거의 변하지 않았고 앞으로도 변하지 않을 것이다. 나는 pre 0.9에서
|
||||
만들어졌지만 최신의 2.6 커널 배포에서도 잘 동작하는 프로그램을 가지고
|
||||
있다. 이 인터페이스는 사용자와 응용프로그램 개발자들이 변하지 않을 것이라고
|
||||
여길수 있는 것이다.
|
||||
|
||||
|
||||
초록
|
||||
----
|
||||
여러분은 변하지 않는 커널 인터페이스를 원한다고 생각하지만 실제로는
|
||||
그렇지 않으며 심지어는 그것을 알아채지 못한다. 여러분이 원하는 것은
|
||||
안정되게 실행되는 드라이버이며 드라이버가 메인 커널 트리에 있을 때
|
||||
그런 안정적인 드라이버를 얻을 수 있게 된다. 또한 여러분의 드라이버가
|
||||
메인 커널 트리에 있다면 다른 많은 좋은 이점들을 얻게 된다. 그러한 것들이
|
||||
리눅스를 강건하고, 안정적이며, 성숙한 운영체제로 만들어 놓음으로써
|
||||
여러분들로 하여금 바로 리눅스를 사용하게 만드는 이유이다.
|
||||
|
||||
|
||||
소개
|
||||
----
|
||||
|
||||
커널 내부의 인터페이스가 바뀌는 것을 걱정하며 커널 드라이버를 작성하고
|
||||
싶어하는 사람은 정말 이상한 사람이다. 세상의 대다수의 사람들은 이 인터페이스를
|
||||
보지못할 것이며 전혀 걱정하지도 않는다.
|
||||
|
||||
먼저, 나는 closed 소스, hidden 소스, binary blobs, 소스 wrappers, 또는 GPL로
|
||||
배포되었지만 소스 코드를 갖고 있지 않은 커널 드라이버들을 설명하는 어떤 다른
|
||||
용어들에 관한 어떤 법적인 문제에 관해서는 언급하지 않을 것이다. 어떤 법적인
|
||||
질문들을 가지고 있다면 변호사와 연락하라. 나는 프로그래머이므로 여기서 기술적인
|
||||
문제들만을 설명하려고 한다. (법적인 문제를 경시하는 것은 아니다. 그런 문제들은
|
||||
엄연히 현실에 있고 여러분들은 항상 그 문제들을 인식하고 있을 필요는 있다.)
|
||||
|
||||
자, 두가지의 주요 주제가 있다. 바이너리 커널 인터페이스들과 변하지 않는
|
||||
커널 소스 인터페이들. 그것들은 서로 의존성을 가지고 있지만 바이너리
|
||||
문제를 먼저 풀고 넘어갈 것이다.
|
||||
|
||||
|
||||
|
||||
바이너리 커널 인터페이스
|
||||
------------------------
|
||||
우리가 변하지 않는 커널 소스 인터페이스를 가지고 있다고 가정하자. 그러면
|
||||
바이너리 인터페이스 또한 자연적으로 변하지 않을까? 틀렸다. 리눅스 커널에
|
||||
관한 다음 사실들을 생각해보라.
|
||||
- 여러분들이 사용하는 C 컴파일러의 버젼에 따라 다른 커널 자료 구조들은
|
||||
다른 alignmnet들을 갖게 될것이고 다른 방법으로(함수들을 inline으로
|
||||
했느냐, 아니냐) 다른 함수들을 포함하는 것도 가능한다. 중요한 것은
|
||||
개별적인 함수 구성이 아니라 자료 구조 패딩이 달라진다는 점이다.
|
||||
- 여러분이 선택한 커널 빌드 옵션에 따라서 커널은 다양한 것들을 가정할
|
||||
수 있다.
|
||||
- 다른 구조체들은 다른 필드들을 포함할 수 있다.
|
||||
- 몇몇 함수들은 전혀 구현되지 않을 수도 있다(즉, 몇몇 lock들은
|
||||
non-SMP 빌드에서는 사라져 버릴수도 있다).
|
||||
- 커널내에 메모리는 build optoin들에 따라 다른 방법으로 align될수
|
||||
있다.
|
||||
- 리눅스는 많은 다양한 프로세서 아키텍쳐에서 실행된다. 한 아키텍쳐의
|
||||
바이너리 드라이버를 다른 아키텍쳐에서 정상적으로 실행시킬 방법은
|
||||
없다.
|
||||
|
||||
커널을 빌드했던 C 컴파일러와 정확하게 같은 것을 사용하고 정확하게 같은
|
||||
커널 구성(configuration)을 사용하여 여러분들의 모듈을 빌드하면 간단히
|
||||
많은 문제들을 해결할 수 있다. 이렇게 하는 것은 여러분들이 하나의 리눅스
|
||||
배포판의 하나의 배포 버젼을 위한 모듈만을 제공한다면 별일 아닐 것이다.
|
||||
그러나 각기 다른 리눅스 배포판마다 한번씩 빌드하는 수를 각 리눅스 배포판마다
|
||||
제공하는 다른 릴리즈의 수와 곱하게 되면 이번에는 각 릴리즈들의 다른 빌드
|
||||
옵션의 악몽과 마주하게 것이다. 또한 각 리눅스 배포판들은 다른 하드웨어
|
||||
종류에(다른 프로세서 타입과 다른 옵션들) 맞춰져 있는 많은 다른 커널들을
|
||||
배포한다. 그러므로 한번의 배포에서조차 여러분들의 모듈은 여러 버젼을
|
||||
만들 필요가 있다.
|
||||
|
||||
나를 믿어라. 여러분들은 이러한 종류의 배포를 지원하려고 시도한다면 시간이
|
||||
지나면 미칠지경이 될 것이다. 난 이러한 것을 오래전에 아주 어렵게 배웠다...
|
||||
|
||||
|
||||
|
||||
변하지않는 커널 소스 인터페이스들
|
||||
---------------------------------
|
||||
|
||||
리눅스 커널 드라이버를 계속해서 메인 커널 트리에 반영하지 않고
|
||||
유지보수하려고 하는 사름들과 이 문제를 논의하게 되면 훨씬 더
|
||||
"논란의 여지가 많은" 주제가 될 것이다.
|
||||
|
||||
리눅스 커널 개발은 끊임없이 빠른 속도로 이루어지고 있으며 결코
|
||||
느슨해진 적이 없다. 커널 개발자들이 현재 인터페이스들에서 버그를
|
||||
발견하거나 무엇인가 할수 있는 더 좋은 방법을 찾게 되었다고 하자.
|
||||
그들이 발견한 것을 실행한다면 아마도 더 잘 동작하도록 현재 인터페이스들을
|
||||
수정하게 될 것이다. 그들이 그런 일을 하게되면 함수 이름들은 변하게 되고,
|
||||
구조체들은 늘어나거나 줄어들게 되고, 함수 파라미터들은 재작업될 것이다.
|
||||
이러한 일이 발생되면 커널 내에 이 인터페이스를 사용했던 인스턴스들이 동시에
|
||||
수정될 것이며 이러한 과정은 모든 것이 계속해서 올바르게 동작할 것이라는
|
||||
것을 보장한다.
|
||||
|
||||
이러한 것의 한 예로써, 커널 내부의 USB 인터페이스들은 이 서브시스템이
|
||||
생긴 이후로 적어도 3번의 다른 재작업을 겪었다. 이 재작업들은 많은 다른
|
||||
문제들을 풀었다.
|
||||
- 데이터 스트림들의 동기적인 모델에서 비동기적인 모델로의 변화. 이것은
|
||||
많은 드라이버들의 복잡성을 줄이고 처리량을 향상시켜 현재는 거의 모든
|
||||
USB 장치들의 거의 최대 속도로 실행되고 있다.
|
||||
- USB 드라이버가 USB 코어로부터 데이터 패킷들을 할당받로록 한 변경으로
|
||||
인해서 지금의 모든 드라이버들은 많은 문서화된 데드락을 수정하기 위하여
|
||||
USB 코어에게 더 많은 정보를 제공해야만 한다.
|
||||
|
||||
이것은 오랫동안 자신의 오래된 USB 인터페이스들을 유지해야 하는 closed 운영체제들과는
|
||||
완전히 반대되는 것이다. closed된 운영체제들은 새로운 개발자들에게 우연히 낡은
|
||||
인터페이스를 사용하게 할 기회를 주게되며, 적절하지 못한 방법으로 처리하게 되어
|
||||
운영체제의 안정성을 해치는 문제를 야기하게 된다.
|
||||
|
||||
이 두가지의 예들 모두, 모든 개발자들은 꼭 이루어져야 하는 중요한 변화들이라고
|
||||
동의를 하였고 비교적 적은 고통으로 변경되어졌다. 리눅스가 변하지 않는 소스
|
||||
인터페이스를 고집한다면, 새로운 인터페이스가 만들어지게 되며 반면 기존의 오래된
|
||||
것들, 그리고 깨진 것들은 계속해서 유지되어야 하며 이러한 일들은 USB 개발자들에게
|
||||
또 다른 일거리를 주게 된다. 모든 리눅스 USB 개발자들에게 자신의 그들의 업무를
|
||||
마친 후 시간을 투자하여 아무 득도 없는 무료 봉사를 해달라고 하는 것은 가능성이
|
||||
희박한 일이다.
|
||||
|
||||
보안 문제 역시 리눅스에게는 매우 중요하다. 보안 문제가 발견되면 그것은
|
||||
매우 짧은 시간 안에 수정된다. 보안 문제는 그 문제를 해결하기 위하여
|
||||
여러번 내부 커널 인터페이스들을 재작업하게 만들었다. 이러한 문제가
|
||||
발생하였을 때 그 인터페이스들을 사용하는 모든 드라이버들도 동시에
|
||||
수정되어 보안 문제가 앞으로 갑작스럽게 생기지는 않을 것이라는 것을
|
||||
보장한다. 내부 인터페이스들의 변경이 허락되지 않으면 이러한 종류의 보안
|
||||
문제를 수정하고 그것이 다시 발생하지 않을 것이라고 보장하는 것은 가능하지
|
||||
않을 것이다.
|
||||
|
||||
커널 인터페이스들은 계속해서 정리되고 있다. 현재 인터페이스를 사용하는
|
||||
사람이 한명도 없다면 그것은 삭제된다. 이것은 커널이 가능한한 가장 작게
|
||||
유지되며 존재하는 모든 가능성이 있는 인터페이스들이 테스트된다는 것을
|
||||
보장한다(사용되지 않는 인터페이스들은 유효성 검증을 하기가 거의 불가능하다).
|
||||
|
||||
|
||||
무엇을 해야 하나
|
||||
---------------
|
||||
자, 여러분이 메인 커널 트리에 있지 않은 리눅스 커널 드라이버를 가지고
|
||||
있다면 여러분은 즉, 개발자는 무엇을 해야 하나? 모든 배포판마다 다른
|
||||
커널 버젼을 위한 바이너리 드라이버를 배포하는 것은 악몽이며 계속해서
|
||||
변하고 있는 커널 인터페이스들의 맞처 유지보수하려고 시도하는 것은 힘든
|
||||
일이다.
|
||||
|
||||
간단하다. 여러분의 커널 드라이버를 메인 커널 트리에 반영하라(우리는 여기서
|
||||
GPL을 따르는 배포 드라이버에 관해 얘기하고 있다는 것을 상기하라. 여러분의
|
||||
코드가 이러한 분류에 해당되지 않는다면 행운을 빈다. 여러분 스스로 어떻게든
|
||||
해야만 한다). 여러분의 드라이버가 트리에 있게되면 커널 인터페이스가
|
||||
변경되더라도 가장 먼저 커널에 변경을 가했던 사람에 의해서 수정될 것이다.
|
||||
이것은 여러분의 드라이버가 여러분의 별다른 노력없이 항상 빌드가 가능하며
|
||||
동작하는 것을 보장한다.
|
||||
|
||||
메인 커널 트리에 여러분의 드라이버를 반영하면 얻게 되는 장점들은 다음과 같다.
|
||||
- 관리의 드는 비용(원래 개발자의)은 줄어줄면서 드라이버의 질은 향상될 것이다.
|
||||
- 다른 개발자들이 여러분의 드라이버에 기능들을 추가 할 것이다.
|
||||
- 다른 사람들은 여러분의 드라이버에 버그를 발견하고 수정할 것이다.
|
||||
- 다른 사람들은 여러분의 드라이버의 개선점을 찾을 줄 것이다.
|
||||
- 외부 인터페이스 변경으로 인해 여러분의 드라이버의 수정이 필요하다면 다른
|
||||
사람들이 드라이버를 업데이트할 것이다.
|
||||
- 여러분의 드라이버는 별다른 노력 없이 모든 리눅스 배포판에 자동적으로
|
||||
추가될 것이다.
|
||||
|
||||
리눅스는 다른 운영 체제보다 "쉽게 쓸수 있는(out of the box)" 많은 다른 장치들을
|
||||
지원하고 어떤 다른 운영 체제보다 다양한 아키텍쳐위에서 이러한 장치들을 지원하기 때문에
|
||||
이러한 증명된 개발 모델은 틀림없이 바로 가고 있는 것이다.
|
||||
|
||||
|
||||
|
||||
------
|
||||
|
||||
이 문서의 초안을 검토해주고 코멘트 해준 Randy Dunlap, Andrew Morton, David Brownell,
|
||||
Hanna Linder, Robert Love, 그리고 Nishanth Aravamudan에게 감사한다.
|
@ -109,10 +109,6 @@ Running Lguest:
|
||||
See http://linux-net.osdl.org/index.php/Bridge for general information
|
||||
on how to get bridging working.
|
||||
|
||||
- You can also create an inter-guest network using
|
||||
"--sharenet=<filename>": any two guests using the same file are on
|
||||
the same network. This file is created if it does not exist.
|
||||
|
||||
There is a helpful mailing list at http://ozlabs.org/mailman/listinfo/lguest
|
||||
|
||||
Good luck!
|
||||
|
@ -92,8 +92,14 @@ ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
|
||||
autoconfiguration.
|
||||
|
||||
The <autoconf> parameter can appear alone as the value to the `ip'
|
||||
parameter (without all the ':' characters before) in which case auto-
|
||||
configuration is used.
|
||||
parameter (without all the ':' characters before). If the value is
|
||||
"ip=off" or "ip=none", no autoconfiguration will take place, otherwise
|
||||
autoconfiguration will take place. The most common way to use this
|
||||
is "ip=dhcp".
|
||||
|
||||
Note that "ip=off" is not the same thing as "ip=::::::off", because in
|
||||
the latter autoconfiguration will take place if any of DHCP, BOOTP or RARP
|
||||
are compiled in the kernel.
|
||||
|
||||
<client-ip> IP address of the client.
|
||||
|
||||
@ -142,7 +148,7 @@ ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
|
||||
into the kernel will be used, regardless of the value of
|
||||
this option.
|
||||
|
||||
off or none: don't use autoconfiguration (default)
|
||||
off or none: don't use autoconfiguration
|
||||
on or any: use any protocol available in the kernel
|
||||
dhcp: use DHCP
|
||||
bootp: use BOOTP
|
||||
|
@ -34,6 +34,8 @@ Currently, these files are in /proc/sys/vm:
|
||||
- oom_kill_allocating_task
|
||||
- mmap_min_address
|
||||
- numa_zonelist_order
|
||||
- nr_hugepages
|
||||
- nr_overcommit_hugepages
|
||||
|
||||
==============================================================
|
||||
|
||||
@ -305,3 +307,20 @@ will select "node" order in following case.
|
||||
|
||||
Otherwise, "zone" order will be selected. Default order is recommended unless
|
||||
this is causing problems for your system/application.
|
||||
|
||||
==============================================================
|
||||
|
||||
nr_hugepages
|
||||
|
||||
Change the minimum size of the hugepage pool.
|
||||
|
||||
See Documentation/vm/hugetlbpage.txt
|
||||
|
||||
==============================================================
|
||||
|
||||
nr_overcommit_hugepages
|
||||
|
||||
Change the maximum size of the hugepage pool. The maximum is
|
||||
nr_hugepages + nr_overcommit_hugepages.
|
||||
|
||||
See Documentation/vm/hugetlbpage.txt
|
||||
|
@ -1,93 +0,0 @@
|
||||
|
||||
Parallel link cable for Texas Instruments handhelds
|
||||
===================================================
|
||||
|
||||
|
||||
Author: Romain Lievin
|
||||
Homepage: http://lpg.ticalc.org/prj_tidev/index.html
|
||||
|
||||
|
||||
INTRODUCTION:
|
||||
|
||||
This is a driver for the very common home-made parallel link cable, a cable
|
||||
designed for connecting TI8x/9x graphing calculators (handhelds) to a computer
|
||||
or workstation (Alpha, Sparc). Given that driver is built on parport, the
|
||||
parallel port abstraction layer, this driver is architecture-independent.
|
||||
|
||||
It can also be used with another device plugged on the same port (such as a
|
||||
ZIP drive). I have a 100MB ZIP and both of them work fine!
|
||||
|
||||
If you need more information, please visit the 'TI drivers' homepage at the URL
|
||||
above.
|
||||
|
||||
WHAT YOU NEED:
|
||||
|
||||
A TI calculator and a program capable of communicating with your calculator.
|
||||
|
||||
TiLP will work for sure (since I am its developer!). yal92 may be able to use
|
||||
it by changing tidev for tipar (may require some hacking...).
|
||||
|
||||
HOW TO USE IT:
|
||||
|
||||
You must have first compiled parport support (CONFIG_PARPORT_DEV): either
|
||||
compiled in your kernel, either as a module.
|
||||
|
||||
Next, (as root):
|
||||
|
||||
modprobe parport
|
||||
modprobe tipar
|
||||
|
||||
If it is not already there (it usually is), create the device:
|
||||
|
||||
mknod /dev/tipar0 c 115 0
|
||||
mknod /dev/tipar1 c 115 1
|
||||
mknod /dev/tipar2 c 115 2
|
||||
|
||||
You will have to set permissions on this device to allow you to read/write
|
||||
from it:
|
||||
|
||||
chmod 666 /dev/tipar[0..2]
|
||||
|
||||
Now you are ready to run a linking program such as TiLP. Be sure to configure
|
||||
it properly (RTFM).
|
||||
|
||||
MODULE PARAMETERS:
|
||||
|
||||
You can set these with: modprobe tipar NAME=VALUE
|
||||
There is currently no way to set these on a per-cable basis.
|
||||
|
||||
NAME: timeout
|
||||
TYPE: integer
|
||||
DEFAULT: 15
|
||||
DESC: Timeout value in tenth of seconds. If no data is available once this
|
||||
time has expired then the driver will return with a timeout error.
|
||||
|
||||
NAME: delay
|
||||
TYPE: integer
|
||||
DEFAULT: 10
|
||||
DESC: Inter-bit delay in micro-seconds. A lower value gives an higher data
|
||||
rate but makes transmission less reliable.
|
||||
|
||||
These parameters can be changed at run time by any program via ioctl(2) calls
|
||||
as listed in ./include/linux/ticable.h.
|
||||
|
||||
Rather than write 50 pages describing the ioctl() and so on, it is
|
||||
perhaps more useful you look at ticables library (dev_link.c) that demonstrates
|
||||
how to use them, and demonstrates the features of the driver. This is
|
||||
probably a lot more useful to people interested in writing applications
|
||||
that will be using this driver.
|
||||
|
||||
QUIRKS/BUGS:
|
||||
|
||||
None.
|
||||
|
||||
HOW TO CONTACT US:
|
||||
|
||||
You can email me at roms@lpg.ticalc.org. Please prefix the subject line
|
||||
with "TIPAR: " so that I am certain to notice your message.
|
||||
You can also mail JB at jb@jblache.org. He packaged these drivers for Debian.
|
||||
|
||||
CREDITS:
|
||||
|
||||
The code is based on tidev.c & parport.c.
|
||||
The driver has been developed independently of Texas Instruments.
|
@ -30,9 +30,10 @@ alignment and size of the arguments to the above system calls.
|
||||
The output of "cat /proc/meminfo" will have lines like:
|
||||
|
||||
.....
|
||||
HugePages_Total: xxx
|
||||
HugePages_Free: yyy
|
||||
HugePages_Rsvd: www
|
||||
HugePages_Total: vvv
|
||||
HugePages_Free: www
|
||||
HugePages_Rsvd: xxx
|
||||
HugePages_Surp: yyy
|
||||
Hugepagesize: zzz kB
|
||||
|
||||
where:
|
||||
@ -42,6 +43,10 @@ allocated.
|
||||
HugePages_Rsvd is short for "reserved," and is the number of hugepages
|
||||
for which a commitment to allocate from the pool has been made, but no
|
||||
allocation has yet been made. It's vaguely analogous to overcommit.
|
||||
HugePages_Surp is short for "surplus," and is the number of hugepages in
|
||||
the pool above the value in /proc/sys/vm/nr_hugepages. The maximum
|
||||
number of surplus hugepages is controlled by
|
||||
/proc/sys/vm/nr_overcommit_hugepages.
|
||||
|
||||
/proc/filesystems should also show a filesystem of type "hugetlbfs" configured
|
||||
in the kernel.
|
||||
@ -71,7 +76,25 @@ or failure of allocation depends on the amount of physically contiguous
|
||||
memory that is preset in system at this time. System administrators may want
|
||||
to put this command in one of the local rc init files. This will enable the
|
||||
kernel to request huge pages early in the boot process (when the possibility
|
||||
of getting physical contiguous pages is still very high).
|
||||
of getting physical contiguous pages is still very high). In either
|
||||
case, adminstrators will want to verify the number of hugepages actually
|
||||
allocated by checking the sysctl or meminfo.
|
||||
|
||||
/proc/sys/vm/nr_overcommit_hugepages indicates how large the pool of
|
||||
hugepages can grow, if more hugepages than /proc/sys/vm/nr_hugepages are
|
||||
requested by applications. echo'ing any non-zero value into this file
|
||||
indicates that the hugetlb subsystem is allowed to try to obtain
|
||||
hugepages from the buddy allocator, if the normal pool is exhausted. As
|
||||
these surplus hugepages go out of use, they are freed back to the buddy
|
||||
allocator.
|
||||
|
||||
Caveat: Shrinking the pool via nr_hugepages while a surplus is in effect
|
||||
will allow the number of surplus huge pages to exceed the overcommit
|
||||
value, as the pool hugepages (which must have been in use for a surplus
|
||||
hugepages to be allocated) will become surplus hugepages. As long as
|
||||
this condition holds, however, no more surplus huge pages will be
|
||||
allowed on the system until one of the two sysctls are increased
|
||||
sufficiently, or the surplus huge pages go out of use and are freed.
|
||||
|
||||
If the user applications are going to request hugepages using mmap system
|
||||
call, then it is required that system administrator mount a file system of
|
||||
@ -94,8 +117,8 @@ provided on command line then no limits are set. For size and nr_inodes
|
||||
options, you can use [G|g]/[M|m]/[K|k] to represent giga/mega/kilo. For
|
||||
example, size=2K has the same meaning as size=2048.
|
||||
|
||||
read and write system calls are not supported on files that reside on hugetlb
|
||||
file systems.
|
||||
While read system calls are supported on files that reside on hugetlb
|
||||
file systems, write system calls are not.
|
||||
|
||||
Regular chown, chgrp, and chmod commands (with right permissions) could be
|
||||
used to change the file attributes on hugetlbfs.
|
||||
|
36
MAINTAINERS
36
MAINTAINERS
@ -88,7 +88,6 @@ S: Status, one of the following:
|
||||
P: Mike Phillips
|
||||
M: mikep@linuxtr.net
|
||||
L: netdev@vger.kernel.org
|
||||
L: linux-tr@linuxtr.net
|
||||
W: http://www.linuxtr.net
|
||||
S: Maintained
|
||||
|
||||
@ -167,7 +166,6 @@ S: Maintained
|
||||
|
||||
A2232 SERIAL BOARD DRIVER
|
||||
P: Enver Haase
|
||||
M: ehaase@inf.fu-berlin.de
|
||||
M: A2232@gmx.net
|
||||
L: linux-m68k@lists.linux-m68k.org
|
||||
S: Maintained
|
||||
@ -439,7 +437,7 @@ S: Maintained
|
||||
|
||||
ARM/ATMEL AT91RM9200 ARM ARCHITECTURE
|
||||
P: Andrew Victor
|
||||
M: linux@maxim.org.za
|
||||
M: andrew@sanpeople.com
|
||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||
W: http://maxim.org.za/at91_26.html
|
||||
S: Maintained
|
||||
@ -2064,7 +2062,7 @@ S: Maintained
|
||||
IOC3 SERIAL DRIVER
|
||||
P: Pat Gefre
|
||||
M: pfg@sgi.com
|
||||
L: linux-kernel@linux-mips.org
|
||||
L: linux-mips@linux-mips.org
|
||||
S: Maintained
|
||||
|
||||
IP MASQUERADING:
|
||||
@ -2491,6 +2489,12 @@ M: mtk.manpages@gmail.com
|
||||
W: ftp://ftp.kernel.org/pub/linux/docs/manpages
|
||||
S: Maintained
|
||||
|
||||
MARVELL LIBERTAS WIRELESS DRIVER
|
||||
P: Dan Williams
|
||||
M: dcbw@redhat.com
|
||||
L: libertas-dev@lists.infradead.org
|
||||
S: Maintained
|
||||
|
||||
MARVELL MV643XX ETHERNET DRIVER
|
||||
P: Dale Farnsworth
|
||||
M: dale@farnsworth.org
|
||||
@ -2753,8 +2757,10 @@ S: Maintained
|
||||
|
||||
NFS CLIENT
|
||||
P: Trond Myklebust
|
||||
M: trond.myklebust@fys.uio.no
|
||||
L: linux-kernel@vger.kernel.org
|
||||
M: Trond.Myklebust@netapp.com
|
||||
L: linux-nfs@vger.kernel.org
|
||||
W: http://client.linux-nfs.org
|
||||
T: git git://git.linux-nfs.org/pub/linux/nfs-2.6.git
|
||||
S: Maintained
|
||||
|
||||
NI5010 NETWORK DRIVER
|
||||
@ -2815,7 +2821,6 @@ M: p2@ace.ulyssis.student.kuleuven.ac.be
|
||||
P: Mike Phillips
|
||||
M: mikep@linuxtr.net
|
||||
L: netdev@vger.kernel.org
|
||||
L: linux-tr@linuxtr.net
|
||||
W: http://www.linuxtr.net
|
||||
S: Maintained
|
||||
|
||||
@ -2953,7 +2958,7 @@ S: Supported
|
||||
PCMCIA SUBSYSTEM
|
||||
P: Linux PCMCIA Team
|
||||
L: linux-pcmcia@lists.infradead.org
|
||||
L: http://lists.infradead.org/mailman/listinfo/linux-pcmcia
|
||||
W: http://lists.infradead.org/mailman/listinfo/linux-pcmcia
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
|
||||
S: Maintained
|
||||
|
||||
@ -3702,11 +3707,6 @@ M: nagar@watson.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
TI PARALLEL LINK CABLE DRIVER
|
||||
P: Romain Lievin
|
||||
M: roms@lpg.ticalc.org
|
||||
S: Maintained
|
||||
|
||||
TIPC NETWORK LAYER
|
||||
P: Per Liden
|
||||
M: per.liden@ericsson.com
|
||||
@ -3731,7 +3731,6 @@ TOKEN-RING NETWORK DRIVER
|
||||
P: Mike Phillips
|
||||
M: mikep@linuxtr.net
|
||||
L: netdev@vger.kernel.org
|
||||
L: linux-tr@linuxtr.net
|
||||
W: http://www.linuxtr.net
|
||||
S: Maintained
|
||||
|
||||
@ -4049,7 +4048,7 @@ S: Maintained
|
||||
|
||||
USER-MODE LINUX
|
||||
P: Jeff Dike
|
||||
M: jdike@karaya.com
|
||||
M: jdike@addtoit.com
|
||||
L: user-mode-linux-devel@lists.sourceforge.net
|
||||
L: user-mode-linux-user@lists.sourceforge.net
|
||||
W: http://user-mode-linux.sourceforge.net
|
||||
@ -4280,13 +4279,6 @@ L: mjpeg-users@lists.sourceforge.net
|
||||
W: http://mjpeg.sourceforge.net/driver-zoran/
|
||||
S: Maintained
|
||||
|
||||
ZR36120 VIDEO FOR LINUX DRIVER
|
||||
P: Pauline Middelink
|
||||
M: middelin@polyware.nl
|
||||
W: http://www.polyware.nl/~middelin/En/hobbies.html
|
||||
W: http://www.polyware.nl/~middelin/hobbies.html
|
||||
S: Maintained
|
||||
|
||||
ZS DECSTATION Z85C30 SERIAL DRIVER
|
||||
P: Maciej W. Rozycki
|
||||
M: macro@linux-mips.org
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 24
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Arr Matey! A Hairy Bilge Rat!
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -14,13 +14,13 @@ LDFLAGS_vmlinux := -static -N #-relax
|
||||
CHECKFLAGS += -D__alpha__ -m64
|
||||
cflags-y := -pipe -mno-fp-regs -ffixed-8 -msmall-data
|
||||
|
||||
cpuflags-$(CONFIG_ALPHA_EV67) := -mcpu=ev67
|
||||
cpuflags-$(CONFIG_ALPHA_EV6) := -mcpu=ev6
|
||||
cpuflags-$(CONFIG_ALPHA_EV4) := -mcpu=ev4
|
||||
cpuflags-$(CONFIG_ALPHA_EV5) := -mcpu=ev5
|
||||
cpuflags-$(CONFIG_ALPHA_EV56) := -mcpu=ev56
|
||||
cpuflags-$(CONFIG_ALPHA_POLARIS) := -mcpu=pca56
|
||||
cpuflags-$(CONFIG_ALPHA_SX164) := -mcpu=pca56
|
||||
cpuflags-$(CONFIG_ALPHA_EV56) := -mcpu=ev56
|
||||
cpuflags-$(CONFIG_ALPHA_EV5) := -mcpu=ev5
|
||||
cpuflags-$(CONFIG_ALPHA_EV4) := -mcpu=ev4
|
||||
cpuflags-$(CONFIG_ALPHA_EV6) := -mcpu=ev6
|
||||
cpuflags-$(CONFIG_ALPHA_EV67) := -mcpu=ev67
|
||||
# If GENERIC, make sure to turn off any instruction set extensions that
|
||||
# the host compiler might have on by default. Given that EV4 and EV5
|
||||
# have the same instruction set, prefer EV5 because an EV5 schedule is
|
||||
|
@ -273,7 +273,7 @@ ev7_process_pal_subpacket(struct el_subpacket *header)
|
||||
struct el_subpacket_handler ev7_pal_subpacket_handler =
|
||||
SUBPACKET_HANDLER_INIT(EL_CLASS__PAL, ev7_process_pal_subpacket);
|
||||
|
||||
void
|
||||
void __init
|
||||
ev7_register_error_handlers(void)
|
||||
{
|
||||
int i;
|
||||
|
@ -1152,7 +1152,7 @@ marvel_machine_check(u64 vector, u64 la_ptr)
|
||||
mb();
|
||||
}
|
||||
|
||||
void
|
||||
void __init
|
||||
marvel_register_error_handlers(void)
|
||||
{
|
||||
ev7_register_error_handlers();
|
||||
|
@ -564,7 +564,7 @@ static struct el_subpacket_handler titan_subpacket_handler =
|
||||
SUBPACKET_HANDLER_INIT(EL_CLASS__REGATTA_FAMILY,
|
||||
el_process_regatta_subpacket);
|
||||
|
||||
void
|
||||
void __init
|
||||
titan_register_error_handlers(void)
|
||||
{
|
||||
size_t i;
|
||||
|
@ -134,7 +134,7 @@
|
||||
#define __initmv __initdata
|
||||
#define ALIAS_MV(x)
|
||||
#else
|
||||
#define __initmv
|
||||
#define __initmv __initdata_refok
|
||||
|
||||
/* GCC actually has a syntax for defining aliases, but is under some
|
||||
delusion that you shouldn't be able to declare it extern somewhere
|
||||
|
@ -362,10 +362,10 @@ $unaligned:
|
||||
|
||||
extql t2, a1, t2 # U :
|
||||
cmpbge zero, t1, t8 # E : is there a zero?
|
||||
andnot t2, t6, t12 # E : dest mask for a single word copy
|
||||
andnot t2, t6, t2 # E : dest mask for a single word copy
|
||||
or t8, t10, t5 # E : test for end-of-count too
|
||||
|
||||
cmpbge zero, t12, t3 # E :
|
||||
cmpbge zero, t2, t3 # E :
|
||||
cmoveq a2, t5, t8 # E : Latency=2, extra map slot
|
||||
nop # E : keep with cmoveq
|
||||
andnot t8, t3, t8 # E : (stall)
|
||||
@ -379,13 +379,13 @@ $unaligned:
|
||||
negq t8, t6 # E : build bitmask of bytes <= zero
|
||||
mskqh t1, t4, t1 # U :
|
||||
|
||||
and t6, t8, t2 # E :
|
||||
subq t2, 1, t6 # E : (stall)
|
||||
or t6, t2, t8 # E : (stall)
|
||||
zapnot t12, t8, t12 # U : prepare source word; mirror changes (stall)
|
||||
and t6, t8, t12 # E :
|
||||
subq t12, 1, t6 # E : (stall)
|
||||
or t6, t12, t8 # E : (stall)
|
||||
zapnot t2, t8, t2 # U : prepare source word; mirror changes (stall)
|
||||
|
||||
zapnot t1, t8, t1 # U : to source validity mask
|
||||
andnot t0, t12, t0 # E : zero place for source to reside
|
||||
andnot t0, t2, t0 # E : zero place for source to reside
|
||||
or t0, t1, t0 # E : and put it there (stall both t0, t1)
|
||||
stq_u t0, 0(a0) # L : (stall)
|
||||
|
||||
|
@ -35,7 +35,7 @@ strncpy:
|
||||
|
||||
or $3, $24, $3 # clear the bits between the last
|
||||
or $4, $27, $4 # written byte and the last byte in COUNT
|
||||
andnot $4, $3, $4
|
||||
andnot $3, $4, $4
|
||||
zap $1, $4, $1
|
||||
|
||||
stq_u $1, 0($16)
|
||||
|
@ -315,9 +315,9 @@ $unaligned:
|
||||
|
||||
extql t2, a1, t2 # e0 :
|
||||
cmpbge zero, t1, t8 # .. e1 : is there a zero?
|
||||
andnot t2, t6, t12 # e0 : dest mask for a single word copy
|
||||
andnot t2, t6, t2 # e0 : dest mask for a single word copy
|
||||
or t8, t10, t5 # .. e1 : test for end-of-count too
|
||||
cmpbge zero, t12, t3 # e0 :
|
||||
cmpbge zero, t2, t3 # e0 :
|
||||
cmoveq a2, t5, t8 # .. e1 :
|
||||
andnot t8, t3, t8 # e0 :
|
||||
beq t8, $u_head # .. e1 (zdb)
|
||||
@ -330,14 +330,14 @@ $unaligned:
|
||||
ldq_u t0, 0(a0) # e0 :
|
||||
negq t8, t6 # .. e1 : build bitmask of bytes <= zero
|
||||
mskqh t1, t4, t1 # e0 :
|
||||
and t6, t8, t2 # .. e1 :
|
||||
subq t2, 1, t6 # e0 :
|
||||
or t6, t2, t8 # e1 :
|
||||
and t6, t8, t12 # .. e1 :
|
||||
subq t12, 1, t6 # e0 :
|
||||
or t6, t12, t8 # e1 :
|
||||
|
||||
zapnot t12, t8, t12 # e0 : prepare source word; mirror changes
|
||||
zapnot t2, t8, t2 # e0 : prepare source word; mirror changes
|
||||
zapnot t1, t8, t1 # .. e1 : to source validity mask
|
||||
|
||||
andnot t0, t12, t0 # e0 : zero place for source to reside
|
||||
andnot t0, t2, t0 # e0 : zero place for source to reside
|
||||
or t0, t1, t0 # e1 : and put it there
|
||||
stq_u t0, 0(a0) # e0 :
|
||||
ret (t9) # .. e1 :
|
||||
|
@ -537,7 +537,7 @@ config ISA_DMA_API
|
||||
bool
|
||||
|
||||
config PCI
|
||||
bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_IXP4XX || ARCH_KS8695
|
||||
bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_IXP4XX || ARCH_KS8695 || MACH_ARMCORE
|
||||
help
|
||||
Find out whether you have a PCI motherboard. PCI is the name of a
|
||||
bus system, i.e. the way the CPU talks to the other stuff inside
|
||||
@ -558,6 +558,12 @@ config PCI_HOST_VIA82C505
|
||||
depends on PCI && ARCH_SHARK
|
||||
default y
|
||||
|
||||
config PCI_HOST_ITE8152
|
||||
bool
|
||||
depends on PCI && MACH_ARMCORE
|
||||
default y
|
||||
select DMABOUNCE
|
||||
|
||||
source "drivers/pci/Kconfig"
|
||||
|
||||
source "drivers/pcmcia/Kconfig"
|
||||
|
@ -31,7 +31,7 @@
|
||||
.macro loadsp, rb
|
||||
.endm
|
||||
.macro writeb, ch, rb
|
||||
mcr p14, 0, \ch, c0, c1, 0
|
||||
mcr p14, 0, \ch, c1, c0, 0
|
||||
.endm
|
||||
#endif
|
||||
|
||||
|
@ -70,8 +70,6 @@ static inline void it8152_irq(int irq)
|
||||
{
|
||||
struct irq_desc *desc;
|
||||
|
||||
printk(KERN_DEBUG "===> %s: irq=%d\n", __FUNCTION__, irq);
|
||||
|
||||
desc = irq_desc + irq;
|
||||
desc_handle_irq(irq, desc);
|
||||
}
|
||||
@ -106,8 +104,6 @@ void it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
|
||||
int bits_pd, bits_lp, bits_ld;
|
||||
int i;
|
||||
|
||||
printk(KERN_DEBUG "=> %s: irq = %d\n", __FUNCTION__, irq);
|
||||
|
||||
while (1) {
|
||||
/* Read all */
|
||||
bits_pd = __raw_readl(IT8152_INTC_PDCNIRR);
|
||||
@ -293,8 +289,7 @@ int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size)
|
||||
*/
|
||||
int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
|
||||
{
|
||||
printk(KERN_DEBUG "%s: %s %llx\n",
|
||||
__FUNCTION__, dev->dev.bus_id, mask);
|
||||
dev_dbg(&dev->dev, "%s: %llx\n", __FUNCTION__, mask);
|
||||
if (mask >= PHYS_OFFSET + SZ_64M - 1)
|
||||
return 0;
|
||||
|
||||
@ -304,8 +299,7 @@ int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
|
||||
int
|
||||
pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
|
||||
{
|
||||
printk(KERN_DEBUG "%s: %s %llx\n",
|
||||
__FUNCTION__, dev->dev.bus_id, mask);
|
||||
dev_dbg(&dev->dev, "%s: %llx\n", __FUNCTION__, mask);
|
||||
if (mask >= PHYS_OFFSET + SZ_64M - 1)
|
||||
return 0;
|
||||
|
||||
|
@ -442,7 +442,8 @@ static int ixp4xx_set_next_event(unsigned long evt,
|
||||
static void ixp4xx_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
unsigned long opts, osrt = *IXP4XX_OSRT1 & ~IXP4XX_OST_RELOAD_MASK;
|
||||
unsigned long opts = *IXP4XX_OSRT1 & IXP4XX_OST_RELOAD_MASK;
|
||||
unsigned long osrt = *IXP4XX_OSRT1 & ~IXP4XX_OST_RELOAD_MASK;
|
||||
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
@ -455,12 +456,15 @@ static void ixp4xx_set_mode(enum clock_event_mode mode,
|
||||
opts = IXP4XX_OST_ENABLE | IXP4XX_OST_ONE_SHOT;
|
||||
break;
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
opts &= ~IXP4XX_OST_ENABLE;
|
||||
break;
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
opts |= IXP4XX_OST_ENABLE;
|
||||
break;
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
default:
|
||||
osrt = opts = 0;
|
||||
break;
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
break;
|
||||
}
|
||||
|
||||
*IXP4XX_OSRT1 = osrt | opts;
|
||||
|
@ -40,7 +40,7 @@ void __init cmx270_pci_adjust_zones(int node, unsigned long *zone_size,
|
||||
{
|
||||
unsigned int sz = SZ_64M >> PAGE_SHIFT;
|
||||
|
||||
printk(KERN_INFO "Adjusting zones for CM-x270\n");
|
||||
pr_info("Adjusting zones for CM-x270\n");
|
||||
|
||||
/*
|
||||
* Only adjust if > 64M on current system
|
||||
@ -104,8 +104,7 @@ static int __init cmx270_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int irq;
|
||||
|
||||
printk(KERN_DEBUG "===> %s: %s slot=%x, pin=%x\n", __FUNCTION__,
|
||||
pci_name(dev), slot, pin);
|
||||
dev_dbg(&dev->dev, "%s: slot=%x, pin=%x\n", __FUNCTION__, slot, pin);
|
||||
|
||||
irq = it8152_pci_map_irq(dev, slot, pin);
|
||||
if (irq)
|
||||
@ -141,14 +140,13 @@ static int __init cmx270_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
return(0);
|
||||
}
|
||||
|
||||
static struct pci_bus * __init
|
||||
cmx270_pci_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
static void cmx270_pci_preinit(void)
|
||||
{
|
||||
printk(KERN_INFO "Initializing CM-X270 PCI subsystem\n");
|
||||
pr_info("Initializing CM-X270 PCI subsystem\n");
|
||||
|
||||
__raw_writel(0x800, IT8152_PCI_CFG_ADDR);
|
||||
if (__raw_readl(IT8152_PCI_CFG_DATA) == 0x81521283) {
|
||||
printk(KERN_INFO "PCI Bridge found.\n");
|
||||
pr_info("PCI Bridge found.\n");
|
||||
|
||||
/* set PCI I/O base at 0 */
|
||||
writel(0x848, IT8152_PCI_CFG_ADDR);
|
||||
@ -163,7 +161,7 @@ cmx270_pci_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
/* CardBus Controller on ATXbase baseboard */
|
||||
writel(0x4000, IT8152_PCI_CFG_ADDR);
|
||||
if (readl(IT8152_PCI_CFG_DATA) == 0xAC51104C) {
|
||||
printk(KERN_INFO "CardBus Bridge found.\n");
|
||||
pr_info("CardBus Bridge found.\n");
|
||||
|
||||
/* Configure socket 0 */
|
||||
writel(0x408C, IT8152_PCI_CFG_ADDR);
|
||||
@ -196,7 +194,6 @@ cmx270_pci_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
writel(0xb0000000, IT8152_PCI_CFG_DATA);
|
||||
}
|
||||
}
|
||||
return it8152_pci_scan_bus(nr, sys);
|
||||
}
|
||||
|
||||
static struct hw_pci cmx270_pci __initdata = {
|
||||
@ -204,7 +201,8 @@ static struct hw_pci cmx270_pci __initdata = {
|
||||
.map_irq = cmx270_pci_map_irq,
|
||||
.nr_controllers = 1,
|
||||
.setup = it8152_pci_setup,
|
||||
.scan = cmx270_pci_scan_bus,
|
||||
.scan = it8152_pci_scan_bus,
|
||||
.preinit = cmx270_pci_preinit,
|
||||
};
|
||||
|
||||
static int __init cmx270_init_pci(void)
|
||||
|
@ -2034,7 +2034,8 @@ sba_init(void)
|
||||
if (!ia64_platform_is("hpzx1") && !ia64_platform_is("hpzx1_swiotlb"))
|
||||
return 0;
|
||||
|
||||
#if defined(CONFIG_IA64_GENERIC) && defined(CONFIG_CRASH_DUMP)
|
||||
#if defined(CONFIG_IA64_GENERIC) && defined(CONFIG_CRASH_DUMP) && \
|
||||
defined(CONFIG_PROC_FS)
|
||||
/* If we are booting a kdump kernel, the sba_iommu will
|
||||
* cause devices that were not shutdown properly to MCA
|
||||
* as soon as they are turned back on. Our only option for
|
||||
|
@ -52,33 +52,29 @@ extern struct page *ia32_shared_page[];
|
||||
extern unsigned long *ia32_gdt;
|
||||
extern struct page *ia32_gate_page;
|
||||
|
||||
struct page *
|
||||
ia32_install_shared_page (struct vm_area_struct *vma, unsigned long address, int *type)
|
||||
int
|
||||
ia32_install_shared_page (struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
{
|
||||
struct page *pg = ia32_shared_page[smp_processor_id()];
|
||||
get_page(pg);
|
||||
if (type)
|
||||
*type = VM_FAULT_MINOR;
|
||||
return pg;
|
||||
vmf->page = ia32_shared_page[smp_processor_id()];
|
||||
get_page(vmf->page);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct page *
|
||||
ia32_install_gate_page (struct vm_area_struct *vma, unsigned long address, int *type)
|
||||
int
|
||||
ia32_install_gate_page (struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
{
|
||||
struct page *pg = ia32_gate_page;
|
||||
get_page(pg);
|
||||
if (type)
|
||||
*type = VM_FAULT_MINOR;
|
||||
return pg;
|
||||
vmf->page = ia32_gate_page;
|
||||
get_page(vmf->page);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static struct vm_operations_struct ia32_shared_page_vm_ops = {
|
||||
.nopage = ia32_install_shared_page
|
||||
.fault = ia32_install_shared_page
|
||||
};
|
||||
|
||||
static struct vm_operations_struct ia32_gate_page_vm_ops = {
|
||||
.nopage = ia32_install_gate_page
|
||||
.fault = ia32_install_gate_page
|
||||
};
|
||||
|
||||
void
|
||||
|
@ -1176,6 +1176,7 @@ tlb_purge_done:
|
||||
RESTORE_REG(cr.dcr, r25, r17);;
|
||||
RESTORE_REG(cr.iva, r25, r17);;
|
||||
RESTORE_REG(cr.pta, r25, r17);;
|
||||
srlz.d;; // required not to violate RAW dependency
|
||||
RESTORE_REG(cr.itv, r25, r17);;
|
||||
RESTORE_REG(cr.pmv, r25, r17);;
|
||||
RESTORE_REG(cr.cmcv, r25, r17);;
|
||||
|
@ -200,7 +200,7 @@ assign_irq_vector (int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
int vector, cpu;
|
||||
cpumask_t domain;
|
||||
cpumask_t domain = CPU_MASK_NONE;
|
||||
|
||||
vector = -ENOSPC;
|
||||
|
||||
@ -340,7 +340,7 @@ int create_irq(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
int irq, vector, cpu;
|
||||
cpumask_t domain;
|
||||
cpumask_t domain = CPU_MASK_NONE;
|
||||
|
||||
irq = vector = -ENOSPC;
|
||||
spin_lock_irqsave(&vector_lock, flags);
|
||||
|
@ -75,6 +75,7 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include <asm/delay.h>
|
||||
#include <asm/machvec.h>
|
||||
@ -1813,6 +1814,36 @@ ia64_mca_cpu_init(void *cpu_data)
|
||||
PAGE_KERNEL));
|
||||
}
|
||||
|
||||
static void __cpuinit ia64_mca_cmc_vector_adjust(void *dummy)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
if (!cmc_polling_enabled)
|
||||
ia64_mca_cmc_vector_enable(NULL);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static int __cpuinit mca_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action,
|
||||
void *hcpu)
|
||||
{
|
||||
int hotcpu = (unsigned long) hcpu;
|
||||
|
||||
switch (action) {
|
||||
case CPU_ONLINE:
|
||||
case CPU_ONLINE_FROZEN:
|
||||
smp_call_function_single(hotcpu, ia64_mca_cmc_vector_adjust,
|
||||
NULL, 1, 0);
|
||||
break;
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block mca_cpu_notifier __cpuinitdata = {
|
||||
.notifier_call = mca_cpu_callback
|
||||
};
|
||||
|
||||
/*
|
||||
* ia64_mca_init
|
||||
*
|
||||
@ -1996,6 +2027,8 @@ ia64_mca_late_init(void)
|
||||
if (!mca_init)
|
||||
return 0;
|
||||
|
||||
register_hotcpu_notifier(&mca_cpu_notifier);
|
||||
|
||||
/* Setup the CMCI/P vector and handler */
|
||||
init_timer(&cmc_poll_timer);
|
||||
cmc_poll_timer.function = ia64_mca_cmc_poll;
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/utsname.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/delay.h>
|
||||
@ -107,8 +108,9 @@ show_regs (struct pt_regs *regs)
|
||||
print_modules();
|
||||
printk("\nPid: %d, CPU %d, comm: %20s\n", task_pid_nr(current),
|
||||
smp_processor_id(), current->comm);
|
||||
printk("psr : %016lx ifs : %016lx ip : [<%016lx>] %s\n",
|
||||
regs->cr_ipsr, regs->cr_ifs, ip, print_tainted());
|
||||
printk("psr : %016lx ifs : %016lx ip : [<%016lx>] %s (%s)\n",
|
||||
regs->cr_ipsr, regs->cr_ifs, ip, print_tainted(),
|
||||
init_utsname()->release);
|
||||
print_symbol("ip is at %s\n", ip);
|
||||
printk("unat: %016lx pfs : %016lx rsc : %016lx\n",
|
||||
regs->ar_unat, regs->ar_pfs, regs->ar_rsc);
|
||||
@ -737,6 +739,7 @@ flush_thread (void)
|
||||
ia32_drop_ia64_partial_page_list(current);
|
||||
current->thread.task_size = IA32_PAGE_OFFSET;
|
||||
set_fs(USER_DS);
|
||||
memset(current->thread.tls_array, 0, sizeof(current->thread.tls_array));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -280,15 +280,7 @@ setup_sigcontext (struct sigcontext __user *sc, sigset_t *mask, struct sigscratc
|
||||
err |= __copy_to_user(&sc->sc_gr[15], &scr->pt.r15, 8); /* r15 */
|
||||
err |= __put_user(scr->pt.cr_iip + ia64_psr(&scr->pt)->ri, &sc->sc_ip);
|
||||
|
||||
if (flags & IA64_SC_FLAG_IN_SYSCALL) {
|
||||
/* Clear scratch registers if the signal interrupted a system call. */
|
||||
err |= __put_user(0, &sc->sc_ar_ccv); /* ar.ccv */
|
||||
err |= __put_user(0, &sc->sc_br[7]); /* b7 */
|
||||
err |= __put_user(0, &sc->sc_gr[14]); /* r14 */
|
||||
err |= __clear_user(&sc->sc_ar25, 2*8); /* ar.csd & ar.ssd */
|
||||
err |= __clear_user(&sc->sc_gr[2], 2*8); /* r2-r3 */
|
||||
err |= __clear_user(&sc->sc_gr[16], 16*8); /* r16-r31 */
|
||||
} else {
|
||||
if (!(flags & IA64_SC_FLAG_IN_SYSCALL)) {
|
||||
/* Copy scratch regs to sigcontext if the signal didn't interrupt a syscall. */
|
||||
err |= __put_user(scr->pt.ar_ccv, &sc->sc_ar_ccv); /* ar.ccv */
|
||||
err |= __put_user(scr->pt.b7, &sc->sc_br[7]); /* b7 */
|
||||
|
@ -118,7 +118,7 @@ static int uncached_add_chunk(struct uncached_pool *uc_pool, int nid)
|
||||
for (i = 0; i < (IA64_GRANULE_SIZE / PAGE_SIZE); i++)
|
||||
SetPageUncached(&page[i]);
|
||||
|
||||
flush_tlb_kernel_range(uc_addr, uc_adddr + IA64_GRANULE_SIZE);
|
||||
flush_tlb_kernel_range(uc_addr, uc_addr + IA64_GRANULE_SIZE);
|
||||
|
||||
status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL);
|
||||
if (status == PAL_VISIBILITY_OK_REMOTE_NEEDED) {
|
||||
|
@ -10,6 +10,7 @@
|
||||
* IPI based ptc implementation and A-step IPI implementation.
|
||||
* Rohit Seth <rohit.seth@intel.com>
|
||||
* Ken Chen <kenneth.w.chen@intel.com>
|
||||
* Christophe de Dinechin <ddd@hp.com>: Avoid ptc.e on memory allocation
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
@ -89,9 +90,16 @@ ia64_global_tlb_purge (struct mm_struct *mm, unsigned long start,
|
||||
{
|
||||
static DEFINE_SPINLOCK(ptcg_lock);
|
||||
|
||||
if (mm != current->active_mm || !current->mm) {
|
||||
flush_tlb_all();
|
||||
return;
|
||||
struct mm_struct *active_mm = current->active_mm;
|
||||
|
||||
if (mm != active_mm) {
|
||||
/* Restore region IDs for mm */
|
||||
if (mm && active_mm) {
|
||||
activate_context(mm);
|
||||
} else {
|
||||
flush_tlb_all();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* HW requires global serialization of ptc.ga. */
|
||||
@ -107,6 +115,10 @@ ia64_global_tlb_purge (struct mm_struct *mm, unsigned long start,
|
||||
} while (start < end);
|
||||
}
|
||||
spin_unlock(&ptcg_lock);
|
||||
|
||||
if (mm != active_mm) {
|
||||
activate_context(active_mm);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -3,7 +3,7 @@
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (c) 2000-2006 Silicon Graphics, Inc. All Rights Reserved.
|
||||
* Copyright (c) 2000-2007 Silicon Graphics, Inc. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -227,7 +227,7 @@ retry_bteop:
|
||||
BTE_LNSTAT_LOAD(bte), *bte->most_rcnt_na));
|
||||
|
||||
if (transfer_stat & IBLS_ERROR) {
|
||||
bte_status = transfer_stat & ~IBLS_ERROR;
|
||||
bte_status = BTE_GET_ERROR_STATUS(transfer_stat);
|
||||
} else {
|
||||
bte_status = BTE_SUCCESS;
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved.
|
||||
* Copyright (c) 2000-2007 Silicon Graphics, Inc. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
@ -148,7 +148,11 @@ int shub2_bte_error_handler(unsigned long _nodepda)
|
||||
for (i = 0; i < BTES_PER_NODE; i++) {
|
||||
bte = &err_nodepda->bte_if[i];
|
||||
status = BTE_LNSTAT_LOAD(bte);
|
||||
if ((status & IBLS_ERROR) || !(status & IBLS_BUSY))
|
||||
if (status & IBLS_ERROR) {
|
||||
bte->bh_error = BTE_SHUB2_ERROR(status);
|
||||
continue;
|
||||
}
|
||||
if (!(status & IBLS_BUSY))
|
||||
continue;
|
||||
mod_timer(recovery_timer, jiffies + (HZ * 5));
|
||||
BTE_PRINTK(("eh:%p:%d Marked Giving up\n", err_nodepda,
|
||||
|
@ -41,7 +41,7 @@
|
||||
* } else
|
||||
* do desired mmr access
|
||||
*
|
||||
* According to hw, we can use reads instead of writes to the above addres
|
||||
* According to hw, we can use reads instead of writes to the above address
|
||||
*
|
||||
* Note this WAR can only to be used for accessing internal MMR's in the
|
||||
* TIOCE Coretalk Address Range 0x0 - 0x07ff_ffff. This includes the
|
||||
|
@ -7,7 +7,6 @@ config MIPS_MTX1
|
||||
bool "4G Systems MTX-1 board"
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SOC_AU1500
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
@ -22,7 +21,6 @@ config MIPS_DB1000
|
||||
select SOC_AU1000
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config MIPS_DB1100
|
||||
@ -44,7 +42,6 @@ config MIPS_DB1500
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_SUPPORTS_BIG_ENDIAN
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
@ -54,7 +51,6 @@ config MIPS_DB1550
|
||||
select HW_HAS_PCI
|
||||
select DMA_NONCOHERENT
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config MIPS_MIRAGE
|
||||
@ -68,7 +64,6 @@ config MIPS_PB1000
|
||||
select SOC_AU1000
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SWAP_IO_SPACE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
@ -77,7 +72,6 @@ config MIPS_PB1100
|
||||
select SOC_AU1100
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SWAP_IO_SPACE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
@ -86,7 +80,6 @@ config MIPS_PB1200
|
||||
select SOC_AU1200
|
||||
select DMA_NONCOHERENT
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config MIPS_PB1500
|
||||
@ -94,7 +87,6 @@ config MIPS_PB1500
|
||||
select SOC_AU1500
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config MIPS_PB1550
|
||||
@ -103,7 +95,6 @@ config MIPS_PB1550
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select RESOURCES_64BIT if PCI
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config MIPS_XXS1500
|
||||
|
@ -39,15 +39,15 @@
|
||||
|
||||
/* TBD */
|
||||
static struct resource pci_io_resource = {
|
||||
.start = (resource_size_t)PCI_IO_START,
|
||||
.end = (resource_size_t)PCI_IO_END,
|
||||
.start = PCI_IO_START,
|
||||
.end = PCI_IO_END,
|
||||
.name = "PCI IO space",
|
||||
.flags = IORESOURCE_IO
|
||||
};
|
||||
|
||||
static struct resource pci_mem_resource = {
|
||||
.start = (resource_size_t)PCI_MEM_START,
|
||||
.end = (resource_size_t)PCI_MEM_END,
|
||||
.start = PCI_MEM_START,
|
||||
.end = PCI_MEM_END,
|
||||
.name = "PCI memory space",
|
||||
.flags = IORESOURCE_MEM
|
||||
};
|
||||
|
@ -137,12 +137,11 @@ phys_t __fixup_bigphys_addr(phys_t phys_addr, phys_t size)
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
{
|
||||
u32 start, end;
|
||||
u32 start = (u32)Au1500_PCI_MEM_START;
|
||||
u32 end = (u32)Au1500_PCI_MEM_END;
|
||||
|
||||
start = (u32)Au1500_PCI_MEM_START;
|
||||
end = (u32)Au1500_PCI_MEM_END;
|
||||
/* check for pci memory window */
|
||||
if ((phys_addr >= start) && ((phys_addr + size) < end))
|
||||
/* Check for PCI memory window */
|
||||
if (phys_addr >= start && (phys_addr + size - 1) <= end)
|
||||
return (phys_t)
|
||||
((phys_addr - start) + Au1500_PCI_MEM_START);
|
||||
}
|
||||
|
@ -27,9 +27,28 @@
|
||||
|
||||
void __init plat_time_init(void)
|
||||
{
|
||||
u32 start, end;
|
||||
int i = HZ / 10;
|
||||
|
||||
setup_pit_timer();
|
||||
|
||||
gt641xx_set_base_clock(GT641XX_BASE_CLOCK);
|
||||
|
||||
mips_timer_state = gt641xx_timer0_state;
|
||||
/*
|
||||
* MIPS counter frequency is measured during a 100msec interval
|
||||
* using GT64111 timer0.
|
||||
*/
|
||||
while (!gt641xx_timer0_state())
|
||||
;
|
||||
|
||||
start = read_c0_count();
|
||||
|
||||
while (i--)
|
||||
while (!gt641xx_timer0_state())
|
||||
;
|
||||
|
||||
end = read_c0_count();
|
||||
|
||||
mips_hpt_frequency = (end - start) * 10;
|
||||
printk(KERN_INFO "MIPS counter frequency %dHz\n", mips_hpt_frequency);
|
||||
}
|
||||
|
@ -76,9 +76,13 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||
# CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ is not set
|
||||
CONFIG_CEVT_BCM1480=y
|
||||
CONFIG_CSRC_BCM1480=y
|
||||
CONFIG_DMA_COHERENT=y
|
||||
CONFIG_CPU_BIG_ENDIAN=y
|
||||
# CONFIG_CPU_LITTLE_ENDIAN is not set
|
||||
@ -91,6 +95,11 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5
|
||||
#
|
||||
# CPU selection
|
||||
#
|
||||
CONFIG_TICK_ONESHOT=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
# CONFIG_CPU_LOONGSON2 is not set
|
||||
# CONFIG_CPU_MIPS32_R1 is not set
|
||||
# CONFIG_CPU_MIPS32_R2 is not set
|
||||
# CONFIG_CPU_MIPS64_R1 is not set
|
||||
|
@ -49,10 +49,13 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||
# CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ is not set
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_CEVT_R4K=y
|
||||
CONFIG_DMA_NONCOHERENT=y
|
||||
CONFIG_DMA_NEED_PCI_MAP_STATE=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
@ -76,6 +79,10 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5
|
||||
#
|
||||
# CPU selection
|
||||
#
|
||||
CONFIG_TICK_ONESHOT=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
# CONFIG_CPU_LOONGSON2 is not set
|
||||
# CONFIG_CPU_MIPS32_R1 is not set
|
||||
CONFIG_CPU_MIPS32_R2=y
|
||||
@ -253,6 +260,7 @@ CONFIG_HW_HAS_PCI=y
|
||||
CONFIG_PCI=y
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
CONFIG_MMU=y
|
||||
CONFIG_I8253=y
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
|
@ -77,9 +77,8 @@ void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp)
|
||||
unsigned long status;
|
||||
|
||||
/* New thread loses kernel privileges. */
|
||||
status = regs->cp0_status & ~(ST0_CU0|ST0_CU1|KU_MASK);
|
||||
status = regs->cp0_status & ~(ST0_CU0|ST0_CU1|ST0_FR|KU_MASK);
|
||||
#ifdef CONFIG_64BIT
|
||||
status &= ~ST0_FR;
|
||||
status |= test_thread_flag(TIF_32BIT_REGS) ? 0 : ST0_FR;
|
||||
#endif
|
||||
status |= KU_USER;
|
||||
|
@ -109,10 +109,6 @@ void __cpuinit clockevent_set_clock(struct clock_event_device *cd,
|
||||
cd->mult = (u32) temp;
|
||||
}
|
||||
|
||||
void __init __weak plat_time_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* This function exists in order to cause an error due to a duplicate
|
||||
* definition if platform code should have its own implementation. The hook
|
||||
|
@ -1317,12 +1317,12 @@ void __init per_cpu_trap_init(void)
|
||||
#endif
|
||||
if (current_cpu_data.isa_level == MIPS_CPU_ISA_IV)
|
||||
status_set |= ST0_XX;
|
||||
if (cpu_has_dsp)
|
||||
status_set |= ST0_MX;
|
||||
|
||||
change_c0_status(ST0_CU|ST0_MX|ST0_RE|ST0_FR|ST0_BEV|ST0_TS|ST0_KX|ST0_SX|ST0_UX,
|
||||
status_set);
|
||||
|
||||
if (cpu_has_dsp)
|
||||
set_c0_status(ST0_MX);
|
||||
|
||||
#ifdef CONFIG_CPU_MIPSR2
|
||||
if (cpu_has_mips_r2) {
|
||||
unsigned int enable = 0x0000000f;
|
||||
|
@ -37,9 +37,9 @@ void mips_display_message(const char *str)
|
||||
|
||||
for (i = 0; i <= 14; i=i+2) {
|
||||
if (*str)
|
||||
writel(*str++, display + i);
|
||||
__raw_writel(*str++, display + i);
|
||||
else
|
||||
writel(' ', display + i);
|
||||
__raw_writel(' ', display + i);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -169,6 +169,7 @@ void __init prom_meminit(void)
|
||||
|
||||
void __init prom_free_prom_memory(void)
|
||||
{
|
||||
#if 0 /* for now ... */
|
||||
unsigned long addr;
|
||||
int i;
|
||||
|
||||
@ -180,4 +181,5 @@ void __init prom_free_prom_memory(void)
|
||||
free_init_pages("prom memory",
|
||||
addr, addr + boot_mem_map.map[i].size);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -242,6 +242,8 @@ static void pcibios_fixup_device_resources(struct pci_dev *dev,
|
||||
for (i = 0; i < PCI_NUM_RESOURCES; i++) {
|
||||
if (!dev->resource[i].start)
|
||||
continue;
|
||||
if (dev->resource[i].flags & IORESOURCE_PCI_FIXED)
|
||||
continue;
|
||||
if (dev->resource[i].flags & IORESOURCE_IO)
|
||||
offset = hose->io_offset;
|
||||
else if (dev->resource[i].flags & IORESOURCE_MEM)
|
||||
|
@ -33,5 +33,5 @@ void __init arch_init_irq(void)
|
||||
|
||||
mips_cpu_irq_init();
|
||||
init_i8259_irqs();
|
||||
set_c0_status(0x8400);
|
||||
set_c0_status(0x400);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.24-rc4
|
||||
# Thu Dec 6 16:48:30 2007
|
||||
# Linux kernel version: 2.6.24-rc5
|
||||
# Thu Dec 13 22:40:57 2007
|
||||
#
|
||||
# CONFIG_PPC64 is not set
|
||||
|
||||
@ -491,7 +491,7 @@ CONFIG_MII=y
|
||||
CONFIG_FS_ENET=y
|
||||
# CONFIG_FS_ENET_HAS_SCC is not set
|
||||
CONFIG_FS_ENET_HAS_FCC=y
|
||||
# CONFIG_FS_ENET_MDIO_FCC is not set
|
||||
CONFIG_FS_ENET_MDIO_FCC=y
|
||||
CONFIG_NETDEV_1000=y
|
||||
# CONFIG_ACENIC is not set
|
||||
# CONFIG_DL2K is not set
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.24-rc4
|
||||
# Thu Dec 6 16:49:09 2007
|
||||
# Linux kernel version: 2.6.24-rc5
|
||||
# Thu Dec 13 22:39:18 2007
|
||||
#
|
||||
# CONFIG_PPC64 is not set
|
||||
|
||||
@ -548,7 +548,7 @@ CONFIG_MII=y
|
||||
CONFIG_FS_ENET=y
|
||||
# CONFIG_FS_ENET_HAS_SCC is not set
|
||||
CONFIG_FS_ENET_HAS_FCC=y
|
||||
# CONFIG_FS_ENET_MDIO_FCC is not set
|
||||
CONFIG_FS_ENET_MDIO_FCC=y
|
||||
CONFIG_NETDEV_1000=y
|
||||
# CONFIG_ACENIC is not set
|
||||
# CONFIG_DL2K is not set
|
||||
|
@ -157,7 +157,7 @@ CONFIG_PS3_HTAB_SIZE=20
|
||||
CONFIG_PS3_USE_LPAR_ADDR=y
|
||||
CONFIG_PS3_VUART=y
|
||||
CONFIG_PS3_PS3AV=y
|
||||
CONFIG_PS3_SYS_MANAGER=m
|
||||
CONFIG_PS3_SYS_MANAGER=y
|
||||
CONFIG_PS3_STORAGE=y
|
||||
CONFIG_PS3_DISK=y
|
||||
CONFIG_PS3_ROM=y
|
||||
|
@ -45,10 +45,6 @@
|
||||
#include <asm/signal.h>
|
||||
#include <asm/dcr.h>
|
||||
|
||||
#ifdef CONFIG_8xx
|
||||
#include <asm/commproc.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
EXPORT_SYMBOL(local_irq_restore);
|
||||
#endif
|
||||
@ -172,14 +168,6 @@ EXPORT_SYMBOL(console_drivers);
|
||||
EXPORT_SYMBOL(cacheable_memcpy);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_8xx
|
||||
EXPORT_SYMBOL(cpm_install_handler);
|
||||
EXPORT_SYMBOL(cpm_free_handler);
|
||||
#endif /* CONFIG_8xx */
|
||||
#if defined(CONFIG_8xx)
|
||||
EXPORT_SYMBOL(__res);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC32
|
||||
EXPORT_SYMBOL(next_mmu_context);
|
||||
EXPORT_SYMBOL(set_context);
|
||||
|
@ -59,7 +59,8 @@
|
||||
else \
|
||||
{ \
|
||||
X##_f0 = (X##_f1 >> ((N) - _FP_W_TYPE_SIZE) | \
|
||||
(((X##_f1 << (sz - (N))) | X##_f0) != 0)); \
|
||||
(((X##_f1 << (2 * _FP_W_TYPE_SIZE - (N))) | \
|
||||
X##_f0) != 0)); \
|
||||
X##_f1 = 0; \
|
||||
} \
|
||||
} while (0)
|
||||
|
@ -121,6 +121,7 @@ void process_hvlpevents(void)
|
||||
{
|
||||
struct HvLpEvent * event;
|
||||
|
||||
restart:
|
||||
/* If we have recursed, just return */
|
||||
if (!spin_trylock(&hvlpevent_queue.hq_lock))
|
||||
return;
|
||||
@ -146,8 +147,20 @@ void process_hvlpevents(void)
|
||||
if (event->xType < HvLpEvent_Type_NumTypes &&
|
||||
lpEventHandler[event->xType])
|
||||
lpEventHandler[event->xType](event);
|
||||
else
|
||||
printk(KERN_INFO "Unexpected Lp Event type=%d\n", event->xType );
|
||||
else {
|
||||
u8 type = event->xType;
|
||||
|
||||
/*
|
||||
* Don't printk in the spinlock as printk
|
||||
* may require ack events form the HV to send
|
||||
* any characters there.
|
||||
*/
|
||||
hvlpevent_clear_valid(event);
|
||||
spin_unlock(&hvlpevent_queue.hq_lock);
|
||||
printk(KERN_INFO
|
||||
"Unexpected Lp Event type=%d\n", type);
|
||||
goto restart;
|
||||
}
|
||||
|
||||
hvlpevent_clear_valid(event);
|
||||
} else if (hvlpevent_queue.hq_overflow_pending)
|
||||
|
@ -91,7 +91,7 @@ config PS3_SYS_MANAGER
|
||||
depends on PPC_PS3
|
||||
tristate "PS3 System Manager driver" if PS3_ADVANCED
|
||||
select PS3_VUART
|
||||
default m
|
||||
default y
|
||||
help
|
||||
Include support for the PS3 System Manager.
|
||||
|
||||
|
@ -61,8 +61,7 @@ cpm2_map_t __iomem *cpm2_immr;
|
||||
of space for CPM as it is larger
|
||||
than on PQ2 */
|
||||
|
||||
void
|
||||
cpm2_reset(void)
|
||||
void __init cpm2_reset(void)
|
||||
{
|
||||
#ifdef CONFIG_PPC_85xx
|
||||
cpm2_immr = ioremap(CPM_MAP_ADDR, CPM_MAP_SIZE);
|
||||
|
@ -2593,3 +2593,15 @@ sun4v_mmustat_info:
|
||||
retl
|
||||
nop
|
||||
.size sun4v_mmustat_info, .-sun4v_mmustat_info
|
||||
|
||||
.globl sun4v_mmu_demap_all
|
||||
.type sun4v_mmu_demap_all,#function
|
||||
sun4v_mmu_demap_all:
|
||||
clr %o0
|
||||
clr %o1
|
||||
mov HV_MMU_ALL, %o2
|
||||
mov HV_FAST_MMU_DEMAP_ALL, %o5
|
||||
ta HV_FAST_TRAP
|
||||
retl
|
||||
nop
|
||||
.size sun4v_mmu_demap_all, .-sun4v_mmu_demap_all
|
||||
|
@ -476,7 +476,7 @@ static inline void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, cpuma
|
||||
*/
|
||||
static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask)
|
||||
{
|
||||
u64 pstate, ver;
|
||||
u64 pstate, ver, busy_mask;
|
||||
int nack_busy_id, is_jbus, need_more;
|
||||
|
||||
if (cpus_empty(mask))
|
||||
@ -508,14 +508,20 @@ retry:
|
||||
"i" (ASI_INTR_W));
|
||||
|
||||
nack_busy_id = 0;
|
||||
busy_mask = 0;
|
||||
{
|
||||
int i;
|
||||
|
||||
for_each_cpu_mask(i, mask) {
|
||||
u64 target = (i << 14) | 0x70;
|
||||
|
||||
if (!is_jbus)
|
||||
if (is_jbus) {
|
||||
busy_mask |= (0x1UL << (i * 2));
|
||||
} else {
|
||||
target |= (nack_busy_id << 24);
|
||||
busy_mask |= (0x1UL <<
|
||||
(nack_busy_id * 2));
|
||||
}
|
||||
__asm__ __volatile__(
|
||||
"stxa %%g0, [%0] %1\n\t"
|
||||
"membar #Sync\n\t"
|
||||
@ -531,15 +537,16 @@ retry:
|
||||
|
||||
/* Now, poll for completion. */
|
||||
{
|
||||
u64 dispatch_stat;
|
||||
u64 dispatch_stat, nack_mask;
|
||||
long stuck;
|
||||
|
||||
stuck = 100000 * nack_busy_id;
|
||||
nack_mask = busy_mask << 1;
|
||||
do {
|
||||
__asm__ __volatile__("ldxa [%%g0] %1, %0"
|
||||
: "=r" (dispatch_stat)
|
||||
: "i" (ASI_INTR_DISPATCH_STAT));
|
||||
if (dispatch_stat == 0UL) {
|
||||
if (!(dispatch_stat & (busy_mask | nack_mask))) {
|
||||
__asm__ __volatile__("wrpr %0, 0x0, %%pstate"
|
||||
: : "r" (pstate));
|
||||
if (unlikely(need_more)) {
|
||||
@ -556,12 +563,12 @@ retry:
|
||||
}
|
||||
if (!--stuck)
|
||||
break;
|
||||
} while (dispatch_stat & 0x5555555555555555UL);
|
||||
} while (dispatch_stat & busy_mask);
|
||||
|
||||
__asm__ __volatile__("wrpr %0, 0x0, %%pstate"
|
||||
: : "r" (pstate));
|
||||
|
||||
if ((dispatch_stat & ~(0x5555555555555555UL)) == 0) {
|
||||
if (dispatch_stat & busy_mask) {
|
||||
/* Busy bits will not clear, continue instead
|
||||
* of freezing up on this cpu.
|
||||
*/
|
||||
|
@ -1133,14 +1133,9 @@ static void __init mark_kpte_bitmap(unsigned long start, unsigned long end)
|
||||
}
|
||||
}
|
||||
|
||||
static void __init kernel_physical_mapping_init(void)
|
||||
static void __init init_kpte_bitmap(void)
|
||||
{
|
||||
unsigned long i;
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
unsigned long mem_alloced = 0UL;
|
||||
#endif
|
||||
|
||||
read_obp_memory("reg", &pall[0], &pall_ents);
|
||||
|
||||
for (i = 0; i < pall_ents; i++) {
|
||||
unsigned long phys_start, phys_end;
|
||||
@ -1149,14 +1144,24 @@ static void __init kernel_physical_mapping_init(void)
|
||||
phys_end = phys_start + pall[i].reg_size;
|
||||
|
||||
mark_kpte_bitmap(phys_start, phys_end);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init kernel_physical_mapping_init(void)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
unsigned long i, mem_alloced = 0UL;
|
||||
|
||||
for (i = 0; i < pall_ents; i++) {
|
||||
unsigned long phys_start, phys_end;
|
||||
|
||||
phys_start = pall[i].phys_addr;
|
||||
phys_end = phys_start + pall[i].reg_size;
|
||||
|
||||
mem_alloced += kernel_map_range(phys_start, phys_end,
|
||||
PAGE_KERNEL);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
printk("Allocated %ld bytes for kernel page tables.\n",
|
||||
mem_alloced);
|
||||
|
||||
@ -1398,6 +1403,10 @@ void __init paging_init(void)
|
||||
|
||||
inherit_prom_mappings();
|
||||
|
||||
read_obp_memory("reg", &pall[0], &pall_ents);
|
||||
|
||||
init_kpte_bitmap();
|
||||
|
||||
/* Ok, we can use our TLB miss and window trap handlers safely. */
|
||||
setup_tba();
|
||||
|
||||
@ -1904,7 +1913,9 @@ void __flush_tlb_all(void)
|
||||
"wrpr %0, %1, %%pstate"
|
||||
: "=r" (pstate)
|
||||
: "i" (PSTATE_IE));
|
||||
if (tlb_type == spitfire) {
|
||||
if (tlb_type == hypervisor) {
|
||||
sun4v_mmu_demap_all();
|
||||
} else if (tlb_type == spitfire) {
|
||||
for (i = 0; i < 64; i++) {
|
||||
/* Spitfire Errata #32 workaround */
|
||||
/* NOTE: Always runs on spitfire, so no
|
||||
|
@ -98,10 +98,10 @@ static int uml_net_rx(struct net_device *dev)
|
||||
if (pkt_len > 0) {
|
||||
skb_trim(skb, pkt_len);
|
||||
skb->protocol = (*lp->protocol)(skb);
|
||||
netif_rx(skb);
|
||||
|
||||
lp->stats.rx_bytes += skb->len;
|
||||
lp->stats.rx_packets++;
|
||||
netif_rx(skb);
|
||||
return pkt_len;
|
||||
}
|
||||
|
||||
|
@ -201,7 +201,7 @@ static int change_tramp(char **argv, char *output, int output_len)
|
||||
close(fds[1]);
|
||||
|
||||
if (pid > 0)
|
||||
CATCH_EINTR(err = waitpid(pid, NULL, 0));
|
||||
helper_wait(pid, 0, "change_tramp");
|
||||
return pid;
|
||||
}
|
||||
|
||||
|
@ -77,7 +77,7 @@ static int slip_tramp(char **argv, int fd)
|
||||
{
|
||||
struct slip_pre_exec_data pe_data;
|
||||
char *output;
|
||||
int status, pid, fds[2], err, output_len;
|
||||
int pid, fds[2], err, output_len;
|
||||
|
||||
err = os_pipe(fds, 1, 0);
|
||||
if (err < 0) {
|
||||
@ -109,15 +109,7 @@ static int slip_tramp(char **argv, int fd)
|
||||
read_output(fds[0], output, output_len);
|
||||
printk("%s", output);
|
||||
|
||||
CATCH_EINTR(err = waitpid(pid, &status, 0));
|
||||
if (err < 0)
|
||||
err = errno;
|
||||
else if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) {
|
||||
printk(UM_KERN_ERR "'%s' didn't exit with status 0\n", argv[0]);
|
||||
err = -EINVAL;
|
||||
}
|
||||
else err = 0;
|
||||
|
||||
err = helper_wait(pid, 0, argv[0]);
|
||||
close(fds[0]);
|
||||
|
||||
out_free:
|
||||
|
@ -79,7 +79,7 @@ out:
|
||||
static void slirp_close(int fd, void *data)
|
||||
{
|
||||
struct slirp_data *pri = data;
|
||||
int status,err;
|
||||
int err;
|
||||
|
||||
close(fd);
|
||||
close(pri->slave);
|
||||
@ -98,18 +98,9 @@ static void slirp_close(int fd, void *data)
|
||||
"(%d)\n", pri->pid, errno);
|
||||
}
|
||||
#endif
|
||||
|
||||
CATCH_EINTR(err = waitpid(pri->pid, &status, WNOHANG));
|
||||
if (err < 0) {
|
||||
printk(UM_KERN_ERR "slirp_close: waitpid returned %d\n", errno);
|
||||
err = helper_wait(pri->pid, 1, "slirp_close");
|
||||
if (err < 0)
|
||||
return;
|
||||
}
|
||||
|
||||
if (err == 0) {
|
||||
printk(UM_KERN_ERR "slirp_close: process %d has not exited\n",
|
||||
pri->pid);
|
||||
return;
|
||||
}
|
||||
|
||||
pri->pid = -1;
|
||||
}
|
||||
|
@ -49,8 +49,7 @@ int start_io_thread(unsigned long sp, int *fd_out)
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM | SIGCHLD,
|
||||
NULL);
|
||||
pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM, NULL);
|
||||
if(pid < 0){
|
||||
err = -errno;
|
||||
printk("start_io_thread - clone failed : errno = %d\n", errno);
|
||||
|
@ -214,7 +214,7 @@ extern int execvp_noalloc(char *buf, const char *file, char *const argv[]);
|
||||
extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv);
|
||||
extern int run_helper_thread(int (*proc)(void *), void *arg,
|
||||
unsigned int flags, unsigned long *stack_out);
|
||||
extern int helper_wait(int pid);
|
||||
extern int helper_wait(int pid, int nohang, char *pname);
|
||||
|
||||
|
||||
/* tls.c */
|
||||
|
@ -218,7 +218,7 @@ static int init_aio_24(void)
|
||||
goto out_close_pipe;
|
||||
|
||||
err = run_helper_thread(not_aio_thread, NULL,
|
||||
CLONE_FILES | CLONE_VM | SIGCHLD, &aio_stack);
|
||||
CLONE_FILES | CLONE_VM, &aio_stack);
|
||||
if (err < 0)
|
||||
goto out_close_pipe;
|
||||
|
||||
@ -254,7 +254,7 @@ static int init_aio_26(void)
|
||||
}
|
||||
|
||||
err = run_helper_thread(aio_thread, NULL,
|
||||
CLONE_FILES | CLONE_VM | SIGCHLD, &aio_stack);
|
||||
CLONE_FILES | CLONE_VM, &aio_stack);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
|
@ -94,7 +94,7 @@ static int etap_tramp(char *dev, char *gate, int control_me,
|
||||
int control_remote, int data_me, int data_remote)
|
||||
{
|
||||
struct etap_pre_exec_data pe_data;
|
||||
int pid, status, err, n;
|
||||
int pid, err, n;
|
||||
char version_buf[sizeof("nnnnn\0")];
|
||||
char data_fd_buf[sizeof("nnnnnn\0")];
|
||||
char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")];
|
||||
@ -131,13 +131,7 @@ static int etap_tramp(char *dev, char *gate, int control_me,
|
||||
}
|
||||
if (c != 1) {
|
||||
printk(UM_KERN_ERR "etap_tramp : uml_net failed\n");
|
||||
err = -EINVAL;
|
||||
CATCH_EINTR(n = waitpid(pid, &status, 0));
|
||||
if (n < 0)
|
||||
err = -errno;
|
||||
else if (!WIFEXITED(status) || (WEXITSTATUS(status) != 1))
|
||||
printk(UM_KERN_ERR "uml_net didn't exit with "
|
||||
"status 1\n");
|
||||
err = helper_wait(pid, 0, "uml_net");
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
@ -107,7 +107,7 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
|
||||
"errno = %d\n", errno);
|
||||
return err;
|
||||
}
|
||||
CATCH_EINTR(waitpid(pid, NULL, 0));
|
||||
helper_wait(pid, 0, "tuntap_open_tramp");
|
||||
|
||||
cmsg = CMSG_FIRSTHDR(&msg);
|
||||
if (cmsg == NULL) {
|
||||
|
@ -76,7 +76,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)
|
||||
data.fd = fds[1];
|
||||
data.buf = __cant_sleep() ? kmalloc(PATH_MAX, UM_GFP_ATOMIC) :
|
||||
kmalloc(PATH_MAX, UM_GFP_KERNEL);
|
||||
pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data);
|
||||
pid = clone(helper_child, (void *) sp, CLONE_VM, &data);
|
||||
if (pid < 0) {
|
||||
ret = -errno;
|
||||
printk("run_helper : clone failed, errno = %d\n", errno);
|
||||
@ -101,7 +101,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)
|
||||
ret = n;
|
||||
kill(pid, SIGKILL);
|
||||
}
|
||||
CATCH_EINTR(waitpid(pid, NULL, 0));
|
||||
CATCH_EINTR(waitpid(pid, NULL, __WCLONE));
|
||||
}
|
||||
|
||||
out_free2:
|
||||
@ -126,7 +126,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
|
||||
return -ENOMEM;
|
||||
|
||||
sp = stack + UM_KERN_PAGE_SIZE - sizeof(void *);
|
||||
pid = clone(proc, (void *) sp, flags | SIGCHLD, arg);
|
||||
pid = clone(proc, (void *) sp, flags, arg);
|
||||
if (pid < 0) {
|
||||
err = -errno;
|
||||
printk("run_helper_thread : clone failed, errno = %d\n",
|
||||
@ -134,7 +134,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
|
||||
return err;
|
||||
}
|
||||
if (stack_out == NULL) {
|
||||
CATCH_EINTR(pid = waitpid(pid, &status, 0));
|
||||
CATCH_EINTR(pid = waitpid(pid, &status, __WCLONE));
|
||||
if (pid < 0) {
|
||||
err = -errno;
|
||||
printk("run_helper_thread - wait failed, errno = %d\n",
|
||||
@ -150,14 +150,30 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
|
||||
return pid;
|
||||
}
|
||||
|
||||
int helper_wait(int pid)
|
||||
int helper_wait(int pid, int nohang, char *pname)
|
||||
{
|
||||
int ret;
|
||||
int ret, status;
|
||||
int wflags = __WCLONE;
|
||||
|
||||
CATCH_EINTR(ret = waitpid(pid, NULL, WNOHANG));
|
||||
if (nohang)
|
||||
wflags |= WNOHANG;
|
||||
|
||||
if (!pname)
|
||||
pname = "helper_wait";
|
||||
|
||||
CATCH_EINTR(ret = waitpid(pid, &status, wflags));
|
||||
if (ret < 0) {
|
||||
ret = -errno;
|
||||
printk("helper_wait : waitpid failed, errno = %d\n", errno);
|
||||
}
|
||||
return ret;
|
||||
printk(UM_KERN_ERR "%s : waitpid process %d failed, "
|
||||
"errno = %d\n", pname, pid, errno);
|
||||
return -errno;
|
||||
} else if (nohang && ret == 0) {
|
||||
printk(UM_KERN_ERR "%s : process %d has not exited\n",
|
||||
pname, pid);
|
||||
return -ECHILD;
|
||||
} else if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
|
||||
printk(UM_KERN_ERR "%s : process %d didn't exit with "
|
||||
"status 0\n", pname, pid);
|
||||
return -ECHILD;
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
|
@ -101,7 +101,7 @@ void os_kill_process(int pid, int reap_child)
|
||||
{
|
||||
kill(pid, SIGKILL);
|
||||
if (reap_child)
|
||||
CATCH_EINTR(waitpid(pid, NULL, 0));
|
||||
CATCH_EINTR(waitpid(pid, NULL, __WALL));
|
||||
}
|
||||
|
||||
/* This is here uniquely to have access to the userspace errno, i.e. the one
|
||||
@ -130,7 +130,7 @@ void os_kill_ptraced_process(int pid, int reap_child)
|
||||
ptrace(PTRACE_KILL, pid);
|
||||
ptrace(PTRACE_CONT, pid);
|
||||
if (reap_child)
|
||||
CATCH_EINTR(waitpid(pid, NULL, 0));
|
||||
CATCH_EINTR(waitpid(pid, NULL, __WALL));
|
||||
}
|
||||
|
||||
/* Don't use the glibc version, which caches the result in TLS. It misses some
|
||||
|
@ -64,7 +64,7 @@ void wait_stub_done(int pid)
|
||||
int n, status, err;
|
||||
|
||||
while (1) {
|
||||
CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
|
||||
CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED | __WALL));
|
||||
if ((n < 0) || !WIFSTOPPED(status))
|
||||
goto bad_wait;
|
||||
|
||||
@ -153,7 +153,7 @@ static void handle_trap(int pid, struct uml_pt_regs *regs,
|
||||
panic("handle_trap - continuing to end of syscall "
|
||||
"failed, errno = %d\n", errno);
|
||||
|
||||
CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED));
|
||||
CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED | __WALL));
|
||||
if ((err < 0) || !WIFSTOPPED(status) ||
|
||||
(WSTOPSIG(status) != SIGTRAP + 0x80)) {
|
||||
err = ptrace_dump_regs(pid);
|
||||
@ -255,16 +255,18 @@ int start_userspace(unsigned long stub_stack)
|
||||
panic("start_userspace : mmap failed, errno = %d", errno);
|
||||
sp = (unsigned long) stack + UM_KERN_PAGE_SIZE - sizeof(void *);
|
||||
|
||||
flags = CLONE_FILES | SIGCHLD;
|
||||
flags = CLONE_FILES;
|
||||
if (proc_mm)
|
||||
flags |= CLONE_VM;
|
||||
else
|
||||
flags |= SIGCHLD;
|
||||
|
||||
pid = clone(userspace_tramp, (void *) sp, flags, (void *) stub_stack);
|
||||
if (pid < 0)
|
||||
panic("start_userspace : clone failed, errno = %d", errno);
|
||||
|
||||
do {
|
||||
CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
|
||||
CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED | __WALL));
|
||||
if (n < 0)
|
||||
panic("start_userspace : wait failed, errno = %d",
|
||||
errno);
|
||||
@ -314,7 +316,7 @@ void userspace(struct uml_pt_regs *regs)
|
||||
"pid=%d, ptrace operation = %d, errno = %d\n",
|
||||
pid, op, errno);
|
||||
|
||||
CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED));
|
||||
CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED | __WALL));
|
||||
if (err < 0)
|
||||
panic("userspace - waitpid failed, errno = %d\n",
|
||||
errno);
|
||||
|
@ -141,7 +141,7 @@ void os_dump_core(void)
|
||||
* nothing reasonable to do if that fails.
|
||||
*/
|
||||
|
||||
while ((pid = waitpid(-1, NULL, WNOHANG)) > 0)
|
||||
while ((pid = waitpid(-1, NULL, WNOHANG | __WALL)) > 0)
|
||||
os_kill_ptraced_process(pid, 0);
|
||||
|
||||
abort();
|
||||
|
@ -849,7 +849,7 @@ void __init init_bsp_APIC(void)
|
||||
/**
|
||||
* setup_local_APIC - setup the local APIC
|
||||
*/
|
||||
void __devinit setup_local_APIC(void)
|
||||
void __cpuinit setup_local_APIC(void)
|
||||
{
|
||||
unsigned long oldvalue, value, maxlvt, integrated;
|
||||
int i, j;
|
||||
|
@ -49,6 +49,7 @@ static struct _cache_table cache_table[] __cpuinitdata =
|
||||
{ 0x3c, LVL_2, 256 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3d, LVL_2, 384 }, /* 6-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3e, LVL_2, 512 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3f, LVL_2, 256 }, /* 2-way set assoc, 64 byte line size */
|
||||
{ 0x41, LVL_2, 128 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x42, LVL_2, 256 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x43, LVL_2, 512 }, /* 4-way set assoc, 32 byte line size */
|
||||
|
@ -1882,13 +1882,16 @@ __setup("no_timer_check", notimercheck);
|
||||
static int __init timer_irq_works(void)
|
||||
{
|
||||
unsigned long t1 = jiffies;
|
||||
unsigned long flags;
|
||||
|
||||
if (no_timer_check)
|
||||
return 1;
|
||||
|
||||
local_save_flags(flags);
|
||||
local_irq_enable();
|
||||
/* Let ten ticks pass... */
|
||||
mdelay((10 * 1000) / HZ);
|
||||
local_irq_restore(flags);
|
||||
|
||||
/*
|
||||
* Expect a few ticks at least, to be sure some possible
|
||||
@ -2167,6 +2170,9 @@ static inline void __init check_timer(void)
|
||||
int apic1, pin1, apic2, pin2;
|
||||
int vector;
|
||||
unsigned int ver;
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
ver = apic_read(APIC_LVR);
|
||||
ver = GET_APIC_VERSION(ver);
|
||||
@ -2219,7 +2225,7 @@ static inline void __init check_timer(void)
|
||||
}
|
||||
if (disable_timer_pin_1 > 0)
|
||||
clear_IO_APIC_pin(0, pin1);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
clear_IO_APIC_pin(apic1, pin1);
|
||||
printk(KERN_ERR "..MP-BIOS bug: 8254 timer not connected to "
|
||||
@ -2242,7 +2248,7 @@ static inline void __init check_timer(void)
|
||||
if (nmi_watchdog == NMI_IO_APIC) {
|
||||
setup_nmi();
|
||||
}
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
* Cleanup, just in case ...
|
||||
@ -2266,7 +2272,7 @@ static inline void __init check_timer(void)
|
||||
|
||||
if (timer_irq_works()) {
|
||||
printk(" works.\n");
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector);
|
||||
printk(" failed.\n");
|
||||
@ -2282,11 +2288,13 @@ static inline void __init check_timer(void)
|
||||
|
||||
if (timer_irq_works()) {
|
||||
printk(" works.\n");
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
printk(" failed :(.\n");
|
||||
panic("IO-APIC + timer doesn't work! Boot with apic=debug and send a "
|
||||
"report. Then try booting with the 'noapic' option");
|
||||
out:
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1281,10 +1281,13 @@ void disable_IO_APIC(void)
|
||||
static int __init timer_irq_works(void)
|
||||
{
|
||||
unsigned long t1 = jiffies;
|
||||
unsigned long flags;
|
||||
|
||||
local_save_flags(flags);
|
||||
local_irq_enable();
|
||||
/* Let ten ticks pass... */
|
||||
mdelay((10 * 1000) / HZ);
|
||||
local_irq_restore(flags);
|
||||
|
||||
/*
|
||||
* Expect a few ticks at least, to be sure some possible
|
||||
@ -1655,6 +1658,9 @@ static inline void check_timer(void)
|
||||
{
|
||||
struct irq_cfg *cfg = irq_cfg + 0;
|
||||
int apic1, pin1, apic2, pin2;
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
/*
|
||||
* get/set the timer IRQ vector:
|
||||
@ -1696,7 +1702,7 @@ static inline void check_timer(void)
|
||||
}
|
||||
if (disable_timer_pin_1 > 0)
|
||||
clear_IO_APIC_pin(0, pin1);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
clear_IO_APIC_pin(apic1, pin1);
|
||||
apic_printk(APIC_QUIET,KERN_ERR "..MP-BIOS bug: 8254 timer not "
|
||||
@ -1718,7 +1724,7 @@ static inline void check_timer(void)
|
||||
if (nmi_watchdog == NMI_IO_APIC) {
|
||||
setup_nmi();
|
||||
}
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
* Cleanup, just in case ...
|
||||
@ -1741,7 +1747,7 @@ static inline void check_timer(void)
|
||||
|
||||
if (timer_irq_works()) {
|
||||
apic_printk(APIC_VERBOSE," works.\n");
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | cfg->vector);
|
||||
apic_printk(APIC_VERBOSE," failed.\n");
|
||||
@ -1756,10 +1762,12 @@ static inline void check_timer(void)
|
||||
|
||||
if (timer_irq_works()) {
|
||||
apic_printk(APIC_VERBOSE," works.\n");
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
apic_printk(APIC_VERBOSE," failed :(.\n");
|
||||
panic("IO-APIC + timer doesn't work! Try using the 'noapic' kernel parameter\n");
|
||||
out:
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static int __init notimercheck(char *s)
|
||||
|
@ -727,9 +727,7 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
|
||||
|
||||
if ((addr > (u8 *) jprobe_return) && (addr < (u8 *) jprobe_return_end)) {
|
||||
if (®s->esp != kcb->jprobe_saved_esp) {
|
||||
struct pt_regs *saved_regs =
|
||||
container_of(kcb->jprobe_saved_esp,
|
||||
struct pt_regs, esp);
|
||||
struct pt_regs *saved_regs = &kcb->jprobe_saved_regs;
|
||||
printk("current esp %p does not match saved esp %p\n",
|
||||
®s->esp, kcb->jprobe_saved_esp);
|
||||
printk("Saved registers for jprobe %p\n", jp);
|
||||
|
@ -485,7 +485,6 @@ static void __kprobes resume_execution(struct kprobe *p,
|
||||
struct pt_regs *regs, struct kprobe_ctlblk *kcb)
|
||||
{
|
||||
unsigned long *tos = (unsigned long *)regs->rsp;
|
||||
unsigned long next_rip = 0;
|
||||
unsigned long copy_rip = (unsigned long)p->ainsn.insn;
|
||||
unsigned long orig_rip = (unsigned long)p->addr;
|
||||
kprobe_opcode_t *insn = p->ainsn.insn;
|
||||
@ -494,46 +493,42 @@ static void __kprobes resume_execution(struct kprobe *p,
|
||||
if (*insn >= 0x40 && *insn <= 0x4f)
|
||||
insn++;
|
||||
|
||||
regs->eflags &= ~TF_MASK;
|
||||
switch (*insn) {
|
||||
case 0x9c: /* pushfl */
|
||||
case 0x9c: /* pushfl */
|
||||
*tos &= ~(TF_MASK | IF_MASK);
|
||||
*tos |= kcb->kprobe_old_rflags;
|
||||
break;
|
||||
case 0xc3: /* ret/lret */
|
||||
case 0xcb:
|
||||
case 0xc2:
|
||||
case 0xc2: /* iret/ret/lret */
|
||||
case 0xc3:
|
||||
case 0xca:
|
||||
regs->eflags &= ~TF_MASK;
|
||||
/* rip is already adjusted, no more changes required*/
|
||||
return;
|
||||
case 0xe8: /* call relative - Fix return addr */
|
||||
case 0xcb:
|
||||
case 0xcf:
|
||||
case 0xea: /* jmp absolute -- ip is correct */
|
||||
/* ip is already adjusted, no more changes required */
|
||||
goto no_change;
|
||||
case 0xe8: /* call relative - Fix return addr */
|
||||
*tos = orig_rip + (*tos - copy_rip);
|
||||
break;
|
||||
case 0xff:
|
||||
if ((insn[1] & 0x30) == 0x10) {
|
||||
/* call absolute, indirect */
|
||||
/* Fix return addr; rip is correct. */
|
||||
next_rip = regs->rip;
|
||||
/* Fix return addr; ip is correct. */
|
||||
*tos = orig_rip + (*tos - copy_rip);
|
||||
goto no_change;
|
||||
} else if (((insn[1] & 0x31) == 0x20) || /* jmp near, absolute indirect */
|
||||
((insn[1] & 0x31) == 0x21)) { /* jmp far, absolute indirect */
|
||||
/* rip is correct. */
|
||||
next_rip = regs->rip;
|
||||
/* ip is correct. */
|
||||
goto no_change;
|
||||
}
|
||||
break;
|
||||
case 0xea: /* jmp absolute -- rip is correct */
|
||||
next_rip = regs->rip;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
regs->eflags &= ~TF_MASK;
|
||||
if (next_rip) {
|
||||
regs->rip = next_rip;
|
||||
} else {
|
||||
regs->rip = orig_rip + (regs->rip - copy_rip);
|
||||
}
|
||||
regs->rip = orig_rip + (regs->rip - copy_rip);
|
||||
no_change:
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
int __kprobes post_kprobe_handler(struct pt_regs *regs)
|
||||
@ -716,10 +711,8 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
|
||||
struct jprobe *jp = container_of(p, struct jprobe, kp);
|
||||
|
||||
if ((addr > (u8 *) jprobe_return) && (addr < (u8 *) jprobe_return_end)) {
|
||||
if ((long *)regs->rsp != kcb->jprobe_saved_rsp) {
|
||||
struct pt_regs *saved_regs =
|
||||
container_of(kcb->jprobe_saved_rsp,
|
||||
struct pt_regs, rsp);
|
||||
if ((unsigned long *)regs->rsp != kcb->jprobe_saved_rsp) {
|
||||
struct pt_regs *saved_regs = &kcb->jprobe_saved_regs;
|
||||
printk("current rsp %p does not match saved rsp %p\n",
|
||||
(long *)regs->rsp, kcb->jprobe_saved_rsp);
|
||||
printk("Saved registers for jprobe %p\n", jp);
|
||||
|
@ -261,7 +261,7 @@ static void mwait_idle(void)
|
||||
mwait_idle_with_hints(0, 0);
|
||||
}
|
||||
|
||||
void __devinit select_idle_routine(const struct cpuinfo_x86 *c)
|
||||
void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
|
||||
{
|
||||
if (cpu_has(c, X86_FEATURE_MWAIT)) {
|
||||
printk("monitor/mwait feature present.\n");
|
||||
|
@ -67,7 +67,7 @@
|
||||
address, and must not be in the .bss segment! */
|
||||
unsigned long init_pg_tables_end __initdata = ~0UL;
|
||||
|
||||
int disable_pse __devinitdata = 0;
|
||||
int disable_pse __cpuinitdata = 0;
|
||||
|
||||
/*
|
||||
* Machine setup..
|
||||
|
@ -60,7 +60,7 @@
|
||||
#include <asm/mtrr.h>
|
||||
|
||||
/* Set if we find a B stepping CPU */
|
||||
static int __devinitdata smp_b_stepping;
|
||||
static int __cpuinitdata smp_b_stepping;
|
||||
|
||||
/* Number of siblings per CPU package */
|
||||
int smp_num_siblings = 1;
|
||||
@ -745,8 +745,8 @@ static inline int alloc_cpu_id(void)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static struct task_struct * __devinitdata cpu_idle_tasks[NR_CPUS];
|
||||
static inline struct task_struct * alloc_idle_task(int cpu)
|
||||
static struct task_struct * __cpuinitdata cpu_idle_tasks[NR_CPUS];
|
||||
static inline struct task_struct * __cpuinit alloc_idle_task(int cpu)
|
||||
{
|
||||
struct task_struct *idle;
|
||||
|
||||
|
@ -141,8 +141,8 @@ static void __cpuinit smp_store_cpu_info(int id)
|
||||
struct cpuinfo_x86 *c = &cpu_data(id);
|
||||
|
||||
*c = boot_cpu_data;
|
||||
c->cpu_index = id;
|
||||
identify_cpu(c);
|
||||
c->cpu_index = id;
|
||||
print_cpu_info(c);
|
||||
}
|
||||
|
||||
|
@ -192,42 +192,25 @@ static int res_phys_pud_init(pud_t *pud, unsigned long address, unsigned long en
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int res_kernel_text_pud_init(pud_t *pud, unsigned long start)
|
||||
{
|
||||
pmd_t *pmd;
|
||||
unsigned long paddr;
|
||||
|
||||
pmd = (pmd_t *)get_safe_page(GFP_ATOMIC);
|
||||
if (!pmd)
|
||||
return -ENOMEM;
|
||||
set_pud(pud + pud_index(start), __pud(__pa(pmd) | _KERNPG_TABLE));
|
||||
for (paddr = 0; paddr < KERNEL_TEXT_SIZE; pmd++, paddr += PMD_SIZE) {
|
||||
unsigned long pe;
|
||||
|
||||
pe = __PAGE_KERNEL_LARGE_EXEC | _PAGE_GLOBAL | paddr;
|
||||
pe &= __supported_pte_mask;
|
||||
set_pmd(pmd, __pmd(pe));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_up_temporary_mappings(void)
|
||||
{
|
||||
unsigned long start, end, next;
|
||||
pud_t *pud;
|
||||
int error;
|
||||
|
||||
temp_level4_pgt = (pgd_t *)get_safe_page(GFP_ATOMIC);
|
||||
if (!temp_level4_pgt)
|
||||
return -ENOMEM;
|
||||
|
||||
/* It is safe to reuse the original kernel mapping */
|
||||
set_pgd(temp_level4_pgt + pgd_index(__START_KERNEL_map),
|
||||
init_level4_pgt[pgd_index(__START_KERNEL_map)]);
|
||||
|
||||
/* Set up the direct mapping from scratch */
|
||||
start = (unsigned long)pfn_to_kaddr(0);
|
||||
end = (unsigned long)pfn_to_kaddr(end_pfn);
|
||||
|
||||
for (; start < end; start = next) {
|
||||
pud = (pud_t *)get_safe_page(GFP_ATOMIC);
|
||||
pud_t *pud = (pud_t *)get_safe_page(GFP_ATOMIC);
|
||||
if (!pud)
|
||||
return -ENOMEM;
|
||||
next = start + PGDIR_SIZE;
|
||||
@ -238,17 +221,7 @@ static int set_up_temporary_mappings(void)
|
||||
set_pgd(temp_level4_pgt + pgd_index(start),
|
||||
mk_kernel_pgd(__pa(pud)));
|
||||
}
|
||||
|
||||
/* Set up the kernel text mapping from scratch */
|
||||
pud = (pud_t *)get_safe_page(GFP_ATOMIC);
|
||||
if (!pud)
|
||||
return -ENOMEM;
|
||||
error = res_kernel_text_pud_init(pud, __START_KERNEL_map);
|
||||
if (!error)
|
||||
set_pgd(temp_level4_pgt + pgd_index(__START_KERNEL_map),
|
||||
__pgd(__pa(pud) | _PAGE_TABLE));
|
||||
|
||||
return error;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int swsusp_arch_resume(void)
|
||||
|
@ -373,14 +373,13 @@ void die(const char * str, struct pt_regs * regs, long err)
|
||||
|
||||
if (die.lock_owner != raw_smp_processor_id()) {
|
||||
console_verbose();
|
||||
raw_local_irq_save(flags);
|
||||
__raw_spin_lock(&die.lock);
|
||||
raw_local_save_flags(flags);
|
||||
die.lock_owner = smp_processor_id();
|
||||
die.lock_owner_depth = 0;
|
||||
bust_spinlocks(1);
|
||||
}
|
||||
else
|
||||
raw_local_save_flags(flags);
|
||||
} else
|
||||
raw_local_irq_save(flags);
|
||||
|
||||
if (++die.lock_owner_depth < 3) {
|
||||
unsigned long esp;
|
||||
|
@ -1,6 +1,6 @@
|
||||
/**
|
||||
* @file op_model_athlon.h
|
||||
* athlon / K7 model-specific MSR operations
|
||||
* athlon / K7 / K8 / Family 10h model-specific MSR operations
|
||||
*
|
||||
* @remark Copyright 2002 OProfile authors
|
||||
* @remark Read the file COPYING
|
||||
@ -31,12 +31,16 @@
|
||||
#define CTRL_WRITE(l,h,msrs,c) do {wrmsr(msrs->controls[(c)].addr, (l), (h));} while (0)
|
||||
#define CTRL_SET_ACTIVE(n) (n |= (1<<22))
|
||||
#define CTRL_SET_INACTIVE(n) (n &= ~(1<<22))
|
||||
#define CTRL_CLEAR(x) (x &= (1<<21))
|
||||
#define CTRL_CLEAR_LO(x) (x &= (1<<21))
|
||||
#define CTRL_CLEAR_HI(x) (x &= 0xfffffcf0)
|
||||
#define CTRL_SET_ENABLE(val) (val |= 1<<20)
|
||||
#define CTRL_SET_USR(val,u) (val |= ((u & 1) << 16))
|
||||
#define CTRL_SET_KERN(val,k) (val |= ((k & 1) << 17))
|
||||
#define CTRL_SET_UM(val, m) (val |= (m << 8))
|
||||
#define CTRL_SET_EVENT(val, e) (val |= e)
|
||||
#define CTRL_SET_EVENT_LOW(val, e) (val |= (e & 0xff))
|
||||
#define CTRL_SET_EVENT_HIGH(val, e) (val |= ((e >> 8) & 0xf))
|
||||
#define CTRL_SET_HOST_ONLY(val, h) (val |= ((h & 1) << 9))
|
||||
#define CTRL_SET_GUEST_ONLY(val, h) (val |= ((h & 1) << 8))
|
||||
|
||||
static unsigned long reset_value[NUM_COUNTERS];
|
||||
|
||||
@ -70,7 +74,8 @@ static void athlon_setup_ctrs(struct op_msrs const * const msrs)
|
||||
if (unlikely(!CTRL_IS_RESERVED(msrs,i)))
|
||||
continue;
|
||||
CTRL_READ(low, high, msrs, i);
|
||||
CTRL_CLEAR(low);
|
||||
CTRL_CLEAR_LO(low);
|
||||
CTRL_CLEAR_HI(high);
|
||||
CTRL_WRITE(low, high, msrs, i);
|
||||
}
|
||||
|
||||
@ -89,12 +94,17 @@ static void athlon_setup_ctrs(struct op_msrs const * const msrs)
|
||||
CTR_WRITE(counter_config[i].count, msrs, i);
|
||||
|
||||
CTRL_READ(low, high, msrs, i);
|
||||
CTRL_CLEAR(low);
|
||||
CTRL_CLEAR_LO(low);
|
||||
CTRL_CLEAR_HI(high);
|
||||
CTRL_SET_ENABLE(low);
|
||||
CTRL_SET_USR(low, counter_config[i].user);
|
||||
CTRL_SET_KERN(low, counter_config[i].kernel);
|
||||
CTRL_SET_UM(low, counter_config[i].unit_mask);
|
||||
CTRL_SET_EVENT(low, counter_config[i].event);
|
||||
CTRL_SET_EVENT_LOW(low, counter_config[i].event);
|
||||
CTRL_SET_EVENT_HIGH(high, counter_config[i].event);
|
||||
CTRL_SET_HOST_ONLY(high, 0);
|
||||
CTRL_SET_GUEST_ONLY(high, 0);
|
||||
|
||||
CTRL_WRITE(low, high, msrs, i);
|
||||
} else {
|
||||
reset_value[i] = 0;
|
||||
|
@ -1131,7 +1131,7 @@ asmlinkage void __init xen_start_kernel(void)
|
||||
if (!xen_start_info)
|
||||
return;
|
||||
|
||||
BUG_ON(memcmp(xen_start_info->magic, "xen-3.0", 7) != 0);
|
||||
BUG_ON(memcmp(xen_start_info->magic, "xen-3", 5) != 0);
|
||||
|
||||
/* Install Xen paravirt ops */
|
||||
pv_info = xen_info;
|
||||
|
@ -393,11 +393,11 @@ static int iss_net_rx(struct net_device *dev)
|
||||
if (pkt_len > 0) {
|
||||
skb_trim(skb, pkt_len);
|
||||
skb->protocol = lp->tp.protocol(skb);
|
||||
// netif_rx(skb);
|
||||
netif_rx_ni(skb);
|
||||
|
||||
lp->stats.rx_bytes += skb->len;
|
||||
lp->stats.rx_packets++;
|
||||
// netif_rx(skb);
|
||||
netif_rx_ni(skb);
|
||||
return pkt_len;
|
||||
}
|
||||
kfree_skb(skb);
|
||||
|
@ -880,7 +880,7 @@ static void as_remove_queued_request(struct request_queue *q,
|
||||
}
|
||||
|
||||
/*
|
||||
* as_fifo_expired returns 0 if there are no expired reads on the fifo,
|
||||
* as_fifo_expired returns 0 if there are no expired requests on the fifo,
|
||||
* 1 otherwise. It is ratelimited so that we only perform the check once per
|
||||
* `fifo_expire' interval. Otherwise a large number of expired requests
|
||||
* would create a hopeless seekstorm.
|
||||
@ -1097,7 +1097,8 @@ dispatch_writes:
|
||||
ad->batch_data_dir = REQ_ASYNC;
|
||||
ad->current_write_count = ad->write_batch_count;
|
||||
ad->write_batch_idled = 0;
|
||||
rq = ad->next_rq[ad->batch_data_dir];
|
||||
rq = rq_entry_fifo(ad->fifo_list[REQ_ASYNC].next);
|
||||
ad->last_check_fifo[REQ_ASYNC] = jiffies;
|
||||
goto dispatch_request;
|
||||
}
|
||||
|
||||
@ -1159,7 +1160,7 @@ static void as_add_request(struct request_queue *q, struct request *rq)
|
||||
as_add_rq_rb(ad, rq);
|
||||
|
||||
/*
|
||||
* set expire time (only used for reads) and add to fifo list
|
||||
* set expire time and add to fifo list
|
||||
*/
|
||||
rq_set_fifo_time(rq, jiffies + ad->fifo_expire[data_dir]);
|
||||
list_add_tail(&rq->queuelist, &ad->fifo_list[data_dir]);
|
||||
@ -1463,7 +1464,9 @@ static struct elevator_type iosched_as = {
|
||||
|
||||
static int __init as_init(void)
|
||||
{
|
||||
return elv_register(&iosched_as);
|
||||
elv_register(&iosched_as);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit as_exit(void)
|
||||
|
@ -2279,8 +2279,6 @@ static struct elevator_type iosched_cfq = {
|
||||
|
||||
static int __init cfq_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* could be 0 on HZ < 1000 setups
|
||||
*/
|
||||
@ -2292,11 +2290,9 @@ static int __init cfq_init(void)
|
||||
if (cfq_slab_setup())
|
||||
return -ENOMEM;
|
||||
|
||||
ret = elv_register(&iosched_cfq);
|
||||
if (ret)
|
||||
cfq_slab_kill();
|
||||
elv_register(&iosched_cfq);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit cfq_exit(void)
|
||||
|
@ -467,7 +467,9 @@ static struct elevator_type iosched_deadline = {
|
||||
|
||||
static int __init deadline_init(void)
|
||||
{
|
||||
return elv_register(&iosched_deadline);
|
||||
elv_register(&iosched_deadline);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit deadline_exit(void)
|
||||
|
@ -960,7 +960,7 @@ void elv_unregister_queue(struct request_queue *q)
|
||||
__elv_unregister_queue(q->elevator);
|
||||
}
|
||||
|
||||
int elv_register(struct elevator_type *e)
|
||||
void elv_register(struct elevator_type *e)
|
||||
{
|
||||
char *def = "";
|
||||
|
||||
@ -975,7 +975,6 @@ int elv_register(struct elevator_type *e)
|
||||
def = " (default)";
|
||||
|
||||
printk(KERN_INFO "io scheduler %s registered%s\n", e->elevator_name, def);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(elv_register);
|
||||
|
||||
|
@ -101,7 +101,9 @@ static struct elevator_type elevator_noop = {
|
||||
|
||||
static int __init noop_init(void)
|
||||
{
|
||||
return elv_register(&elevator_noop);
|
||||
elv_register(&elevator_noop);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit noop_exit(void)
|
||||
|
@ -230,7 +230,7 @@ static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq,
|
||||
rq->cmd_len = hdr->cmd_len;
|
||||
rq->cmd_type = REQ_TYPE_BLOCK_PC;
|
||||
|
||||
rq->timeout = (hdr->timeout * HZ) / 1000;
|
||||
rq->timeout = msecs_to_jiffies(hdr->timeout);
|
||||
if (!rq->timeout)
|
||||
rq->timeout = q->sg_timeout;
|
||||
if (!rq->timeout)
|
||||
@ -366,7 +366,7 @@ static int sg_io(struct file *file, struct request_queue *q,
|
||||
*/
|
||||
blk_execute_rq(q, bd_disk, rq, 0);
|
||||
|
||||
hdr->duration = ((jiffies - start_time) * 1000) / HZ;
|
||||
hdr->duration = jiffies_to_msecs(jiffies - start_time);
|
||||
|
||||
return blk_complete_sghdr_rq(rq, hdr, bio);
|
||||
out:
|
||||
|
@ -125,7 +125,7 @@ static int acpi_battery_technology(struct acpi_battery *battery)
|
||||
return POWER_SUPPLY_TECHNOLOGY_NiMH;
|
||||
if (!strcasecmp("LION", battery->type))
|
||||
return POWER_SUPPLY_TECHNOLOGY_LION;
|
||||
if (!strcasecmp("LI-ION", battery->type))
|
||||
if (!strncasecmp("LI-ION", battery->type, 6))
|
||||
return POWER_SUPPLY_TECHNOLOGY_LION;
|
||||
if (!strcasecmp("LiP", battery->type))
|
||||
return POWER_SUPPLY_TECHNOLOGY_LIPO;
|
||||
|
@ -38,9 +38,9 @@ ACPI_MODULE_NAME("numa");
|
||||
static nodemask_t nodes_found_map = NODE_MASK_NONE;
|
||||
|
||||
/* maps to convert between proximity domain and logical node ID */
|
||||
static int __cpuinitdata pxm_to_node_map[MAX_PXM_DOMAINS]
|
||||
static int pxm_to_node_map[MAX_PXM_DOMAINS]
|
||||
= { [0 ... MAX_PXM_DOMAINS - 1] = NID_INVAL };
|
||||
static int __cpuinitdata node_to_pxm_map[MAX_NUMNODES]
|
||||
static int node_to_pxm_map[MAX_NUMNODES]
|
||||
= { [0 ... MAX_NUMNODES - 1] = PXM_INVAL };
|
||||
|
||||
int pxm_to_node(int pxm)
|
||||
|
@ -294,9 +294,6 @@ int acpi_pci_unbind(struct acpi_device *device)
|
||||
acpi_get_data(device->handle, acpi_pci_data_handler,
|
||||
(void **)&data);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Unable to get data from device %s",
|
||||
acpi_device_bid(device)));
|
||||
result = -ENODEV;
|
||||
goto end;
|
||||
}
|
||||
|
@ -54,12 +54,6 @@
|
||||
#define ACPI_BATTERY_DIR_NAME "BAT%i"
|
||||
#define ACPI_AC_DIR_NAME "AC0"
|
||||
|
||||
enum acpi_sbs_device_addr {
|
||||
ACPI_SBS_CHARGER = 0x9,
|
||||
ACPI_SBS_MANAGER = 0xa,
|
||||
ACPI_SBS_BATTERY = 0xb,
|
||||
};
|
||||
|
||||
#define ACPI_SBS_NOTIFY_STATUS 0x80
|
||||
#define ACPI_SBS_NOTIFY_INFO 0x81
|
||||
|
||||
@ -539,7 +533,7 @@ static struct proc_dir_entry *acpi_battery_dir = NULL;
|
||||
|
||||
static inline char *acpi_battery_units(struct acpi_battery *battery)
|
||||
{
|
||||
return acpi_battery_mode(battery) ? " mWh" : " mAh";
|
||||
return acpi_battery_mode(battery) ? " mW" : " mA";
|
||||
}
|
||||
|
||||
|
||||
@ -556,10 +550,10 @@ static int acpi_battery_read_info(struct seq_file *seq, void *offset)
|
||||
if (!battery->present)
|
||||
goto end;
|
||||
|
||||
seq_printf(seq, "design capacity: %i%s\n",
|
||||
seq_printf(seq, "design capacity: %i%sh\n",
|
||||
battery->design_capacity * acpi_battery_scale(battery),
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "last full capacity: %i%s\n",
|
||||
seq_printf(seq, "last full capacity: %i%sh\n",
|
||||
battery->full_charge_capacity * acpi_battery_scale(battery),
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "battery technology: rechargeable\n");
|
||||
@ -590,7 +584,7 @@ static int acpi_battery_read_state(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_battery *battery = seq->private;
|
||||
struct acpi_sbs *sbs = battery->sbs;
|
||||
int result = 0;
|
||||
int rate;
|
||||
|
||||
mutex_lock(&sbs->lock);
|
||||
seq_printf(seq, "present: %s\n",
|
||||
@ -604,9 +598,12 @@ static int acpi_battery_read_state(struct seq_file *seq, void *offset)
|
||||
seq_printf(seq, "charging state: %s\n",
|
||||
(battery->current_now < 0) ? "discharging" :
|
||||
((battery->current_now > 0) ? "charging" : "charged"));
|
||||
seq_printf(seq, "present rate: %d mA\n",
|
||||
abs(battery->current_now) * acpi_battery_ipscale(battery));
|
||||
seq_printf(seq, "remaining capacity: %i%s\n",
|
||||
rate = abs(battery->current_now) * acpi_battery_ipscale(battery);
|
||||
rate *= (acpi_battery_mode(battery))?(battery->voltage_now *
|
||||
acpi_battery_vscale(battery)/1000):1;
|
||||
seq_printf(seq, "present rate: %d%s\n", rate,
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "remaining capacity: %i%sh\n",
|
||||
battery->capacity_now * acpi_battery_scale(battery),
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "present voltage: %i mV\n",
|
||||
@ -614,7 +611,7 @@ static int acpi_battery_read_state(struct seq_file *seq, void *offset)
|
||||
|
||||
end:
|
||||
mutex_unlock(&sbs->lock);
|
||||
return result;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_battery_state_open_fs(struct inode *inode, struct file *file)
|
||||
@ -638,7 +635,7 @@ static int acpi_battery_read_alarm(struct seq_file *seq, void *offset)
|
||||
acpi_battery_get_alarm(battery);
|
||||
seq_printf(seq, "alarm: ");
|
||||
if (battery->alarm_capacity)
|
||||
seq_printf(seq, "%i%s\n",
|
||||
seq_printf(seq, "%i%sh\n",
|
||||
battery->alarm_capacity *
|
||||
acpi_battery_scale(battery),
|
||||
acpi_battery_units(battery));
|
||||
|
@ -202,10 +202,9 @@ int acpi_smbus_unregister_callback(struct acpi_smb_hc *hc)
|
||||
|
||||
EXPORT_SYMBOL_GPL(acpi_smbus_unregister_callback);
|
||||
|
||||
static void acpi_smbus_callback(void *context)
|
||||
static inline void acpi_smbus_callback(void *context)
|
||||
{
|
||||
struct acpi_smb_hc *hc = context;
|
||||
|
||||
if (hc->callback)
|
||||
hc->callback(hc->context);
|
||||
}
|
||||
@ -214,6 +213,7 @@ static int smbus_alarm(void *context)
|
||||
{
|
||||
struct acpi_smb_hc *hc = context;
|
||||
union acpi_smb_status status;
|
||||
u8 address;
|
||||
if (smb_hc_read(hc, ACPI_SMB_STATUS, &status.raw))
|
||||
return 0;
|
||||
/* Check if it is only a completion notify */
|
||||
@ -222,9 +222,18 @@ static int smbus_alarm(void *context)
|
||||
if (!status.fields.alarm)
|
||||
return 0;
|
||||
mutex_lock(&hc->lock);
|
||||
smb_hc_read(hc, ACPI_SMB_ALARM_ADDRESS, &address);
|
||||
status.fields.alarm = 0;
|
||||
smb_hc_write(hc, ACPI_SMB_STATUS, status.raw);
|
||||
if (hc->callback)
|
||||
acpi_os_execute(OSL_GPE_HANDLER, acpi_smbus_callback, hc);
|
||||
/* We are only interested in events coming from known devices */
|
||||
switch (address >> 1) {
|
||||
case ACPI_SBS_CHARGER:
|
||||
case ACPI_SBS_MANAGER:
|
||||
case ACPI_SBS_BATTERY:
|
||||
acpi_os_execute(OSL_GPE_HANDLER,
|
||||
acpi_smbus_callback, hc);
|
||||
default:;
|
||||
}
|
||||
mutex_unlock(&hc->lock);
|
||||
return 0;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user