[haiku-commits] BRANCH xyzzy-github.x86_64 - src/servers/debug src/system/kernel/arch/x86/64 build/jam

  • From: xyzzy-github.x86_64 <community@xxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 9 Aug 2012 10:49:12 +0200 (CEST)

added 1 changeset to branch 'refs/remotes/xyzzy-github/x86_64'
old head: a5e96a301e09c1c01d44450220f41911602520e8
new head: f3e4f18be78e46d70a1883f750265a03f4fe0574

----------------------------------------------------------------------------

f3e4f18: Debugging fixes.
  
  * INT3 had the wrong DPL set in the IDT, could not be raised from
    userland.
  * Need the debug server running.

                                      [ Alex Smith <alex@xxxxxxxxxxxxxxxx> ]

----------------------------------------------------------------------------

Commit:      f3e4f18be78e46d70a1883f750265a03f4fe0574

Author:      Alex Smith <alex@xxxxxxxxxxxxxxxx>
Date:        Thu Aug  9 08:17:04 2012 UTC

----------------------------------------------------------------------------

3 files changed, 38 insertions(+), 33 deletions(-)
build/jam/Haiku64Image                |    2 +-
src/servers/debug/DebugServer.cpp     |   64 +++++++++++++++--------------
src/system/kernel/arch/x86/64/int.cpp |    5 ++-

----------------------------------------------------------------------------

diff --git a/build/jam/Haiku64Image b/build/jam/Haiku64Image
index 506454c..dce304a 100644
--- a/build/jam/Haiku64Image
+++ b/build/jam/Haiku64Image
@@ -49,7 +49,7 @@ SYSTEM_LIBS = libbe.so libbnetapi.so libdebug.so libnetwork.so
 
 PRIVATE_SYSTEM_LIBS = ;
 
-SYSTEM_SERVERS = app_server input_server registrar syslog_daemon ;
+SYSTEM_SERVERS = app_server debug_server input_server registrar syslog_daemon ;
 
 SYSTEM_ADD_ONS_ACCELERANTS = vesa.accelerant ;
 
diff --git a/src/servers/debug/DebugServer.cpp 
b/src/servers/debug/DebugServer.cpp
index 26c1a78..fe795b5 100644
--- a/src/servers/debug/DebugServer.cpp
+++ b/src/servers/debug/DebugServer.cpp
@@ -67,14 +67,15 @@ KillTeam(team_id team, const char *appName = NULL)
                status_t error = get_team_info(team, &info);
                if (error != B_OK) {
                        debug_printf("debug_server: KillTeam(): Error getting 
info for "
-                               "team %ld: %s\n", team, strerror(error));
+                               "team %" B_PRId32 ": %s\n", team, 
strerror(error));
                        info.args[0] = '\0';
                }
 
                appName = info.args;
        }
 
-       debug_printf("debug_server: Killing team %ld (%s)\n", team, appName);
+       debug_printf("debug_server: Killing team %" B_PRId32 " (%s)\n", team,
+               appName);
 
        kill_team(team);
 }
@@ -341,7 +342,7 @@ TeamDebugHandler::Init(port_id nubPort)
        status_t error = get_team_info(fTeam, &fTeamInfo);
        if (error != B_OK) {
                debug_printf("debug_server: TeamDebugHandler::Init(): Failed to 
get "
-                       "info for team %ld: %s\n", fTeam, strerror(error));
+                       "info for team %" B_PRId32 ": %s\n", fTeam, 
strerror(error));
                return error;
        }
 
@@ -349,7 +350,8 @@ TeamDebugHandler::Init(port_id nubPort)
        error = BPrivate::get_app_path(fTeam, fExecutablePath);
        if (error != B_OK) {
                debug_printf("debug_server: TeamDebugHandler::Init(): Failed to 
get "
-                       "executable path of team %ld: %s\n", fTeam, 
strerror(error));
+                       "executable path of team %" B_PRId32 ": %s\n", fTeam,
+                       strerror(error));
 
                fExecutablePath[0] = '\0';
        }
@@ -358,8 +360,8 @@ TeamDebugHandler::Init(port_id nubPort)
        error = init_debug_context(&fDebugContext, fTeam, nubPort);
        if (error != B_OK) {
                debug_printf("debug_server: TeamDebugHandler::Init(): Failed to 
init "
-                       "debug context for team %ld, port %ld: %s\n", fTeam, 
nubPort,
-                       strerror(error));
+                       "debug context for team %" B_PRId32 ", port %" B_PRId32 
": %s\n",
+                       fTeam, nubPort, strerror(error));
                return error;
        }
 
@@ -372,7 +374,7 @@ TeamDebugHandler::Init(port_id nubPort)
 
        // create the message count semaphore
        char name[B_OS_NAME_LENGTH];
-       snprintf(name, sizeof(name), "team %ld message count", fTeam);
+       snprintf(name, sizeof(name), "team %" B_PRId32 " message count", fTeam);
        fMessageCountSem = create_sem(0, name);
        if (fMessageCountSem < 0) {
                debug_printf("debug_server: TeamDebugHandler::Init(): Failed to 
create "
@@ -381,7 +383,7 @@ TeamDebugHandler::Init(port_id nubPort)
        }
 
        // spawn the handler thread
-       snprintf(name, sizeof(name), "team %ld handler", fTeam);
+       snprintf(name, sizeof(name), "team %" B_PRId32 " handler", fTeam);
        fHandlerThread = spawn_thread(&_HandlerThreadEntry, name, 
B_NORMAL_PRIORITY,
                this);
        if (fHandlerThread < 0) {
@@ -442,7 +444,7 @@ TeamDebugHandler::_SetupGDBArguments(BStringList 
&arguments, bool usingConsoled)
 {
        // prepare the argument vector
        BString teamString;
-       teamString.SetToFormat("--pid=%ld", fTeam);
+       teamString.SetToFormat("--pid=%" B_PRId32, fTeam);
 
        status_t error;
        BPath terminalPath;
@@ -480,7 +482,7 @@ TeamDebugHandler::_SetupGDBArguments(BStringList 
&arguments, bool usingConsoled)
 
        if (!usingConsoled) {
                BString windowTitle;
-               windowTitle.SetToFormat("Debug of Team %ld: %s", fTeam,
+               windowTitle.SetToFormat("Debug of Team %" B_PRId32 ": %s", 
fTeam,
                        _LastPathComponent(fExecutablePath));
                if (!arguments.Add("-t") || !arguments.Add(windowTitle))
                        return B_NO_MEMORY;
@@ -512,12 +514,12 @@ TeamDebugHandler::_SetupGDBArguments(BStringList 
&arguments, bool usingConsoled)
 thread_id
 TeamDebugHandler::_EnterDebugger()
 {
-       TRACE(("debug_server: TeamDebugHandler::_EnterDebugger(): team %ld\n",
-               fTeam));
+       TRACE(("debug_server: TeamDebugHandler::_EnterDebugger(): team %" 
B_PRId32
+               "\n", fTeam));
 
        // prepare a debugger handover
        TRACE(("debug_server: TeamDebugHandler::_EnterDebugger(): preparing "
-               "debugger handover for team %ld...\n", fTeam));
+               "debugger handover for team %" B_PRId32 "...\n", fTeam));
 
        status_t error = send_debug_message(&fDebugContext,
                B_DEBUG_MESSAGE_PREPARE_HANDOVER, NULL, 0, NULL, 0);
@@ -543,7 +545,7 @@ TeamDebugHandler::_EnterDebugger()
 
        // start the terminal
        TRACE(("debug_server: TeamDebugHandler::_EnterDebugger(): starting  "
-               "terminal (debugger) for team %ld...\n", fTeam));
+               "terminal (debugger) for team %" B_PRId32 "...\n", fTeam));
 
 #elif defined(HANDOVER_USE_DEBUGGER)
        if (debugInConsoled) {
@@ -572,13 +574,13 @@ TeamDebugHandler::_EnterDebugger()
                        return B_NO_MEMORY;
 
                BString debuggerParam;
-               debuggerParam.SetToFormat("%ld", fTeam);
+               debuggerParam.SetToFormat("%" B_PRId32, fTeam);
                if (!arguments.Add("--team") || !arguments.Add(debuggerParam))
                        return B_NO_MEMORY;
 
                // start the debugger
                TRACE(("debug_server: TeamDebugHandler::_EnterDebugger(): 
starting  "
-                       "graphical debugger for team %ld...\n", fTeam));
+                       "graphical debugger for team %" B_PRId32 "...\n", 
fTeam));
        }
 #endif
 
@@ -595,7 +597,7 @@ TeamDebugHandler::_EnterDebugger()
        resume_thread(thread);
 
        TRACE(("debug_server: TeamDebugHandler::_EnterDebugger(): debugger 
started "
-               "for team %ld: thread: %ld\n", fTeam, thread));
+               "for team %" B_PRId32 ": thread: %" B_PRId32 "\n", fTeam, 
thread));
 
        return thread;
 }
@@ -615,8 +617,8 @@ TeamDebugHandler::_HandleMessage(DebugMessage *message)
        // a team. That means only a few messages are actually possible, while
        // others wouldn't trigger the debugger in the first place. So we deal 
with
        // all of them the same way, by popping up an alert.
-       TRACE(("debug_server: TeamDebugHandler::_HandleMessage(): team %ld, 
code: "
-               "%ld\n", fTeam, (int32)message->Code()));
+       TRACE(("debug_server: TeamDebugHandler::_HandleMessage(): team %" 
B_PRId32
+               ", code: %" B_PRId32 "\n", fTeam, (int32)message->Code()));
 
        thread_id thread = message->Data().origin.thread;
 
@@ -626,8 +628,8 @@ TeamDebugHandler::_HandleMessage(DebugMessage *message)
                case B_DEBUGGER_MESSAGE_TEAM_DELETED:
                        // This shouldn't happen.
                        debug_printf("debug_server: Got a spurious "
-                               "B_DEBUGGER_MESSAGE_TEAM_DELETED message for 
team %ld\n",
-                               fTeam);
+                               "B_DEBUGGER_MESSAGE_TEAM_DELETED message for 
team %" B_PRId32
+                               "\n", fTeam);
                        return true;
 
                case B_DEBUGGER_MESSAGE_EXCEPTION_OCCURRED:
@@ -662,8 +664,8 @@ TeamDebugHandler::_HandleMessage(DebugMessage *message)
                        break;
        }
 
-       debug_printf("debug_server: Thread %ld entered the debugger: %s\n", 
thread,
-               buffer);
+       debug_printf("debug_server: Thread %" B_PRId32 " entered the debugger: 
%s\n",
+               thread, buffer);
 
        _PrintStackTrace(thread);
 
@@ -847,12 +849,12 @@ TeamDebugHandler::_HandlerThreadEntry(void *data)
 status_t
 TeamDebugHandler::_HandlerThread()
 {
-       TRACE(("debug_server: TeamDebugHandler::_HandlerThread(): team %ld\n",
-               fTeam));
+       TRACE(("debug_server: TeamDebugHandler::_HandlerThread(): team %" 
B_PRId32
+               "\n", fTeam));
 
        // get initial message
-       TRACE(("debug_server: TeamDebugHandler::_HandlerThread(): team %ld: "
-               "getting message...\n", fTeam));
+       TRACE(("debug_server: TeamDebugHandler::_HandlerThread(): team %" 
B_PRId32
+               ": getting message...\n", fTeam));
 
        DebugMessage *message;
        status_t error = _PopMessage(message);
@@ -902,8 +904,8 @@ TeamDebugHandler::_HandlerThread()
                                thread_info threadInfo;
                                if (get_thread_info(debuggerThread, 
&threadInfo) != B_OK) {
                                        // the debugger is gone
-                                       debug_printf("debug_server: The 
debugger for team %ld "
-                                               "seems to be gone.", fTeam);
+                                       debug_printf("debug_server: The 
debugger for team %"
+                                               B_PRId32 " seems to be gone.", 
fTeam);
 
                                        kill = true;
                                        terminate = true;
@@ -1088,8 +1090,8 @@ DebugServer::_Listener()
                                "%s. Terminating!\n", strerror(bytesRead));
                        exit(1);
                }
-TRACE(("debug_server: Got debug message: team: %ld, code: %ld\n",
-message->Data().origin.team, code));
+TRACE(("debug_server: Got debug message: team: %" B_PRId32 ", code: %" B_PRId32
+       "\n", message->Data().origin.team, code));
 
                message->SetCode((debug_debugger_message)code);
 
diff --git a/src/system/kernel/arch/x86/64/int.cpp 
b/src/system/kernel/arch/x86/64/int.cpp
index afffdf1..6f0ad29 100644
--- a/src/system/kernel/arch/x86/64/int.cpp
+++ b/src/system/kernel/arch/x86/64/int.cpp
@@ -59,8 +59,11 @@ arch_int_init(kernel_args* args)
                // fault stack address (this is set up in arch_cpu.cpp).
                uint32 ist = (i == 8) ? 1 : 0;
 
+               // Breakpoint exception can be raised from userland.
+               uint32 dpl = (i == 3) ? DPL_USER : DPL_KERNEL;
+
                set_interrupt_descriptor(&sIDT[i], (addr_t)&isr_array[i],
-                       GATE_INTERRUPT, KERNEL_CODE_SEG, DPL_KERNEL, ist);
+                       GATE_INTERRUPT, KERNEL_CODE_SEG, dpl, ist);
        }
 
        interrupt_handler_function** table = gInterruptHandlerTable;


Other related posts:

  • » [haiku-commits] BRANCH xyzzy-github.x86_64 - src/servers/debug src/system/kernel/arch/x86/64 build/jam - xyzzy-github . x86_64